아래 코드는 windowSize 크기의 창을 취해서 각 반복에서 일부 shiftSize 샘플만큼 창을 이동합니다.세그먼트 화 오류를 일으키는 코드 조각
나는 "printf()"디버깅을 비정상적으로 수행하여 코드가 세그먼테이션 오류시 오류를 발생시키는 것으로 나타났습니다. 누군가가 오류가 무엇인지 말해 줄 수 있습니까?
미리 감사드립니다.
코드 :.
이#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <tgmath.h>
int main()
{
FILE *fp, *in ;
in = fopen ("controlFile.txt", "r");
if (in == NULL) {
fprintf(stderr, "Can't open input file in.list!\n");
exit(1);
}
char equalTo, commandType[20];
int commands[3]; int i=0;
while (!feof(in)){
fscanf(in, "%s %c %d\n", commandType, &equalTo, &commands[i]);
printf("%s %c %d\n", commandType, equalTo, commands[i]);
i++;
}
fclose(in);
fp = fopen ("OriginalData.txt", "r");
if (fp == NULL) {
fprintf(stderr, "Can't open input file in.list!\n");
exit(1);
}
//Note: time is milliseconds. Therefore, multiplying factor is 1000
int mulFactor =1000;
int samplesPerSecond = commands[0];
int windowSize = floor((commands[1]*mulFactor)/samplesPerSecond); //This will be our array size or rank for cuda Program
int shiftSize = floor ((commands[2]*mulFactor)/samplesPerSecond);
int fileCounter = 0, breakFlag=0;
int allocationSize = 100;
float *values, test;
values = (float*) malloc (100*sizeof(float));
if (values==NULL)
{
printf("Error allocating memory!");
exit (1);
}
int localCounter = 0;
int arrayCounter = 0;
int copyCounter = windowSize - shiftSize;
// printf("SamplesPerSecond: %d\n windowSize: %d\n shiftSize: %d\n copyCounter: %d\n", samplesPerSecond, windowSize, shiftSize, copyCounter);
int temp;
float* check;
while (!feof(fp)){
localCounter = 0;
if (fileCounter==0){
while (!feof (fp) && localCounter!=windowSize){
fscanf(fp, "%f", &values[arrayCounter]);
printf("%f\n", values[arrayCounter]);
localCounter++;
fileCounter++;
arrayCounter++;
//printf("%f\n", values[arrayCounter]);
if (sizeof(values)/sizeof(float)==arrayCounter-1){
values = (float*)realloc (values, (size_t)(allocationSize*sizeof(float)));
if (values==NULL){
printf("Cannot allocate memory\n");
exit(1);
}
}
}
}
else{
temp = copyCounter;
// printf("Here\n");
while (temp!=0 && !feof(fp)){
//if (feof(fp)) {printf ("Been Here\n");breakFlag = 1; break;}
values[arrayCounter] = values [arrayCounter-copyCounter];
printf("%f\n", values[arrayCounter]);
temp--;
arrayCounter++;
localCounter++;
if (sizeof(values)/sizeof(float)==arrayCounter-1){
values= (float*)realloc (values, allocationSize*sizeof(float));
if (values==NULL){
printf("Cannot allocate memory\n");
exit(1);
}
}
}
while (localCounter!=windowSize && !feof(fp)){
fscanf(fp, "%f", &values[arrayCounter]);
printf("%f\n", values[arrayCounter]);
localCounter++;
fileCounter++;
arrayCounter++;
if (sizeof(values)/sizeof(float)==arrayCounter-1){
values= (float*)realloc (values, allocationSize*sizeof(float));
if (values==NULL){
printf("Cannot allocate memory\n");
exit(1);
}
}
}
}
}
fclose(fp);
//int numOfFrames = floor((fileCounter-1)/shiftSize); //Count the number of lines when fp is increasing
//int j;
/* for(j=0; j<(sizeof(values)/sizeof(float)); j++){
printf ("%f\n", values[j]);
}
*/
return 0;
}
흠 ... 오류를 표시하는 데 필요한 최소한의 코드를 선택하지 못했습니까? 나는 그것이 잘못되어가는 지점을 찾기 위해 모든 일을 겪고 싶지 않다. ... – DevSolar
정의 int 명령 [3] 때문에 i ++ 할 때 int 명령 [i]을 확인하십시오; – duDE
왜 첫 번째 while 루프가 끝나지 않습니까? 범위를 벗어나는 배열 요소를 액세스 할 수 있습니다. – PaulMcKenzie