C : shift di una matrice con i puntatori
Moderatore: Staff
Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
- Mercyful
- Linux 1.x

- Messaggi: 196
- Iscritto il: ven 25 lug 2008, 18:20
- Nome Cognome: Ilario Pittau
- Slackware: 13.0
- Kernel: 2.6.29.6-generic
- Desktop: xfce 4.6
- Località: Torino
C : shift di una matrice con i puntatori
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
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
- spudhead
- Linux 1.x

- Messaggi: 130
- Iscritto il: sab 17 dic 2005, 0:17
- Slackware: 12.2
- Kernel: 2.6.28.7
- Desktop: KDE 3.5.10
- Località: Ancona, Italy
Re: C : shift di una matrice con i puntatori
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...
dimmi se può andare!
voglio anche il parere degli altri!!!
ciao
giorgio
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;
}
voglio anche il parere degli altri!!!
ciao
giorgio
- ulisse89
- Packager

- Messaggi: 643
- Iscritto il: sab 17 gen 2009, 12:53
- Nome Cognome: Riccardo
- Slackware: 13.0
- Kernel: 2.6.29.6
- Desktop: Xfce
- Località: Bologna
Re: C : shift di una matrice con i puntatori
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.
Spero che tu abbia capito, perchè ho scritto un po' incasinato.
- Mercyful
- Linux 1.x

- Messaggi: 196
- Iscritto il: ven 25 lug 2008, 18:20
- Nome Cognome: Ilario Pittau
- Slackware: 13.0
- Kernel: 2.6.29.6-generic
- Desktop: xfce 4.6
- Località: Torino
Re: C : shift di una matrice con i puntatori
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):
Soluzione shift puntatori (matrice parzialmente dinamica)
Soluzione 1 -> 400 cicli e 400 assegnazioni di variabili
Soluzione 2 -> 4 cicli e 6 assegnazioni di variabili!
Grazie mille!
@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];
}
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 2 -> 4 cicli e 6 assegnazioni di variabili!
Grazie mille!
- ulisse89
- Packager

- Messaggi: 643
- Iscritto il: sab 17 gen 2009, 12:53
- Nome Cognome: Riccardo
- Slackware: 13.0
- Kernel: 2.6.29.6
- Desktop: Xfce
- Località: Bologna
Re: C : shift di una matrice con i puntatori
Quello che volevo dire, e che molto probabilmente non ho spiegato al meglio, era la tua soluzione 2. Comunque sono contento che hai risolto.
- robbybby
- Linux 4.x

- Messaggi: 1223
- Iscritto il: sab 16 dic 2006, 10:48
- Slackware: 13.1 / 64 bit
- Kernel: 3.3.x
- Desktop: KDE 4.4.5
- Località: Fra Trantor e Terminus
Re: C : shift di una matrice con i puntatori
Quando fai
allochi 5*100=500 char contigui.
Quindi quello che vuoi fare non si puo'.
Codice: Seleziona tutto
char m[5][100] Quindi quello che vuoi fare non si puo'.
- Mercyful
- Linux 1.x

- Messaggi: 196
- Iscritto il: ven 25 lug 2008, 18:20
- Nome Cognome: Ilario Pittau
- Slackware: 13.0
- Kernel: 2.6.29.6-generic
- Desktop: xfce 4.6
- Località: Torino
Re: C : shift di una matrice con i puntatori
Mi hanno già risposto, e abbiamo trovato la soluzione.
Grazie lo stesso.
Grazie lo stesso.