|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
[C] dichiarazione di array
ciao a tutti,
purtroppo programmando a fasi alterne mi dimentico sempre tutto; espongo il mio problema. Ho dichiarato un array tridimensionale di questo tipo: int mioarray[10][10000][8]; ma viene esaurito lo spazio sullo stack(heap??). Ricordo che esisteva un modo equivalente usando i puntatori ed attraverso la malloc() evitare di usare l'area stack. Una volta creato l'array, questo dovrà essere verificato byte a byte. Codice:
inx x,y,z; for(x=0; x<10;x++) for(y=0;y<10000;y++) for(z=0;z<8;z++) if(mioarray[x][y][z]) ........... Ultima modifica di misterx : 05-08-2013 alle 08:08. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12851
|
Facendo un rapido conto stai cercando di allocare spazio sullo stack per 800000 interi, ovvero 3.2M circa.
Credo che di default lo stack sia limitato a 2MB. Fai una prova per curiosità a ridurre quei valori. Comunque puoi adottare una strategia ibrida, usando una matrice di puntatori: Codice:
int* mioarray[10][8]; // inizializzazione for (int i=0; i < 10; i++) { for (int j=0; j < 8; j++) { mioarray[i][j] = malloc( 100000 * sizeof(int) ); } } |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
A colpo d'occhio si direbbe di si, ma faccio più fatica a vederlo. grazie |
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Quote:
|
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
ripensandoci, una conferma; diventa forse così?
Codice:
inx x,y,z; for(x=0; x<10;x++) for(z=0;z<8;z++) for(y=0;y<10000;y++) if(mioarray[x][z][y]) ........... grazie |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: May 2001
Messaggi: 12851
|
Quote:
Forse per comodità di lettura e di organizzazione potrebbe scrivere così: Codice:
struct riga { tipo col[8]; }; struct tabella { struct riga* row; }; int main(void) { const int numero_tabelle = 10; const int numero_righe = 10000; struct tabella tabs[numero_tabelle]; // inizializzazione tabelle for (int i=0; i < numero_tabelle; i++) { tabs[i].row = malloc(numero_righe * sizeof(struct riga)); } ... // si può accedere con tabs[i].row[j]->col[k] } Ultima modifica di WarDuck : 05-08-2013 alle 15:40. |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
ho usato la tua prima soluzione; per la seconda soluzione da te postata, come risulterebbe il codice nel caso di n tabelle diverse in quanto di dimensioni diverse ?
Se il codice divenisse compatto sarebbe una soluzione veramente ottima ![]() |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: May 2001
Messaggi: 12851
|
Quote:
Perché se sono troppo diverse tra loro potrebbe non avere più senso usare un'array, a meno che tu non le voglia indicizzare per qualche motivo (a me ignoto). |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
non so se risco ad essere più chiaro; in pratica in quelle tabelle ci finiscono i dati presenti in un buffer di dimensioni note.
Posso avere però n buffer di dimensioni diverse e per ognuno devo avere le rispettive tabelle, diversificate, nelle quali inserire i dati dei rispettivi buffer. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 02:22.