AnonimoVeneziano
14-10-2005, 19:48
Ciao boys.
Oggi per divertimento ho iniziato a scrivere un po' di roba riguardante le matrici.
Per motivi logistici che non sto a spiegarvi mi risulterebbe molto utile riuscire a passare a una funzione del tipo
float **funz(float ***);
un array di matrici del tipo
float Matrici[2][5][5]
Il problema è che il passaggio semplice (come si fa con i puntatori ed array unidimensionali) :
funz(Matrici)
Non funziona.
Ora mi trovo veramente in difficoltà , perchè ho sempre pensato agli array come "costanti di tipo puntatore" , e perciò con la stessa aritmetica e modus operandi dei normali puntatori.
Infatti il tutto funziona perfettamente con gli array unidimensionali, ma già quando si passa a quelli bidimensionali (matrici) scattano i problemi.
Vi faccio un esempio di un programmino che ho scritto apposta per esplicare il problema :
#include <stdio.h>
#include <stdlib.h>
int a[5], *p;
int main(int argc, char **argv)
{
p = a;
printf("0x%X\n", p);
printf("0x%X\n", a);
printf("0x%X\n", *p);
printf("0x%X\n", *a);
return 0;
}
Come vedete nel programma viene fatta una cosa semplicissima. Viene dichiarato un array "a" e poi un puntatore "p" entrambi di tipo int.
Successivamente viene assegnato al puntatore "p" il valore di "a", ossia l'indirizzo del primo elemento di "a". Successivamente con le "printf()" scrivo a schermo una serie di valori in esadecimale. In particolare scrivo l'indirizzo contenuto in "p", quello contenuto in "a" e i valori puntati rispettivamente. L'output del programma è:
melchior@melchior:~$ ./prova3
0x8049660
0x8049660
0x0
0x0
L'output è proprio quello che mi aspettavo. Gli indirizzi contenuti in "a" e in "p" sono identici e il valore puntato da quell' indirizzo è anch'esso identico (in questo caso = a "0" perchè l'array è stato inizializzato automaticamente dal compilatore a "0").
Ora ho provato a trasformare l'array in una matrice e il puntatore in un doppio puntatore in questo modo :
#include <stdio.h>
#include <stdlib.h>
int a[5][5], **p;
int main(int argc, char **argv)
{
p = a;
printf("0x%X\n", p);
printf("0x%X\n", a);
printf("0x%X\n", *p);
printf("0x%X\n", *a);
return 0;
}
A questo punto mi aspettavo un output simile al precedente, solo che al posto del valore "0" nelle ultime 2 printf mi sarei ritrovato l'indirizzo del primo elemento del primo array della matrice "a" che ovviamente è uguale per entrambe le chiamate di printf , ma invece :
melchior@melchior:~$ ./prova3
0x80496A0
0x80496A0
0x0
0x80496A0
Come vedete l'indirizzo contenuto in"a" e in "p" è sempre lo stesso, solo che se faccio il dereferimento di "p" ottengo inspiegabilmente "0", mentre facendo quello di "a" ottengo l'indirizzo contenuto in "a" stesso (che dovrebbe anche essere l'indirizzo del primo array di "a").
Chiaramente se faccio un doppio dereferimento di "p" con "**p" ottengo un "Segmentation Fault".
GCC mi da anche un warning alla compilazione del secondo programmino che nel caso del primo non appare :
melchior@melchior:~$ gcc provaschif.c -o prova3
provaschif.c: In function 'main':
provaschif.c:9: warning: assignment from incompatible pointer type
Sinceramente però non riesco a capire cosa sbaglio :(
Grazie a tutti quelli che mi aiuteranno
Ciao
PS= Scusate per la lunghezza.
Oggi per divertimento ho iniziato a scrivere un po' di roba riguardante le matrici.
Per motivi logistici che non sto a spiegarvi mi risulterebbe molto utile riuscire a passare a una funzione del tipo
float **funz(float ***);
un array di matrici del tipo
float Matrici[2][5][5]
Il problema è che il passaggio semplice (come si fa con i puntatori ed array unidimensionali) :
funz(Matrici)
Non funziona.
Ora mi trovo veramente in difficoltà , perchè ho sempre pensato agli array come "costanti di tipo puntatore" , e perciò con la stessa aritmetica e modus operandi dei normali puntatori.
Infatti il tutto funziona perfettamente con gli array unidimensionali, ma già quando si passa a quelli bidimensionali (matrici) scattano i problemi.
Vi faccio un esempio di un programmino che ho scritto apposta per esplicare il problema :
#include <stdio.h>
#include <stdlib.h>
int a[5], *p;
int main(int argc, char **argv)
{
p = a;
printf("0x%X\n", p);
printf("0x%X\n", a);
printf("0x%X\n", *p);
printf("0x%X\n", *a);
return 0;
}
Come vedete nel programma viene fatta una cosa semplicissima. Viene dichiarato un array "a" e poi un puntatore "p" entrambi di tipo int.
Successivamente viene assegnato al puntatore "p" il valore di "a", ossia l'indirizzo del primo elemento di "a". Successivamente con le "printf()" scrivo a schermo una serie di valori in esadecimale. In particolare scrivo l'indirizzo contenuto in "p", quello contenuto in "a" e i valori puntati rispettivamente. L'output del programma è:
melchior@melchior:~$ ./prova3
0x8049660
0x8049660
0x0
0x0
L'output è proprio quello che mi aspettavo. Gli indirizzi contenuti in "a" e in "p" sono identici e il valore puntato da quell' indirizzo è anch'esso identico (in questo caso = a "0" perchè l'array è stato inizializzato automaticamente dal compilatore a "0").
Ora ho provato a trasformare l'array in una matrice e il puntatore in un doppio puntatore in questo modo :
#include <stdio.h>
#include <stdlib.h>
int a[5][5], **p;
int main(int argc, char **argv)
{
p = a;
printf("0x%X\n", p);
printf("0x%X\n", a);
printf("0x%X\n", *p);
printf("0x%X\n", *a);
return 0;
}
A questo punto mi aspettavo un output simile al precedente, solo che al posto del valore "0" nelle ultime 2 printf mi sarei ritrovato l'indirizzo del primo elemento del primo array della matrice "a" che ovviamente è uguale per entrambe le chiamate di printf , ma invece :
melchior@melchior:~$ ./prova3
0x80496A0
0x80496A0
0x0
0x80496A0
Come vedete l'indirizzo contenuto in"a" e in "p" è sempre lo stesso, solo che se faccio il dereferimento di "p" ottengo inspiegabilmente "0", mentre facendo quello di "a" ottengo l'indirizzo contenuto in "a" stesso (che dovrebbe anche essere l'indirizzo del primo array di "a").
Chiaramente se faccio un doppio dereferimento di "p" con "**p" ottengo un "Segmentation Fault".
GCC mi da anche un warning alla compilazione del secondo programmino che nel caso del primo non appare :
melchior@melchior:~$ gcc provaschif.c -o prova3
provaschif.c: In function 'main':
provaschif.c:9: warning: assignment from incompatible pointer type
Sinceramente però non riesco a capire cosa sbaglio :(
Grazie a tutti quelli che mi aiuteranno
Ciao
PS= Scusate per la lunghezza.