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 sempre la versione di Slackware usata e la versione del Kernel. Questi dati aiutano le persone che possono rispondere.
2) Specificare sempre il tipo di shell (bash, sh, csh, etc...)
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 dell'ultima regola 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 » mer apr 08, 2009 0: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 18: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 » mer apr 08, 2009 0: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 1: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 16: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 13: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 21: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 18: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 » gio apr 09, 2009 0: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 13: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 9: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: 1077
Iscritto il: sab dic 16, 2006 11: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 11: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 18: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