2012-01-08 1 views
0

2 차원 배열을 출력하고 바이너리로 입력하려고합니다.이진 데이터 출력 및 입력 C

내 이차원 배열하기 구조

typedef struct matrep { 
    unsigned rows, columns; 
    double *data; 
} MATRIX; 

내에 포함되고, I 출력 다음 함수를 전체 구조

void matrix_writebinary(MATRIX *mat,FILE *fp)  
{ 
    int a=mat->rows,b=mat->columns; 
    fwrite(&a,sizeof(int),1,fp); 
    fwrite(&b,sizeof(int),1,fp); 
    fwrite(mat->data,sizeof(double) * a * b,1,fp); 
    rewind(fp); 
} 

입력 구조에 다음과 같은 기능을 만든

MATRIX *matrix_readbinary(MATRIX *mat,FILE *fp)  
{ 
    MATRIX matrix; 
    MATRIX *ptr; 
    ptr=&matrix; 
    int a,b; 

    double *tempptr=ptr->data; 
    fread(&a,sizeof(int),1,fp); 
    fread(&b,sizeof(int),1,fp); 

    for (int i=0; i < a; i++) 
    { 
     for (int j=0; j < b; j++) 
     { 
      double value=0.0;  
      fread(&value,sizeof(double),1,fp); 
      *(tempptr++)=value; 
     } 
    } 

    rewind(fp); 
    matrix.rows=a; 
    matrix.columns=b; 
    return(ptr); 
} 

나는을 확인했다.및 mat->columns은 입력과 printf 기능을 사용하여 제대로 출력하지만, 코드에 줄을

*(tempptr++)=value; 

에 도달 할 때 나는 내 포인터를 혼동하고있어 하더군요 세그먼트 오류가 발생 된 둘. 필자는 파일을 성공적으로 출력하고 fprintf 및 fscanf를 입력하여 함수 밖에서 파일을 닫거나 조작하는 데 문제가 있다고 생각하지 않습니다.

아무도 내 포인터를 정렬 할 수 있습니까?

답변

4

데이터에 대한 메모리를 할당하지 않았습니다. 할당을 추가해야합니다.

ptr->data = malloc(sizeof(double) * ptr->rows * ptr->columns); 
double *tempptr = ptr->data; 

/* ... */ 

또한 임시 주소를 반환하지 않아야합니다. 그래서 매트릭스 자체도 동적으로 할당 할 필요가 : 당신은, 직접 &ptr->rows&ptr->columns에 중간 변수에 대한 필요성을 읽을 수

MATRIX * ptr = malloc(sizeof(MATRIX)); 

. 한 번에 모든 데이터를 읽을 수도 있습니다.

모두 함께 퍼팅 :

MATRIX *matrix_readbinary(FILE * fp) 
{ 
    MATRIX * ptr = malloc(sizeof(MATRIX)); 

    fread(&ptr->rows, sizeof(unsigned int), 1, fp) 
    fread(&ptr->columns, sizeof(unsigned int), 1, fp) 

    ptr->data = malloc(sizeof(double) * ptr->rows * ptr->columns); 

    fread(ptr->data, sizeof(double), ptr->rows * ptr->columns, fp) 

    return ptr; 
} 

즉 할당 된 데이터 메모리가없는 일부 어설픈 매트릭스 구조를 제공 할 필요 이후는 MATRIX 포인터를 전달 권하고 싶지 않다, 당신은 것 책임 악몽에서.

은 해당 청소 기능 잊지 마세요 : 당신이 차종의 의미가 무슨 말을하는지 답장을 보내

void matrix_free(MATRIX * mat) 
{ 
    free(mat->data); 
    free(mat); 
} 
+0

감사합니다 아주 많이, 나는 메모리를 할당하지 않은 것을 깨닫지 못했다. 그러나 내가 "MATRIX * ptr = malloc (sizeof (MATRIX)); 줄에서 'void *'에서 'MATRIX *'로의 잘못된 변환, 및 "ptr-> data = malloc (sizeof (double) * ptr-> rows * ptr-> columns) 행에서 'void *'에서 'double *'으로 변환 할 수 없습니다. – Leavenotrace

+0

나는 당신이 C를 쓰고 있다고 말한 줄 알았는데, 거짓말을 했음에 틀림 없다. :-) (당신이 쓰고있는 언어가 무엇인지 명확히 밝히는 것이 중요합니다. C++에서는 전체 코드가 끔찍하고 완전히 다른 것을했을 것입니다.) –

+0

정말 죄송 합니다만, 아프게 되겠지만, 변경 사항을 제안했습니다. 프로그램은 여전히 ​​세분화 오류로 인해 종료됩니다. – Leavenotrace