2014-09-05 3 views
-6

В приведенном ниже коде отображается окно окна размера окна и сдвигается окно с помощью некоторых выборок 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 [i], когда вы делаете i ++ из-за определения int commands [3]; – duDE

+0

Почему ваш первый цикл while while не ограничен? Вы можете получить доступ к элементам для тех массивов, которые находятся за пределами границ. – PaulMcKenzie

ответ

2

1) Вы проверяете feof() первый, затем сделать fscanf(), , а затем не проверить возвращаемое значение (или перепроверить feof() по крайней мере (Возможно, вы были правы в конце файла до вызова fscanf(), или файл конфигурации может быть искажен, но вы не обнаружите его с вашим кодом.)

2) Ваш индексный диапазон проверяет (и ssorted realloc() s) выглядят изворотливыми. Но нет абсолютно никаких шансов, что я буду анализировать ваш код во время выполнения, тем более, что у меня нет примера с входным файлом.

У некоторых Machete Debugging ...

Edit: После комментарий JOOP наведен меня к мелкому шрифту вашего realloc()if заявления вокруг него), в отсутствии комментариев, объясняя, как именно вы ожидаете это для разработки, я скажу, что вы вызываете неопределенное поведение там.

+0

Так вы можете мне помочь, если я предоставил образец ввода? Я любитель программист в C, и я очень отчаянно хочу, чтобы это произошло. –

+0

@DeveloperbyBlood: В этой теме уже было много хорошего, нет, ** витального ** совета, за пределами «необходимого ввода образца». Например, ссылка, которую я опубликовал, должна дать ценный урок. Я предлагаю вам отступить от «желая, чтобы эта программа произошла» (что является плохим посылом для начинающих), и не спешите знакомиться с языком, его подводными камнями и его хорошими практиками. Код, который вы опубликовали, в основном FUBAR, и требует переосмысления и перезаписи. Вы можете исправить это самостоятельно, с терпением, и стать лучшим программистом в этом процессе. – DevSolar

+0

Итак, я вернулся и прочитал синтаксис, возвращал типы и использовал функции realloc(), sizeof() и понял, где я был неправ. Спасибо DevSolar за мотивирование и @joop за то, что он опроверг _crucial_ ошибку - эта ошибка заставила меня многому научиться. –