2010-05-27 2 views
0

어제 (seg fault caused by malloc and sscanf in a function)의 코드를 개발하면서 인터넷에서 2 차원 vla를 생성하기 위해 찾은 자습서를 사용하여 시도했습니다. 하지만 (*data)[i][j]=atof(p);에 세분화 오류가 있습니다. 프로그램은 (COLS 1-9)와 1D 배열 (COL 10)2 차원 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; 
} 
를 텍스트 파일에서 매트릭스를 판독하고, 2 차원 배열로로드하도록되어

[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

답변

1

(*data)[i]=malloc(numfeats*sizeof(float));

을 의미입니까?

대신
(data)[i]=malloc(numfeats*sizeof(float))

?

+0

오, 이런. 당신은 당신이 모든 조합을 확인한 다음 그 생각을했다고 생각합니다. 칩 감사합니다! – Framester

+0

우리 모두에게 일어납니다 :) – Chip