|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
[C] Puntatori tripli e array di matrici
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 Codice:
float **funz(float ***); Codice:
float Matrici[2][5][5] Codice:
funz(Matrici) 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 : Codice:
#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;
}
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 è: Codice:
melchior@melchior:~$ ./prova3 0x8049660 0x8049660 0x0 0x0 Ora ho provato a trasformare l'array in una matrice e il puntatore in un doppio puntatore in questo modo : Codice:
#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;
}
Codice:
melchior@melchior:~$ ./prova3 0x80496A0 0x80496A0 0x0 0x80496A0 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 : Codice:
melchior@melchior:~$ gcc provaschif.c -o prova3 provaschif.c: In function 'main': provaschif.c:9: warning: assignment from incompatible pointer type Grazie a tutti quelli che mi aiuteranno Ciao PS= Scusate per la lunghezza.
__________________
GPU Compiler Engineer |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Apr 2004
Messaggi: 130
|
Codice:
#include <stdio.h>
int a[5][5], (*p)[5];
int main()
{
p = a;
printf("%p\n", p);
printf("%p\n", a);
printf("%p\n", *p);
printf("%p\n", *a);
return 0;
}
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Come potrei fare in questo caso senza sapere neanche una delle dimensioni dell'array? Grazie Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Ho provato a fare : Codice:
#include <stdio.h>
int a[5][5], (*p)[];
int main()
{
p = a;
printf("%p\n", p);
printf("%p\n", a);
printf("%p\n", *p);
printf("%p\n", *a);
return 0;
}
(*p)[ ][ ] : melchior@melchior:~$ gcc provaschif.c -o prova3 provaschif.c:4: error: array type has incomplete element type e nemmeno (**p)[ ] (viene lo stesso problema che ho all' inizio) Come fare? Grazie Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
io quando ho fatto un programmino che lavorava sulle matrici bidimensionali con allocazione dinamica et simila sono arrivato ai Puntatori a Puntatori Codice:
typedef riga float*;
typedef matrice riga*;
matrice funzione(matrice) {
...
}
|
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Apr 2004
Messaggi: 130
|
Non sono sicuro di capire: se non hai le dimensioni come pensi di gestirlo, il puntatore?
Comunque, la sintassi (*p)[] dovrebbe essere un'estensione del GCC, anche se qualcosa di simile e' prevista anche nel C99. In ogni caso, l'array flessibile deve essere l'ultimo elemento, per cui con tre indici diventerebbe, ad es., (*p)[5][]. Tutto sommato, perche' non passi l'indirizzo come void *? |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Niente da fare , non funziona. Inoltre nel typedef "riga" e "float*" e "matrice" e "riga*" dovrebbero essere invertiti Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Metti che ho una roba del genere : int arrayMatr[2][5][5]; funz(arrayMatr); La mia funzione non può sapere a priori che che nella seconda parentesi ci sarà il valore 5, perchè , volendo , io potrei scrivere qualsiasi valore, quindi non posso dichiarare "funz()" come : funz(int (*aMatr)[5][ ]) , ma dovrei dichiararla in modo generico come : funz(int ***aMatr) Questo però non me lo fa fare in modo corretto
__________________
GPU Compiler Engineer Ultima modifica di AnonimoVeneziano : 15-10-2005 alle 02:24. |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
ecco come ho fatto io:
Codice:
/* definizione di un tipo di dato di nome Matrice di tipo **float */
typedef float *Riga;
typedef Riga *Matrice;
...
Matrice initMatrice(Matrice FMatrice, unsigned int FRows, unsigned int FColumns) {
FMatrice = new float*[FRows]; // allocazione di un array di *float
for(unsigned int j = 0; j < FRows; j++) {
FMatrice[j] = new float[FColumns]; // allocazione di un array di float
}
/* per ogni array di puntatori a float viene definito un array di float
al suo interno, questo array permetterà di immagazzinare i dati */
return FMatrice;
}
...
non credo che aggiungendo un * in più...ossia creando un puntatore a puntatore a puntatore le cose cambino spero di essere stato più chiaro e spero di aver capito il problema che avevi altrimenti |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Invece io ho un problema leggermente diverso, ma simile.
Ho una serie di matrici 4x4 double. Sono tutti array "double [4][4]". Sono 9 array di questo tipo. Io vorrei legarli ad un indice o altro array, da passare poi ad una funzione, così con l'indice, accedere a quella matrice. Tipo, int elencomatrici[9] = non so come assegnargli le 9 matrici funzione_prova (int elenco){ ... elenco[1] <--deve restituirmi la 2° matrice } come si fa questa cosa?
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Nov 2013
Città: Nel cuore dell'8 Mile di Detroit
Messaggi: 3942
|
uhm...quasi 9 anni fa
vediamo se qualcuno ancora riceve le notifiche
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Codice:
#include <stdio.h>
#define N 2
#define W 5
#define H 5
typedef struct TMatrici {
float matrici[N][W][H];
} TMatrici;
float media(TMatrici m) {
int i, j, k;
float avg = 0;
for (i = 0; i < N; i++) {
for (j = 0; j < W; j++) {
for (k = 0; k < H; k++) {
avg += m.matrici[i][j][k];
}
}
}
return avg / (N * W * H);
}
int main(int argc, char *argv[]) {
int i, j, k;
float avg;
float l = 0;
TMatrici m;
for (i = 0; i < N; i++) {
for (j = 0; j < W; j++) {
for (k = 0; k < H; k++) {
m.matrici[i][j][k] = l;
l++;
}
}
}
avg = media(m);
printf("%f\n", avg);
system("PAUSE");
return 0;
}
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:00.











io quando ho fatto un programmino che lavorava sulle matrici bidimensionali con allocazione dinamica et simila sono arrivato ai Puntatori a Puntatori








