|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2005
Città: Pisa
Messaggi: 1047
|
[C] argomento funzioni e vettori bidimensionali
Ho un enorme dubbio su come passare un vettore bidimensionale come argomenti di una funzione.
il punto è questo. Ho bisogno di creare un thread al quale passare un vettore bidimensionale la cui dimensione è inizializzata a tempo di esecuzione da 2 valori indicati dall'utente al momento dell'avvio del programma. int *work_func(worldElement_t* tab); int main(int argc, char* argv[]){ int rows, cols; /*inizializzate dall'utente*/ .... worldElement_t World[rows][cols];/*vettore in questione*/ .... pthread_create(tid,NULL,(void*)work_func,&World); ... } int *work_func(worldElement_t* tab){ ..... tab[i][j].stato=WATER; ..... } in tutte le righe dove faccio uso di tab in questo modo all'interno della work_func il compilatore mi da il seguente errore: error: subscripted value is neither array nor pointer COsa vuol dire? Dove sbaglio?
__________________
Vendite concluse ottimamente con: Bastian UMTS, Tiscaliniano. --------------------------------------------------------- 1) Macbook Pro Core 2 Duo 2,16Ghz - 2GB di RAM - HD 160GB - Glossy Widescreen - 2°Gen 2) iPhone 3G - 8GB Black 3) Ipod Shuffle Blu 1GB 4) iMac 27" QuadCore i7 Ultima modifica di noodles83 : 22-05-2008 alle 12:38. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2005
Città: Pisa
Messaggi: 1047
|
nessuno che mi può dare una mano a risolvere?
__________________
Vendite concluse ottimamente con: Bastian UMTS, Tiscaliniano. --------------------------------------------------------- 1) Macbook Pro Core 2 Duo 2,16Ghz - 2GB di RAM - HD 160GB - Glossy Widescreen - 2°Gen 2) iPhone 3G - 8GB Black 3) Ipod Shuffle Blu 1GB 4) iMac 27" QuadCore i7 Ultima modifica di noodles83 : 22-05-2008 alle 12:34. |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: May 2008
Città: Napoli
Messaggi: 42
|
pthread_create(tid,NULL,(void*)work_func,&World);
quando passiamo ad una funzione/procedura C un vettore in realtà non passiamo il vettore stesso, ma il puntatore ad il primo elemento del vettore, quindi quando passi Word questo è già un indirizzo. mettendo "&" non passi l'indirizzo del primo elemento del vettore, ma l'indirizzo dell'area di memoria dove c'è l'indirizzo del primo elemento del vettore ed è un errore. in altre palrole TOGLI "&" in secondo luogo in C gli array bbidimensionali sono memorizzati come se fossero array monodimensionali. per capirci gli elementi sono messi tutti di seguito. QUINDI C'è BISOGNO KE TU GLI DICA QUANDO FINISCE UNA RIGA, quindi gli serve la dimensione massima. quindi: la chiamata sara: funzione(ARG,ARG,World); la signature della procedura TYPE NOME(TIPE ARG, TIPE ARG, TIPE World[][200]) //200 è un numero messo a caso spero di essere stato kiaro... Saluti |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Oct 2005
Città: Pisa
Messaggi: 1047
|
Quote:
Rigurado all'array il mio problema è proprio questo... nella signature non ho modo di sapere quanto sarà lunga una riga a prescindere, perchè questo sarà un dato che verrà determinato ad esecuzione. Se la modifico cosi, va bene uguale? la signature della procedura TYPE NOME(TIPE ARG, TIPE ARG, TIPE** ARG) /*ovviamente con il tipo corretto relativo a World*/
__________________
Vendite concluse ottimamente con: Bastian UMTS, Tiscaliniano. --------------------------------------------------------- 1) Macbook Pro Core 2 Duo 2,16Ghz - 2GB di RAM - HD 160GB - Glossy Widescreen - 2°Gen 2) iPhone 3G - 8GB Black 3) Ipod Shuffle Blu 1GB 4) iMac 27" QuadCore i7 |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#6 |
|
Member
Iscritto dal: May 2008
Città: Napoli
Messaggi: 42
|
se nn vuoi utilizzare strutture dinamiche. l'unica soluzione è mettere nella signature della procedura questo:
TYPE procedura(arg arg..... TYPE World[][200], int col, int righe) ovvero in base a quello ke fa il tuo programma decidi un intero tale ke come numero di colonne non possa essere superato ( il 200) e passa alla procedura i dati letti da STDINPUT. |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Altrimenti potresti "emulare" la bidimensionalità e usare un semplice malloc:
Codice:
... worldElement_t* world = (worldElement_t*)malloc( sizeof( worldElement_t ) * sizex * sizey); ... void procedura( worldElement_t* matrix, size_t sizex, size_t sizey) Codice:
worldElement_t* element = matrix[ index_x + index_y * sizey ]; |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Spesso faccio così infatti.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Oct 2005
Città: Pisa
Messaggi: 1047
|
purtroppo non è una dimensione che possono conoscere al momento della compilazione. Però una volta avviato il programma e scelta la dimensione durante l'esecuzione, questa poi non cambia. Quindi è da escludere che possa mettere a priori nella signature della funzione la lunghezza delle righe e sinceramente anche l'idea di mettere una limitazione a priori non mi piace.
L'unico modo mi sembra a questo punto usare per forza i puntatori. Se non volessi emulare la matrice con una malloc è corretto scrivere questo? /*signature della funzione*/ int *work_func(worldElement_t** tab); int main(int argc, char* argv[]){ int rows, cols; /*inizializzate dall'utente*/ .... worldElement_t World[rows][cols]; /*vettore in questione con row e cols determinati una volta per tutte ad esecuzione prima dell'inizializzazione del vettore.*/ .... pthread_create(tid,NULL,(void*)work_func,World); ... } int *work_func(worldElement_t** tab){ ..... tab[i][j].stato=WATER; /*accedere al vettore passato*/ ..... } compilando non ci sono problemi, devo ancora verificare l'esecuzione. Secondo voi è corretto?
__________________
Vendite concluse ottimamente con: Bastian UMTS, Tiscaliniano. --------------------------------------------------------- 1) Macbook Pro Core 2 Duo 2,16Ghz - 2GB di RAM - HD 160GB - Glossy Widescreen - 2°Gen 2) iPhone 3G - 8GB Black 3) Ipod Shuffle Blu 1GB 4) iMac 27" QuadCore i7 |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Se stai scrivendo codice ANSI C non è codice standard. Puoi fare una malloc(larghezza * altezza * sizeof(tipodato)) ed accedere ad ogni singolo elemento prendendo l'indice (colonna + riga * NumeroColonne), come suggerito da Tommo.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Oct 2005
Città: Pisa
Messaggi: 1047
|
mi sa che alla fine farò cosi...
grazie.
__________________
Vendite concluse ottimamente con: Bastian UMTS, Tiscaliniano. --------------------------------------------------------- 1) Macbook Pro Core 2 Duo 2,16Ghz - 2GB di RAM - HD 160GB - Glossy Widescreen - 2°Gen 2) iPhone 3G - 8GB Black 3) Ipod Shuffle Blu 1GB 4) iMac 27" QuadCore i7 |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:37.




















