Ciao a tutti,
sto facendo un esperimento con un array di puntatori ad una struttura:
codice:
struct NODO
{
__int64 ByteIniziale;
__int64 ByteFinale;
char *ChiaveOrdinamento;
};
NODO **Key;
....
while (!feof(fpi))
{
...
ContatoreRecord++;
Key=(NODO**)realloc(Key,sizeof(NODO*)*(ContatoreRecord+1));
Key[ContatoreRecord]=(NODO*)malloc(sizeof(NODO));
Key[ContatoreRecord]->ChiaveOrdinamento=(char*)malloc(sizeof(char)*(LunghezzaChiave+1));
Key[ContatoreRecord]->ByteFinale=ContatoreByte;
Key[ContatoreRecord]->ByteIniziale=ContatoreByte-i;
...
}
Per il momento leggo un file e alloco la memoria necessaria per le chiavi di ordinamento.
Tutto sembra funzionare, in debug vedo i puntatori con valori corretti.
Il problema è che ad un certo punto (circa al record 110.000 su 200.000) il programma si blocca e da errore, sembra che faccia casino con la memoria.
La cosa strana è che se elimino un campo dalla struttura NODO per renderla più leggera (per esempio ByteFinale), il programma si blocca più avanti, per esempio al record 130.000. Se elimino anche l'altro campo (ByteIniziale) si blocco intorno al record 150.000.
Ma soprattutto ecco la coincidenza:
ovviamente mi aspetto che la memoria occupata cresca in continuazione, quindi tengo d'occhio il taskmanager. In tutti i casi si blocca sempre quando la memoria occupata arriva esattamente a 18.720 kb!!! Per questo se NODO occupa meno memoria riesco a leggere molti più record, ma comunque arrivato a 18.720 kb si blocca!
Esistono limiti? Non sono pochi 18MB?
Prima di lunedi non potrò rispondere a nessuno.
Per chi volesse analizzare + a fondo incollo il programma completo (per ora molto corto, di fatto non fa ancora nulla).
Grazie!
codice:
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
struct NODO
{
__int64 ByteIniziale;
__int64 ByteFinale;
char *ChiaveOrdinamento;
};
NODO **Key;
NODO **ptN;
const Inizio=1;
const Fine=10;
int NumeroDiPassaggi=2;
// 0 = ok
// 1 = manca file di input
int main(int argc, char *argv[])
{
char *NomeFileInput;
FILE *fpi;
char *Record, *CharApp;
long i;
long ContatoreRecord=0;
long LunghezzaChiave=Fine-Inizio+1;
__int64 ContatoreByte=0;
Key=(NODO**)malloc(sizeof(NODO*));
ptN=Key;
CharApp=(char*)malloc(2);
/*NomeFileInput=(char*)malloc(strlen(argv[1]));
strcpy(NomeFileInput,argv[1]);*/
NomeFileInput=(char*)malloc(strlen("B:\\DATI\\xxx.OUT")+1);
strcpy(NomeFileInput,"B:\\DAT\\xxx.OUT");
fpi=fopen(NomeFileInput,"r");
if(fpi==NULL)
return 1;
//creo nodi
while (!feof(fpi))
{
Record=(char*)malloc(1);
i=0;
CharApp[0]='\0';
while ((CharApp[0]!='\n') && (!feof(fpi)))
{
i++;
ContatoreByte++;
fread(CharApp,1,1,fpi);
Record=(char*)realloc(Record,sizeof(char)*(i+1));
Record[i-1]=CharApp[0];
}
Record[i]='\0';
if(!feof(fpi))
{
ContatoreRecord++;
Key=(NODO**)realloc(Key,sizeof(NODO*)*(ContatoreRecord+1));
Key[ContatoreRecord]=(NODO*)malloc(sizeof(NODO));
Key[ContatoreRecord]->ChiaveOrdinamento=(char*)malloc(sizeof(char)*(LunghezzaChiave+1));
Key[ContatoreRecord]->ByteFinale=ContatoreByte;
Key[ContatoreRecord]->ByteIniziale=ContatoreByte-i;
}
if(ContatoreRecord%1000==0)
printf("%d\n",ContatoreRecord);
free(Record);
}
return 0;
}