Pagina 1 di 1

C : shift di una matrice con i puntatori

Inviato: mer 8 apr 2009, 0:02
da Mercyful
Salve,
oggi risolvendo un problema ad un mio amico mi è venuto questo dubbio e voglio chiedere a voi se la cosa è fattibile. Il problema è il seguente:
Ho una matrice allocata staticamente char m[5][100] (serve per contenere 5 stringhe di 100 caratteri). Ad un certo punto vorrei shiftare le righe della matrice verso su, ovvero far puntare la riga 0 alla riga 1 e cosi via, l'ultima con indice 4 invece puntare alla prima. (Dopo la riga 4 la dovrei sovrascrivere).
Volevo chiedere se è possibile farlo con i puntatori (spostando i puntatori) e non copiando i singoli caratteri.
Grazie

Re: C : shift di una matrice con i puntatori

Inviato: mer 8 apr 2009, 0:54
da spudhead
m è una variabile costante, non modificabile, quindi come hai detto tu dovresti copiare i valori. Così però perderesti tempo per grandi matrici e comunque ti servirebbe un array d'appoggio per copiare ogni riga temporaneamente... Quindi ho pensato che potresti creare un array di puntatori a char in cui ogni elemento punta alla riga desiderata ( char * v[5] ). Così facendo basta usare v per leggere e scrivere i dati come si vuole...
ti metto un pezzo di codice giusto per farti fapire cosa intendo...

Codice: Seleziona tutto

#include <stdio.h>

int main()
{
  char m[5][2] = {{1,2},{3,4},{5,6},{7,8},{9,0}};
  char * v[5] = { &m[1][0] , &m[2][0], &m[3][0], &m[4][0], &m[0][0]}; // questo lo si può implemetare in un for che shifta i puntatori

  int i=0, j=0;
  for(i=0;i<5;i++)
  {
    for(j=0;j<2;j++)
      printf("%2d", m[i][j]); // uso m, matrice "normale"
    printf("\n");
  }
  printf("\n");
  for(i=0;i<5;i++){
    for(j=0;j<2;j++)
      printf("%2d", v[i][j]); // uso v, matrice coi parametri shiftati
    printf("\n");
  }
  return 0;
}
dimmi se può andare!

voglio anche il parere degli altri!!!

ciao

giorgio

Re: C : shift di una matrice con i puntatori

Inviato: mer 8 apr 2009, 16:04
da ulisse89
Se mi ricordo bene. se hai una matrice 5X100 hai un puntatore a un array di 5 puntatori a stringhe di 100 caratteri. Per cui se ho capito la domanda, andrebbe bene spostare gli indirizzi nell'array di 5 elementi. In questo modo, cambi posizione ai puntatori a stringa nell'array a 5 elementi come vuoi.
Spero che tu abbia capito, perchè ho scritto un po' incasinato.

Re: C : shift di una matrice con i puntatori

Inviato: mer 8 apr 2009, 21:58
da Mercyful
Ciao,
@spudhead: grazie della risposta, mi hai tolto il dubbio che avevo, poi ho provato un attimo e sono riuscito a crearla.

Il codice che volevo scrivere in effetti non si può fare con le matrici allocate staticamente, ma serve per forza un vettore di puntatori.

@ulisse89: era quello che non volevo sentire, infatti quello che dici (sempre se ho capito bene quello che itendevi) da quanto ho capito da questa lezione è che non si possono spostare i puntatori di una matrice allocata staticamente.
Quindi o si usa una matrice d'appoggio come l'esempio di spudhead oppure la si alloca dinamicamente almeno in parte.

Il codice per fare quello che volevo è il seguente, propongo le 2 soluzioni, cosi si può notare anche la differenza di peso computazionale.
Soluzione copia incolla (matrice statica):

Codice: Seleziona tutto

void shift_matrix(char matrix[][LEN_RIGA])
{
	int r,c;

	for(r = 0 ; r < N-1;  r++)                       //l'ultima riga non la copio, la devo sovrascrivere
		for(c = 0 ; c < 100 ; c++)
				matrix[r][c] = matrix[r+1][c];
}
Soluzione shift puntatori (matrice parzialmente dinamica)

Codice: Seleziona tutto

void shift_matrix(char *matrix[N])
{
	int r;
	char *temp;

	temp = matrix[0];

	for(r = 0 ; r < N-1;  r++)
		matrix[r] = matrix[r+1];

	matrix[r] = temp;
}
Soluzione 1 -> 400 cicli e 400 assegnazioni di variabili
Soluzione 2 -> 4 cicli e 6 assegnazioni di variabili!

Grazie mille!

Re: C : shift di una matrice con i puntatori

Inviato: gio 9 apr 2009, 0:38
da ulisse89
Quello che volevo dire, e che molto probabilmente non ho spiegato al meglio, era la tua soluzione 2. Comunque sono contento che hai risolto.

Re: C : shift di una matrice con i puntatori

Inviato: gio 9 apr 2009, 9:14
da robbybby
Quando fai

Codice: Seleziona tutto

char m[5][100] 
allochi 5*100=500 char contigui.
Quindi quello che vuoi fare non si puo'.

Re: C : shift di una matrice con i puntatori

Inviato: gio 9 apr 2009, 11:00
da Mercyful
Mi hanno già risposto, e abbiamo trovato la soluzione.
Grazie lo stesso.