2014-12-03 3 views
-2

fwrite() 함수를 사용하는 동적 배열. 문제는 fopen() 내부의 포인터입니다.C - fwrite 함수에 의한 동적 배열, 포인터

성공적으로 fwrite() 파일로 동적 배열, 주요 기능에서 fwrite() 이동하려고 할 때 문제가 포인터와 함께 발생합니다. 특정 배열에서 가리키는 포인터는 fwrite() 안에 있습니다.

여기에 관련 코드가 있습니다.

main() 
{ 
... 
    unsigned char **pixels_array = NULL; //write this array to file 
    allocateArray(&pixels_array); //prepare array 
    fillArray(&pixels_array); 
    writeFile(&pixels_array); 
    freeArray(&pixels_array); 
... 
} 

writeFile(unsigned char ***pixels_array) //param is pointer to double pointer array 
{ 
    ... 
    FILE *file = fopen(output_filename, "wb"); //open file 
    if (file == NULL) 
    { 
    printf(ERROR_OPEN_FILE_MSG); 
    return ERROR_OPEN_FILE; 
    } 

    for(i = 0; i < height; i++) //writing row by row of the array to file 
    { 
    //PROBLEM 
    //seg fault when running with current pointers to pixels_array in fwrite() 
    fwrite((&(*(*pixels_array)))[i], sizeof(unsigned char) * padded_width, 1, file); 
    } 
    fclose(file); 
} 

allocateArray(unsigned char ***pixels_array) 
{ 
    ... 
    *pixels_array = (unsigned char**)malloc(height * sizeof(unsigned char*)); //image y coord. 
    ... 
    for(i = 0; i < height; i++) 
    { 
    //(allocate scanlines) image x coord., no sizeof(unsigned char*) because == 1 
    (*pixels_array)[i] = (unsigned char*)malloc(width); 
    ... 
    } 
    ... 
} 
+1

왜이 복잡한 시퀀스를 (? (* pixels_array)) [i]'사용해야 했습니까? 더 간단하고 직선적으로 만들 수 없습니까? –

+0

메신저가 c89 표준으로 제한되어 있으므로이 솔루션이 적합합니다. 할당 된 포인터 배열은 이미지의 픽셀을 저장하는 데 사용됩니다. 이미지 크기는 가변적이다. –

+1

'c89 '가 간단한 작업을위한 복잡한 문장을 쓸 것을 요구할 때부터? 대신'pixels_array [i]'를 사용할 수 없습니까? –

답변

0

할당에 약간의 오류가있을 때 포인터를 처리 할 때 당신은 독방 감금 오류를 얻을, 그래서 요 너무 당신의 할당 기능을 제공 할 수 있습니까?

그리고 당신은 간단하게 사용할 수있는 파일에 행을 작성하려는 경우 :

fwrite((*(pixels_array))[i],rest is same); 
+0

할당을 추가했으나 여전히 솔루션에 seg 오류가 있습니다. frwite를 별도의 함수에 넣지 않고 main 함수에서 이진 파일을 작성할 때 모든 것이 잘 작동했기 때문에 할당 ID가 놀랍습니다. thx –

+0

해결 방법 : fwrite ((* (pixels_array)) [i], 나머지는 동일합니다.); 세분화 오류는 폭과 높이에 대해 두 가지 잘못된 값을 제공하는 fwrite 용 이전 함수의 골격을 사용했기 때문에 발생했습니다. 모두에게 감사드립니다 :) –

+0

도움이 될 great.happy 느낌 그래서 그것은 내 첫 번째 솔루션을했다 : D 조 –

0

이 당신이 게시 코드에서 실제로 아무 문제가 없지만, 그것은 불필요하게 복잡하다. 나는 다음과 같이 쓸 것입니다 :

unsigned char **allocateArray (int width, int height) 
{ 
    unsigned char **pa; 
    int i; 
    int nomem = 0; 

    pa = malloc (height * sizeof *pa); 
    if (pa) { 
    for (i = 0; i < height; i++) { 
     pa[i] = malloc (width * sizeof *pa[i]); 
     if (!pa[i]) { 
     nomem = 1; 
     } 
    } 

    if (nomem) { 
     for (i = 0; i < height; i++) { 
     free (pa[i]); 
     } 
     free (pa); 
     pa = NULL; 
    } 

    } 

    return pa; 
} 

void writeFile(unsigned char **pa) 
{ 
    int i; 

    FILE *file = fopen(output_filename, "wb"); 
    if (file == NULL) { 
    printf(ERROR_OPEN_FILE_MSG); 
    return ERROR_OPEN_FILE; 
    } 

    for(i = 0; i < height; i++) { 
    if (!fwrite(pa[i], padded_width * sizeof *pa[i], 1, file)) { 
     /* Error */ 
    } 
    } 
    fclose(file); 
} 

int main(void) 
{ 
    unsigned char **pixels_array = allocateArray(padded_width, height); 
    fillArray(pixels_array); 
    writeFile(pixels_array); 
    freeArray(pixels_array); 

    return 0; 
}