PDA

View Full Version : [delphi] come funziona AllocMem?


fabbius69
17-02-2011, 22:22
ho sempre usato programmi con type console su dephi e problemi di memoria mai avuti.
Oggi ho provato ad inserire un semplice programma non in type console (basta dos) e dice stack overflow ho capito che usavo la memoria locale e non so perchè in console il problema non c'e' mai stato.
Ora come faccio a portare queste variabile in memoria dinamica con allocmem.

type

lo=array[1..200000,1..11]of smallint;

la=array[1..20]of smallint;
nom=string[25];
lot=record
num:lo;
ind:smallint;
anno:smallint;
mese:string[15];
end;
fi=file of lot;

penso che l'array è troppo grande ma non so come fare?
chi mi sa aiutare ad usare allocmem.

Grazie

Uso delphi 7

cdimauro
18-02-2011, 05:39
Il problema è che il tipo "lo" è incluso nella definizione del record lot.

Se ti è possibile, dovresti togliere lo da lot, e scriverlo in un altro file.

In questo modo potresti definire l'altro file col tipo:
lo = array[1..11]of smallint;
e scrivere i 200000 record (ma immagino saranno molti dimeno) uno alla volta.

fabbius69
18-02-2011, 09:11
Il problema è che il tipo "lo" è incluso nella definizione del record lot.

Se ti è possibile, dovresti togliere lo da lot, e scriverlo in un altro file.

In questo modo potresti definire l'altro file col tipo:
lo = array[1..11]of smallint;
e scrivere i 200000 record (ma immagino saranno molti dimeno) uno alla volta.

Io il record lot lo potrei togliere però la matrice lo=array[1..200000,1..11]of smallint; mi serve.
L'errore di memoria esce sempre.
per capirci io inserisco 18 numeri e sviluppo un sistema in cui ogni colonna è formata da 10 numeri, quindi l'array deve essere per forza grande.
Un aiutino

p.s. mi esce sempre "project2.exe raised exception class Estackoverflow with message "stack overflow"".

cdimauro
19-02-2011, 06:23
Hum. Alla fine la struttura lo non è nemmeno tanto grande: parliamo di 4,2MB circa.

Dato il tipo di errore, può darsi che tu la stia utilizzando dentro qualche procedura/funzione/metodo. Ad esempio:
procedure Pippo;
var
Colonne: lo;
begin
end;
In questo caso Colonne viene allocata nello stack, e potrebbe portarti a quell'errore.

Se è così, hai due soluzioni:
1) Nelle proprietà del progetto da qualche parte è impostato il valore di MaxStack (purtroppo non ricordo di preciso il nome e dove si trova, perché è da un pezzo che non lavoro più con Delphi), per cui ti basta cambiarlo con un valore alto e dovresti essere a posto;

2) faresti meglio ad allocare dinamicamente la struttura quando ti serve, sfruttando gli array dinamici. Quindi Pippo la riscriverei così:
const
MaxColumns = 200000;

type
TColumn = array[1..11] of SmallInt;
TColumns = array of TColumn;

procedure Pippo;
var
Colonne: TColumns;
begin
SetLength(Colonne, MaxColumns);
// Codice...
end;
Meglio ancora sarebbe allocare soltanto il numero di colonne che realmente ti servono, anziché il numero massimo (200000).

fabbius69
19-02-2011, 10:54
Grazie per la risposta , vorrei farti una domanda extra. io lavoro molto con le matrici facendo sempre elaborazioni sistemi di gioco riduttori ed altro.
Il delphi non mi soddisfa troppo, sono riuscito a fare il programma che ti dicevo mettendo la dimensione dell'array a 10000.
Ma è troppo lento per i calcoli che gli chiedo.
Ho provato con il matlab, ma non ho trovato guide e poi ad ogni dubbio non trovo mai la risposta ( non ho capito come dare in input dei numeri, oppure creare un array di recor).
Sai indircarmi un linguaggio veloce nell'operazioni matematiche che trovo anche buone guide?
Grazie

cdimauro
22-02-2011, 22:11
Francamente non saprei, anche perché pure io un bel po' di anni fa ho realizzato un programma di riduzione delle colonne (per diversi sistemi di gioco) per Delphi 7, e riuscivo a gestire fino a circa una decina di milioni di colonne (ognuna con fino a 96 numeri diversi), impiegando al più mezz'ora su PC abbastanza datati.

Poi è chiaro che tutto dipende dagli algoritmi di riduzione implementati, per cui un confronto vero e proprio non si può fare.