View Full Version : [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.
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]) ...........
grazie per l'aiuto
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:
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) );
}
}
Chiaramente è solo un esempio, puoi adottare questo al tuo caso.
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:
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) );
}
}
Chiaramente è solo un esempio, puoi adottare questo al tuo caso.
scusa ma ti chiedo conferma, non so se ti ho depistato io ponendo una domanda mal fatta; io vedo l'array come 10 tabelle formate da 10000 righe e 8 colonne ognuna: ottengo il medesimo risultato col tuo codice?
A colpo d'occhio si direbbe di si, ma faccio più fatica a vederlo.
grazie
vendettaaaaa
05-08-2013, 12:32
scusa ma ti chiedo conferma, non so se ti ho depistato io ponendo una domanda mal fatta; io vedo l'array come 10 tabelle formate da 10000 righe e 8 colonne ognuna: ottengo il medesimo risultato col tuo codice?
A colpo d'occhio si direbbe di si, ma faccio più fatica a vederlo.
grazie
A me sembra che cambi la forma della matrice, ma lo spazio occupato rimane tale.
A me sembra che cambi la forma della matrice, ma lo spazio occupato rimane tale.
lo avevo pensato anch'io, c'è un modo per lasciarla invariata?
ripensandoci, una conferma; diventa forse così?
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
scusa ma ti chiedo conferma, non so se ti ho depistato io ponendo una domanda mal fatta; io vedo l'array come 10 tabelle formate da 10000 righe e 8 colonne ognuna: ottengo il medesimo risultato col tuo codice?
A colpo d'occhio si direbbe di si, ma faccio più fatica a vederlo.
grazie
Ho appositamente cambiando gli indici perché nn sapendo cosa dovevi fare esattamente mi veniva più comodo...
Forse per comodità di lettura e di organizzazione potrebbe scrivere così:
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]
}
Nota che a seconda quello che devi fare potrebbe essere conveniente allocare meno righe per volta.
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 :)
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 :)
Dimensioni intendi solo come numero di righe o anche come numero di colonne?
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).
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.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.