Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Puntatori e matrici
Forum - C/C++ - Puntatori e matrici

Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 20:09
Venerdì, 13/12/2013
Buona sera a tutti, oggi ho dato una mano ad una amica sulla programmazione, che le serve per l'università. Dopo aver sistemato degli esercizi ho provato a compilare questo file:
Codice sorgente - presumibilmente C++

  1. # include "mediaCornice.h"
  2.  
  3. int mediaCornice (int *v, int nr, int nc, int x, int y){
  4.  int media;
  5.  
  6.   int j = 0 ;
  7.   int z = 0;
  8.  
  9.   if (x == 0 || y == 0 || x == nr - 1 || y == nc - 1) {
  10.                 return v[x][y];
  11.    } else {
  12.                 while (j<4) {
  13.                         while (z<4){
  14.                                 int rigaAttuale = (x - 1) + j;
  15.                                 int colonnaAttuale = (y - 1) + z;
  16.                                 media = media + v[rigaAttuale][colonnaAttuale];
  17.                                 z++;
  18.                         }
  19.                         z = 0;
  20.                         j++;
  21.                 }
  22.         return media;
  23.         }
  24.  }



gcc mi restituisce: mediaCornice.c:16:35 error: subscripted value is neither array nor pointer nor vector
ovvero? devo per forza trattare v come un vettore? Non posso trattarlo come matrice? Perchè no? Sinceramente non mi sono mai posto il problema di trattare della memoria come matrice al posto di vettore, quindi non so proprio cosa dire, attendo spiegazione. Ringrazio in anticipo........

PM Quote
Avatar
ZioCrocifisso (Member)
Pro


Messaggi: 135
Iscritto: 06/03/2013

Segnala al moderatore
Postato alle 20:27
Venerdì, 13/12/2013
Un array multidimensionale in C corrisponde a un puntatore a un array di puntatori al tipo in questione (per esempio, int**). Da int* il compilatore pensa che si tratti di un puntatore a un array di interi, e se volessi trattarlo come puntatore a puntatori, non potrebbe comunque sapere cosa si stia effettivamente puntando alla fine senza il casting (o un tipo appropriato per la variabile), e quindi non potrebbe determinare la dimensione di ogni salto da compiere per passare da un elemento all'altro.
Una matrice corretta di interi sarebbe:
puntatore -> puntatore -> intero
Nel tuo caso è:
puntatore -> intero
Essendo il C flessibile, puoi trattare quell'intero come puntatore, ma puntatore a cosa? Il compilatore non può saperlo, dunque dovresti almeno fare il casting a (int **) quando lo usi con i []. Ma probabilmente non è ciò che vuoi: se gli hai dato quel tipo, evidentemente si tratta proprio di un array di interi, la cui struttura non rispecchia gli array multidimensionali del C.
Insomma, le matrici in C non sono come quelle degli altri linguaggi, se vuoi farle simili i calcoli devi farli a mano.

Ultima modifica effettuata da ZioCrocifisso il 13/12/2013 alle 20:31
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 20:32
Venerdì, 13/12/2013
avevo pensato anche io ad una cosa piu o meno simile, solo che nel testo dell' esercizio c' è  scritto il prototipo, che è: int medaCornice (int *, int, int, int, int); quindi io non so dove andare a parare a questo punto......

Può essere una svista del professore? A me pare di si a questo punto...... Se dovessi fare  int mediaCornice (int **, int, int, int, int);

invece di fare mediaCornice(vettore ...... ) dovrei fare mediaCornice(&vettore .... ) oppure ho capito male?

Ultima modifica effettuata da TheDarkJuster il 13/12/2013 alle 20:45
PM Quote
Avatar
carmine (Member)
Pro


Messaggi: 168
Iscritto: 20/04/2010

Segnala al moderatore
Postato alle 20:54
Venerdì, 13/12/2013
Puoi anche risolvere in questo modo con un puntatore a int:
Codice sorgente - presumibilmente C/C++

  1. pa = (int *) malloc(N * M * sizeof(int));  //Alloco la matrice dinamica
  2.  
  3.         for (i = 0; i < N; i++)
  4.         {
  5.             for (j = 0; j < M; j++)
  6.             {
  7.                 printf("%d\t", *(pa + M * i + j)); //Notazione a Puntatore Matrice in Memoria
  8.             }
  9.             printf("\n");
  10.         }



PM Quote
Avatar
ZioCrocifisso (Member)
Pro


Messaggi: 135
Iscritto: 06/03/2013

Segnala al moderatore
Postato alle 21:36
Venerdì, 13/12/2013
Come ho detto prima, gli array multidimensionali in C sono diversi da quelli degli altri linguaggi, tanto che molti non  li considerano come veri e propri array multidimensionali. Dunque probabilmente la richiesta è farlo come ti ha mostrato carmine, facendo i calcoli manualmente (anche se non è necessario usare l'aritmetica sui puntatori, si può anche usare un [] con i calcoli), e non con array di array.

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 21:46
Venerdì, 13/12/2013
malloc non lo può usare, comunque, quello che non ho capito, è che tipo di sequenzialità c' è nelle matrici..... Ovvero.... se io faccio

Codice sorgente - presumibilmente C++

  1. # include "mediaCornice.h"
  2.  
  3. int mediaCornice (int *v, int nr, int nc, int x, int y){
  4.  int media;
  5.  
  6.   int j = 0 ;
  7.   int z = 0;
  8.  
  9.   if (x == 0 || y == 0 || x == nr - 1 || y == nc - 1) {
  10.                 return v[x][y];
  11.    } else {
  12.                 while (j<4) {
  13.                         while (z<4){
  14.                                 int rigaAttuale = (x - 1) + j;
  15.                                 int colonnaAttuale = (y - 1) + z;
  16.                                 media = media + v[rigaAttuale][colonnaAttuale];
  17.                                 z++;
  18.                         }
  19.                         z = 0;
  20.                         j++;
  21.                 }
  22.         return media;
  23.         }
  24.  }

e poi faccio mediaCornice (matrice) matrice[0][0] corrisponde a vettore[0]? Mi pare di capire di si, ma allora matrice[1][0] corrisponde a? Qualcuno può farmi un disegnino? Non sto capendo.......

PM Quote
Avatar
ZioCrocifisso (Member)
Pro


Messaggi: 135
Iscritto: 06/03/2013

Segnala al moderatore
Postato alle 14:43
Sabato, 14/12/2013
Ripeto: gli array multidimensionali in C sono puntatori a puntatori. Se usi la sintassi con due [], stai usando gli array del C. Nel tuo codice hai dunque mischiato le due cose.
Se usi [][], v dovrebbe essere un puntatore a puntatori a int, v[0] un puntatore a int, e v[0][0] un int. Dunque per ottenere un elemento dovresti dereferenziare due volte. Per esempio v[1][2] diventa *(*(v + 1) + 2).
Se vuoi il disegno: http://imgur.com/fQtd8lN

La matrice implementata nel modo in cui ti ha mostrato carmine invece è un singolo array (puntatore al primo elemento) di int, e gli elementi si determinano con un semplice calcolo: array[riga * Ncolonne + colonna]. Per esempio, in un array 3x3, quel che negli array multidimensionali del C è a[1][2], diventa a[2 * 3 + 1], o, scritto utilizzando l'aritmetica dei puntatori, *(a + 2 * 3 + 1).

Ultima modifica effettuata da ZioCrocifisso il 14/12/2013 alle 15:02
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 12:47
Domenica, 15/12/2013
Ho capito, grazie a tutti

PM Quote