Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
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++
# include "mediaCornice.h"
int mediaCornice (int*v, int nr, int nc, int x, int y){
int media;
int j = 0 ;
int z =0;
if(x == 0 || y == 0 || x == nr - 1 || y == nc - 1){
return v[x][y];
}else{
while(j<4){
while(z<4){
int rigaAttuale =(x - 1)+ j;
int colonnaAttuale =(y - 1)+ z;
media = media + v[rigaAttuale][colonnaAttuale];
z++;
}
z =0;
j++;
}
return media;
}
}
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........
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
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
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.
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++
# include "mediaCornice.h"
int mediaCornice (int*v, int nr, int nc, int x, int y){
int media;
int j = 0 ;
int z =0;
if(x == 0 || y == 0 || x == nr - 1 || y == nc - 1){
return v[x][y];
}else{
while(j<4){
while(z<4){
int rigaAttuale =(x - 1)+ j;
int colonnaAttuale =(y - 1)+ z;
media = media + v[rigaAttuale][colonnaAttuale];
z++;
}
z =0;
j++;
}
return media;
}
}
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.......
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