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
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.