2014-09-05 4 views
-6

아래 코드는 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; 
} 
+2

흠 ... 오류를 표시하는 데 필요한 최소한의 코드를 선택하지 못했습니까? 나는 그것이 잘못되어가는 지점을 찾기 위해 모든 일을 겪고 싶지 않다. ... – DevSolar

+0

정의 int 명령 [3] 때문에 i ++ 할 때 int 명령 [i]을 확인하십시오; – duDE

+0

왜 첫 번째 while 루프가 끝나지 않습니까? 범위를 벗어나는 배열 요소를 액세스 할 수 있습니다. – PaulMcKenzie

답변

2

1) 당신은 feof() 먼저 다음fscanf(), 다음은 반환 값을 확인하지 않습니다 할 확인 (또는 적어도 feof()을 다시 확인 (fscanf() 호출 전에 파일의 끝 부분에 있거나 구성 파일의 형식이 잘못되었지만 코드에서이를 감지하지 못했습니다.

2) 색인 범위 검사 (및 realloc() ssorted) dodgy보세요. 하지만, 특히 입력 파일 예제가 없기 때문에 코드의 런타임 분석을 수행 할 가능성은 전혀 없습니다. 일부 Machete Debugging를 수행

...

편집 : 윱의 의견은 당신이 기대하는 방법을 정확하게 설명하는 주석의 부재에 realloc()의 글씨 (및 주변의 if 문)으로 저를 지적 후 해결하려면, 정의되지 않은 동작을 호출하고 있다고 말할 것입니다.

+0

샘플 입력을 제공하면 도움이 될 수 있습니까? C에서 아마추어 프로그래머 오전 및 정말 필사적으로 일어나고 있어요. –

+0

@DeveloperbyBlood : "샘플 입력 필요"를 넘어 이미이 스레드에서 제공되는 좋은, 이상한, ** 중요한 ** 조언이 많이 있습니다. 예를 들어 제가 게시 한 링크는 가치있는 교훈을 제공해야합니다. 나는 "이 프로그램을 시작하고 싶다"(초보자를 시작하기에 나쁜 전제)에서 물러나고, 언어, 함정 및 좋은 습관에 익숙해지는 시간을 가져라. 게시 한 코드는 기본적으로 FUBAR이며 다시 생각하고 다시 작성해야합니다. 인내심을 가지고이 문제를 직접 해결하고 더 나은 프로그래머가 될 수 있습니다. – DevSolar

+0

그래서 다시 돌아가서 구문, 반환 형식 및 realloc(), sizeof() 함수 사용법을 읽고 어디에서 잘못되었는지 깨달았습니다. 동기 부여에 대한 DevSolar와 _crucial_ 실수를 강조하기위한 @joop에 감사드립니다. 실수로 저를 많이 배웠습니다. –

관련 문제