2010-05-27 40 views
0

進一步開發昨天的代碼(seg fault caused by malloc and sscanf in a function),我嘗試了一些在網上找到的教程來生成2-dim vla。但我在(*data)[i][j]=atof(p);處遇到了分段錯誤。該方案被認爲讀取矩陣出的文本文件,並且將其加載到二維數組(COLS 1-9)和一維數組(COL 10)在分段錯誤中生成二維Vla結束

[實施例代碼]

#include<stdio.h> 
#include<stdlib.h> 
#include<math.h> 
#include<string.h> 

const int LENGTH = 1024; 

void read_data(float ***data, int **classes, int *nrow,int *ncol, char *filename){ 
    FILE *pfile = NULL; 
    char line[LENGTH]; 
    if(!(pfile=fopen(filename,"r"))){ 
    printf("Error opening %s.", filename); 
    exit(1); 
    } 
    int numlines=0; 
    int numcols=0; 
    char *p; 

    fgets(line,LENGTH,pfile); 
    p = strtok (line," "); 
    while (p != NULL){ 
    p = strtok (NULL, ", ");  
    numcols++; 
    } 
    while(fgets(line,LENGTH,pfile)){ 
    numlines++; 
    } 
    rewind(pfile); 
    int numfeats=numcols-1; 
    *data=(float**) malloc(numlines*sizeof(float*)); 
    *classes=(int *)malloc(numlines*sizeof(int)); 
    if(*classes == NULL){ 
    printf("\nOut of memory."); 
    exit(1); 
    } 

    int i=0; 
    while(fgets(line,LENGTH,pfile)){ 
    p = strtok (line," "); 
    for(int j=0;j<numfeats;j++) 
     { 
     (data)[i]=malloc(numfeats*sizeof(float)); 
     printf("%i ",i); 
     (*data)[i][j]=atof(p); 
     p = strtok (NULL, ", "); 
     } 
    (*classes)[i]=atoi(p); 
    i++; 
    } 
    fclose(pfile); 
    *nrow=numlines; 
    *ncol=numfeats; 
} 

int main() { 
    char *filename="somedatafile.txt"; 
    float **data2; 
    int *classes2; 
    int r,c; 

    read_data(&data2,&classes2, &r, &c,filename) ; 
    for(int i=0;i<r;i++){ 
    printf("\n"); 
    for(int j=0;j<c;j++){ 
     printf("%f",data2[i][j]); 
    } 
    } 
    return 1; 
} 

[somedatafile.txt內容]

50 21 77 0 28 0 27 48 22 2 
55 0 92 0 0 26 36 92 56 4 
53 0 82 0 52 -5 29 30 2 1 
37 0 76 0 28 18 40 48 8 1 
37 0 79 0 34 -26 43 46 2 1 
85 0 88 -4 6 1 3 83 80 5 
56 0 81 0 -4 11 25 86 62 4 
55 -1 95 -3 54 -4 40 41 2 1 
53 8 77 0 28 0 23 48 24 4 
37 0 101 -7 28 0 64 73 8 1 
... 
+1

如果你實際需要數據是一個矩陣,即n * m值,這將更容易實現。然後你可以爲整個矩陣做一個單獨的malloc(),一旦你找出了大小。 – unwind 2010-05-27 08:58:27

回答

1

您是不是要找 (*data)[i]=malloc(numfeats*sizeof(float));

而不是
(data)[i]=malloc(numfeats*sizeof(float))

+0

噢,夥計。你認爲你已經檢查了每個組合,然後。謝謝Chip! – Framester 2010-05-27 09:22:35

+0

適合所有人:) – Chip 2010-05-27 20:11:36