PDA

View Full Version : [C] dichiarazione di array


misterx
05-08-2013, 07:40
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

WarDuck
05-08-2013, 11:14
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.

misterx
05-08-2013, 11:22
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.

misterx
05-08-2013, 12:35
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?

misterx
05-08-2013, 12:38
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

WarDuck
05-08-2013, 15:37
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.

misterx
05-08-2013, 16:33
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 :)

WarDuck
05-08-2013, 17:41
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).

misterx
05-08-2013, 20:24
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.