Buon giorno a tutti .. è il mio primo tread ne approfitto per sottoporvi un problemino ..
stò implementando un semplice progammino per elaborare N file (una decina) passati come argomento dai quali leggere tre vettori dal primo per poi aggiungere in coda a questo i valori successivi letti dal secondo argomento ..
l'idea è quella di utilizzare un ciclo ... da 1 a argc e se l'indice è uno usare la malloc altrimenti utilizzare la realloc .. posto l'esempio e spiego il problema ..
ora .. il problema è strano .. se io lascio "n" a moltiplicare l'argomento della malloc e passo più di quattro file come argomenti mi dà il seguente messaggiocodice:#include<stdio.h> #include<stdlib.h> #include<string.h> int column( FILE *f ); int main( int argc , char *argv[]){ FILE *input ; double *time , *temp ; int i , k, *law , size = 0 , a , oldSize = 0 , j , ii = 0; for( k = 1 ; k < argc ; k++){ if( (input = fopen( argv[k], "r" ) ) == NULL ){ printf("error open file input \n"); } else { int n = column(input); printf("n is %d\n" , n); size += n; if(k==1){ time = (double*)malloc(n*sizeof(double)); temp = (double*)malloc(n*sizeof(double)); law = (int*)malloc(n*sizeof(int)); } else{ time = (double*)realloc( time , size * sizeof(double)); temp = (double*)realloc( temp , size * sizeof(double)); law = (int*)realloc( law , size * sizeof(int) ); } rewind(input); /* do{ a = fgetc(input); }while(a != '\n') ; //i=0; */ while(!feof(input)){ fscanf( input, "%lg %lg %d", &time[ii] ,&temp[ii] , &law[ii] ); ++ii ; } } printf("oldSize is %d , size is %d\n" , oldSize , size); oldSize = size ; } for( j=0 ; j < size ; j++ ){ printf("law[%d]: %d\n", j ,law[j]); } return 0 ; } int column( FILE *f){ int c ; int n=0; while(!feof(f)){ if( (c = fgetc(f) )== '\n'){ n++ ; } } return n; }
se io invece che n metto un numero molto grande .. nessun problema ..codice:oldSize is 0 , size is 746 n is 1142 oldSize is 746 , size is 1888 n is 1340 oldSize is 1888 , size is 3228 n is 746 *** glibc detected *** ./test: realloc(): invalid next size: 0x0000000001e54520 *** ======= Backtrace: ========= /lib/libc.so.6(+0x71ad6)[0x7f9e48d7aad6] /lib/libc.so.6(+0x776ec)[0x7f9e48d806ec] /lib/libc.so.6(realloc+0xf0)[0x7f9e48d80a00] ./test[0x40086e] /lib/libc.so.6(__libc_start_main+0xfd)[0x7f9e48d27c4d] ./test[0x4006b9] ======= Memory map: ======== 00400000-00401000 r-xp 00000000 08:02 1711113 /home/marco/Scrivania/mild/test 00600000-00601000 rw-p 00000000 08:02 1711113 /home/marco/Scrivania/mild/test 01e49000-01e6a000 rw-p 00000000 00:00 0 [heap] 7f9e44000000-7f9e44021000 rw-p 00000000 00:00 0 7f9e44021000-7f9e48000000 ---p 00000000 00:00 0 7f9e48af3000-7f9e48b09000 r-xp 00000000 08:01 1438979 /lib/libgcc_s.so.1 7f9e48b09000-7f9e48d08000 ---p 00016000 08:01 1438979 /lib/libgcc_s.so.1 7f9e48d08000-7f9e48d09000 rw-p 00015000 08:01 1438979 /lib/libgcc_s.so.1 7f9e48d09000-7f9e48e61000 r-xp 00000000 08:01 1438987 /lib/libc-2.11.2.so 7f9e48e61000-7f9e49060000 ---p 00158000 08:01 1438987 /lib/libc-2.11.2.so 7f9e49060000-7f9e49064000 r--p 00157000 08:01 1438987 /lib/libc-2.11.2.so 7f9e49064000-7f9e49065000 rw-p 0015b000 08:01 1438987 /lib/libc-2.11.2.so 7f9e49065000-7f9e4906a000 rw-p 00000000 00:00 0 7f9e4906a000-7f9e49088000 r-xp 00000000 08:01 1438999 /lib/ld-2.11.2.so 7f9e49262000-7f9e49265000 rw-p 00000000 00:00 0 7f9e49280000-7f9e49287000 rw-p 00000000 00:00 0 7f9e49287000-7f9e49288000 r--p 0001d000 08:01 1438999 /lib/ld-2.11.2.so 7f9e49288000-7f9e49289000 rw-p 0001e000 08:01 1438999 /lib/ld-2.11.2.so 7f9e49289000-7f9e4928a000 rw-p 00000000 00:00 0 7fff8f2d8000-7fff8f2ed000 rw-p 00000000 00:00 0 [stack] 7fff8f3ff000-7fff8f400000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] Abortito
i file di argomento sono dei file di dati double contenenti non più di 200 colonne ciascuno ..
Spero possiate essermi d'aiuto..
Buona giornata

Rispondi quotando