2015-07-10 2 views
1

Все, кажется, прекрасно работать, за исключением, когда моя программа пытается вернуть 0, который, когда я получаю сообщение об ошибке:сигнал SIGABRT по возвращении 0

Thread_1: signal SIGABRT 

Я не уверен, что я делаю неправильно, но я думаю, возможно, я использую свои указатели (передавая массив двойников по ссылке). Я считаю, что это связано с тем, когда моя память освобождается, я немного новичок, так что трудно понять это. Благодаря!

EDIT: readGrades() читает 4 целых чисел из текстового файла input.txt и добавить их в массив, который был принят в

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

/* 
* readGrades() 
* INPUT: double array of grades (double grades[]) 
* OUTPUT: number of grades read (int numOfGradesRead) 
*/ 
int readGrades(double (*grades)[]) { 

int numOfGradesRead = 0, 
    count = 0, 
    numRead; 

char buf[1000]; 
FILE *file = fopen("input.txt", "r"); 

if (file == NULL) { 
    perror("Can't open file"); 
} else { 
    while (fgets(buf, sizeof(buf), file)) { 

     // Convert buf to integer 
     numRead = atoi(buf); 

     // Add number read to grades[] 
     if (numRead != -999) { 
      (*grades)[count] = numRead; 
      numOfGradesRead++; 
      count++; 
     } 
    } 
} 

fclose(file); 

return numOfGradesRead; 
} 

void frequency(double grades[], int numOfGrades) { 

} 

int main() { 

double grades[100]; 
int i; 

// Initialize grades values to 0 
for (i = 0; i < sizeof(grades)/sizeof(int); i++) { 
    grades[i] = 0; 
} 

int numOfGradesRead = readGrades(&grades); 

for (i = 0; i < 4; i++) { 
    printf("%f", grades[i]); 
} 

return 0; 
} 

ответ

4

Основная ошибка линия:

for (i = 0; i < sizeof(grades)/sizeof(int); i++) { 

В результате этой ошибки вы устанавливаете значение элементов grades с использованием связанных индексов, что приводит к неопределенному поведению.

Это должно быть

for (i = 0; i < sizeof(grades)/sizeof(double); i++) { 
            // ^^^^^^^ Needs to be double not int 

Вы можете использовать соглашение

for (i = 0; i < sizeof(grades)/sizeof(grades[0]); i++) { 

, чтобы сделать код более надежным.

Кроме того, вместо использования жесткого кодированного номера 4 в цикле for для печати оценок вы, вероятно, захотите использовать numOfGradesRead. Кроме того, распечатайте пробел или новую строку между оценками, чтобы упростить чтение.

for (i = 0; i < numOfGradesRead; i++) { 
    printf("%f\n", grades[i]); 
} 
+0

Hm похоже, что это также исправило проблему! Большое спасибо, я не поймал эту ошибку. Спасибо за другие указатели, очень полезно. – Brejuro