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 ..
codice:
#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;
}
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 messaggio
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
se io invece che n metto un numero molto grande .. nessun problema ..
i file di argomento sono dei file di dati double contenenti non più di 200 colonne ciascuno ..
Spero possiate essermi d'aiuto..
Buona giornata