Oppure

Loading
13/12/13 19:09
TheDarkJuster
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:
# 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........
aaa
13/12/13 19:27
ZioCrocifisso
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 13/12/13 19:31
aaa
13/12/13 19:32
TheDarkJuster
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 13/12/13 19:45
aaa
13/12/13 19:54
carmine
Puoi anche risolvere in questo modo con un puntatore a int:
pa = (int *) malloc(N * M * sizeof(int));  //Alloco la matrice dinamica

        for (i = 0; i < N; i++)
        {
            for (j = 0; j < M; j++)
            {
                printf("%d\t", *(pa + M * i + j)); //Notazione a Puntatore Matrice in Memoria
            }
            printf("\n");
        }

aaa
13/12/13 20:36
ZioCrocifisso
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.
aaa
13/12/13 20:46
TheDarkJuster
malloc non lo può usare, comunque, quello che non ho capito, è che tipo di sequenzialità c' è nelle matrici..... Ovvero.... se io faccio

# 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.......
aaa
14/12/13 13:43
ZioCrocifisso
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: imgur.com/…

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 14/12/13 14:02
aaa
15/12/13 11:47
TheDarkJuster
Ho capito, grazie a tutti
aaa