Torna indietro   Hardware Upgrade Forum > Software > Programmazione

FUJIFILM X-T30 III, la nuova mirrorless compatta
FUJIFILM X-T30 III, la nuova mirrorless compatta
FUJIFILM X-T30 III è la nuvoa fotocamera mirrorless pensata per chi si avvicina alla fotografia e ricerca una soluzione leggera e compatta, da avere sempre a disposizione ma che non porti a rinunce quanto a controllo dell'immagine.
Oracle AI World 2025: l'IA cambia tutto, a partire dai dati
Oracle AI World 2025: l'IA cambia tutto, a partire dai dati
Da Las Vegas, la visione di Larry Ellison e la concretezza di Clay Magouyrk definiscono la nuova traiettoria di Oracle: portare l’intelligenza artificiale ai dati, non i dati all’intelligenza, costruendo un’infrastruttura cloud e applicativa in cui gli agenti IA diventano parte integrante dei processi aziendali, fino al cuore delle imprese europee
Micron e millisecondi: la piattaforma ServiceNow guida l'infrastruttura IT di Aston Martin F1
Micron e millisecondi: la piattaforma ServiceNow guida l'infrastruttura IT di Aston Martin F1
Dalla precisione estrema dei componenti alla gestione digitale dei processi: come la piattaforma ServiceNow consente ad Aston Martin Aramco Formula One Team di ottimizzare risorse IT e flussi operativi in un ambiente dove ogni millesimo di secondo conta
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 05-08-2013, 07:40   #1
misterx
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]) ...........
grazie per l'aiuto

Ultima modifica di misterx : 05-08-2013 alle 08:08.
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 05-08-2013, 11:14   #2
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12858
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) );
   }
}
Chiaramente è solo un esempio, puoi adottare questo al tuo caso.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 05-08-2013, 11:22   #3
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
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) );
   }
}
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
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 05-08-2013, 12:32   #4
vendettaaaaa
Senior Member
 
L'Avatar di vendettaaaaa
 
Iscritto dal: Jan 2012
Messaggi: 1267
Quote:
Originariamente inviato da misterx Guarda i messaggi
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.
vendettaaaaa è offline   Rispondi citando il messaggio o parte di esso
Old 05-08-2013, 12:35   #5
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
Quote:
Originariamente inviato da vendettaaaaa Guarda i messaggi
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 è offline   Rispondi citando il messaggio o parte di esso
Old 05-08-2013, 12:38   #6
misterx
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
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 05-08-2013, 15:37   #7
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12858
Quote:
Originariamente inviato da misterx Guarda i messaggi
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ì:

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]
}
Nota che a seconda quello che devi fare potrebbe essere conveniente allocare meno righe per volta.

Ultima modifica di WarDuck : 05-08-2013 alle 15:40.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 05-08-2013, 16:33   #8
misterx
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
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 05-08-2013, 17:41   #9
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12858
Quote:
Originariamente inviato da misterx Guarda i messaggi
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).
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 05-08-2013, 20:24   #10
misterx
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.
misterx è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


FUJIFILM X-T30 III, la nuova mirrorless compatta FUJIFILM X-T30 III, la nuova mirrorless compatta
Oracle AI World 2025: l'IA cambia tutto, a partire dai dati Oracle AI World 2025: l'IA cambia tutto, a parti...
Micron e millisecondi: la piattaforma ServiceNow guida l'infrastruttura IT di Aston Martin F1 Micron e millisecondi: la piattaforma ServiceNow...
ASUS GeForce RTX 5080 Noctua OC Edition: una custom fenomenale, ma anche enorme ASUS GeForce RTX 5080 Noctua OC Edition: una cus...
Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo Dreame Aqua10 Ultra Roller, la pulizia di casa c...
La sonda spaziale europea ESA JUICE &egr...
La capsula Orion Integrity è stat...
Intel Nova Lake: i driver Linux svelano ...
Nothing punta sulla fascia bassa: ecco c...
Redmi Watch 6 è ufficiale: si pre...
Arriva Snapdragon 6s Gen 4: l'obiettivo ...
Anche Netflix, Amazon e Apple sono inter...
Meta e TikTok ancora nel mirino dell'UE:...
Microsoft chiude definitivamente con le ...
5 TV in grosso ribasso su Amazon: LG OLE...
Recensione Xiaomi Watch S4 41mm: lo smar...
Grandi affari del weeekend: su Amazon ci...
Doom nello spazio: lo sparatutto pi&ugra...
Apple Day su Amazon: crollano i prezzi d...
Nothing Phone (3a) Pro scende a 392€ su ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:00.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v