정상적으로 작동하는 규제 목적으로 곡선을 생성하는 코드가 있습니다.간단한 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;
}
}
'table [4096-i] = value' 이것은'i' == 0 일 때'table'의 범위 밖에서 씁니다. – Michael
@Michael : 그것은 텔레파시 다. 나는 정확하게 똑같은 것을 논하려고했다. –
@ 루다 오타쿠 당신은 한계를 넘어 서서 프로그램의 마지막 줄에있는 seg fault와 같은 윈도우를 경험하고 있습니다. – gowrath