2016-09-06 3 views
0

정상적으로 작동하는 규제 목적으로 곡선을 생성하는 코드가 있습니다.간단한 calloc과 FILE 코드가 윈도우에서 무작위로 충돌 함

리눅스 환경에서 왔기 때문에 나는 직장에서 사용해야하는 Windows에서 코딩하는 법을 모르고 있었기 때문에 Code : Blocks를 다운로드하여 MinGW으로 다운로드했습니다.

이제 문제는 다음과 같습니다. 내 코드는 작동하지만 가끔 충돌합니다. 나는 리눅스에서 그것을 시도했지만 아무런 문제없이 실행하고있다. 그러나 Windows에서는 때때로 작동 할 것이고 때때로 그렇지 않을 수도있다.

Problem signature: 
    Problem Event Name: APPCRASH 
    Application Name: TabGen.exe 
    Application Version: 0.0.0.0 
    Application Timestamp: 02881c68 
    Fault Module Name: ntdll.dll 
    Fault Module Version: 6.1.7601.23418 
    Fault Module Timestamp: 5708a73e 
    Exception Code: c0000005 
    Exception Offset: 00032a62 
    OS Version: 6.1.7601.2.1.0.256.48 
    Locale ID: 2055 
    Additional Information 1: 0a9e 
    Additional Information 2: 0a9e372d3b4ad19135b953a78882e789 
    Additional Information 3: 0a9e 
    Additional Information 4: 0a9e372d3b4ad19135b953a78882e789 

상당히 솔직히 말하면, 나는 정말로 이해하지 못합니다. 분명히 "액세스 위반"을 의미하는 "Exception code c0000005 windows"를 조사해 보았지만, 때로는 때때로 작동하지 않는다고 명시되어 있기 때문에 어디에서 왔는지 이해할 수 없습니다.

MinGW와 관련이 있습니까? 내 코드에서 뭔가 잘못 했니? 함수 mk_cp_table (항상 4096 값을 사용하므로 함수 매개 변수가 아닌 이유입니다)하지만 꽤 괜찮습니다.

또한 배열 대신 calloc을 사용하는 이유에 대해 궁금한 점이 있다면 이해가 안되는 오류 때문입니다. 마지막 함수의 마지막에있는 fprintf는 배열에 값이 있으면 작동하지 않습니다. 그러나 printf만으로도 완벽하게 작동하지만 fprintf는 실행할 때마다 빈 파일 만 남았습니다.

아이디어가 있으십니까?

내 코드 : 완성도를 들어

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

void tab2file(FILE*, int, int*); 
void mk_cp_table (int*, float, float, float, int, float, float, int); 

int main (void) 
{ 
    FILE* cp_file = fopen("cp_table.txt", "w"); 

    if (cp_file == NULL) 
    { 
     perror("failed fopen for cp_file\n"); 
     exit(EXIT_FAILURE); 
    } 

    int* cp_table = calloc((size_t) 4096, sizeof (int)); 

    if (cp_table == NULL) 
    { 
     fclose(cp_file); 

     perror("failed calloc for cp_table\n"); 
     exit(EXIT_FAILURE); 
    } 

    /* Generate curves */ 

    mk_cp_table(
     cp_table, 
     0.142,  /* scale */ 
     20,   /* zeroed distance 0 (negative part) */ 
     0.04,  /* slope 0 */ 
     120,  /* range 0 */ 
     20,   /* zeroed distance 1 (positive part) */ 
     0.04,  /* slope 1 */ 
     120   /* range 1 */ 
    ); 

    printf("\ntable generated\n"); 

    tab2file(cp_file, 4096, cp_table); 

    printf("\ntables written to files\n"); 

    fclose(cp_file); 
    free(cp_table); 

    return EXIT_SUCCESS; 
} 

void tab2file(FILE* file, int size, int* table) 
{ 
    int i; 

    for (i = 0; i < size; i++) 
     fprintf(file, "%d\n", table[i]); 
} 

void mk_cp_table(int* table, float scale, float zeroes_0, float slope_0, int range_0, float zeroes_1, float slope_1, int range_1) 
{ 
    int i; 
    int value; 

    zeroes_0 = zeroes_0/scale; 
    zeroes_1 = zeroes_1/scale; 

    for (i = 0; i < 2048; i++) 
    { 
     if (i < zeroes_1) 
      value = 0; 

     else 
      value = (i - zeroes_1) * slope_1; 

     if (value > range_1) 
      value = 127; 

     table[i] = 0; 
    } 

    for (i = 0; i < 2048; i++) 
    { 
     if (i < zeroes_0) 
      value = 0; 
     else 
      value = (zeroes_0 - i) * slope_0; 

     if (value < -range_0) 
      value = -127; 

     table[4096 - i] = value; 
    } 
} 
+3

'table [4096-i] = value' 이것은'i' == 0 일 때'table'의 범위 밖에서 씁니다. – Michael

+0

@Michael : 그것은 텔레파시 다. 나는 정확하게 똑같은 것을 논하려고했다. –

+0

@ 루다 오타쿠 당신은 한계를 넘어 서서 프로그램의 마지막 줄에있는 seg fault와 같은 윈도우를 경험하고 있습니다. – gowrath

답변

1

, 대답없는 부분에 남아 있지 않습니다이 질문에, 당신은 for 루프에서 프로그램의 마지막 줄에 아웃 오브 바운드 작성 그래서 :

for (i = 0; i < 2048; i++) 
{ 
    if (i < zeroes_0) 
     value = 0; 
    else 
     value = (zeroes_0 - i) * slope_0; 

    if (value < -range_0) 
     value = -127; 

    table[4096 - i] = value; // out of bounds when i = 0. 
} 

이로 인해 액세스 위반으로 인해 seg 오류와 동일한 창이 발생합니다. 당신이 valgrind에서 실행했다면 유닉스에서도이 사실을 알 수 있습니다. 그것은 세그먼트 화 잘못 알고 보니

+0

Syncro! 나는 나 자신의 대답을 동시에 게시했다.감사 ! – saeleko

0

, 난 당신이 생각 코드의 일부에 너무 많은 초점을 때때로 때 0

동일 때 배열의 범위를 벗어 될 것이라고 table[4096 - i] = value;했다 네가 일하고 있다고 생각했던 부분을 확인하는 것을 잊어 버린 채로 일하고 있지 않았다.

2

4096 개의 요소 배열에 대해 4095는 사용할 수있는 최대 유효 인덱스입니다. 문 table[4096 - i] = value;은 의 범위를 벗어나는 i == 0 일 때 table[4096]에 기록합니다.

아마도 당신은 table[4095 - i] = value; 일을 의미하는 것이므로 4095..2048의 색인을 줄 것입니다.

관련 문제