Repository 32bit  Forum
Repository 64bit  Wiki

C : shift di una matrice con i puntatori

Forum dedicato alla programmazione.

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.

C : shift di una matrice con i puntatori

Messaggioda Mercyful » mar apr 07, 2009 23:02

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
Avatar utente
Mercyful
Linux 2.0
Linux 2.0
 
Messaggi: 196
Iscritto il: ven lug 25, 2008 17:20
Località: Torino
Nome Cognome: Ilario Pittau
Slackware: 13.0
Kernel: 2.6.29.6-generic
Desktop: xfce 4.6

Re: C : shift di una matrice con i puntatori

Messaggioda spudhead » mar apr 07, 2009 23:54

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
Avatar utente
spudhead
Linux 2.0
Linux 2.0
 
Messaggi: 130
Iscritto il: sab dic 17, 2005 0:17
Località: Ancona, Italy
Slackware: 12.2
Kernel: 2.6.28.7
Desktop: KDE 3.5.10

Re: C : shift di una matrice con i puntatori

Messaggioda ulisse89 » mer apr 08, 2009 15:04

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.
Avatar utente
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 12:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce

Re: C : shift di una matrice con i puntatori

Messaggioda Mercyful » mer apr 08, 2009 20:58

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!
Avatar utente
Mercyful
Linux 2.0
Linux 2.0
 
Messaggi: 196
Iscritto il: ven lug 25, 2008 17:20
Località: Torino
Nome Cognome: Ilario Pittau
Slackware: 13.0
Kernel: 2.6.29.6-generic
Desktop: xfce 4.6

Re: C : shift di una matrice con i puntatori

Messaggioda ulisse89 » mer apr 08, 2009 23:38

Quello che volevo dire, e che molto probabilmente non ho spiegato al meglio, era la tua soluzione 2. Comunque sono contento che hai risolto.
Avatar utente
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 12:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce

Re: C : shift di una matrice con i puntatori

Messaggioda robbybby » gio apr 09, 2009 8:14

Quando fai
Codice: Seleziona tutto
char m[5][100]

allochi 5*100=500 char contigui.
Quindi quello che vuoi fare non si puo'.
Avatar utente
robbybby
Linux 3.x
Linux 3.x
 
Messaggi: 1172
Iscritto il: sab dic 16, 2006 10:48
Località: Fra Trantor e Terminus
Slackware: 13.1 / 64 bit
Kernel: 3.3.x
Desktop: KDE 4.4.5

Re: C : shift di una matrice con i puntatori

Messaggioda Mercyful » gio apr 09, 2009 10:00

Mi hanno già risposto, e abbiamo trovato la soluzione.
Grazie lo stesso.
Avatar utente
Mercyful
Linux 2.0
Linux 2.0
 
Messaggi: 196
Iscritto il: ven lug 25, 2008 17:20
Località: Torino
Nome Cognome: Ilario Pittau
Slackware: 13.0
Kernel: 2.6.29.6-generic
Desktop: xfce 4.6


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite