2015-11-23 3 views
0

Почему это бросает ошибку сегментации? Я отлаживаю его и сузил его до назначения масс в инструкции switch, как я должен это делать?Почему это бросает ошибку сегментации?

Вот мой код:

#include <stdio.h> 
#define MAX 100 


struct cg { 
    int x, y, mass; 
}; 
struct cg masses[MAX]; 

int numberOfEntries; 

int readin(void) { 
    FILE *file; 
    int massesRead, i, num, partRead = 0; 
    file = fopen("WeightData.txt", "r"); 
    if(file == NULL) { 
     printf("Error: can't open file.\n"); 
     return 1; 
    } else { 
     while(fscanf(file, "%d", &num) > 0) { 
      switch(partRead){ 
       case 0: 
        masses[i].x = num; 
        partRead++; 
        continue; 
       case 1: 
        masses[i].y = num; 
        partRead++; 
        continue; 
       case 2: 
        masses[i].mass = num; 
        massesRead++; 
        partRead = 0; 
        i++; 
        continue; 
      } 
     } 
    } 
    fclose(file); 
    numberOfEntries = massesRead; 
    return massesRead; 
} 

void computecg(int n_masses) { 
    int sum_of_xmass; 
    int sum_of_ymass; 
    int sum_of_mass; 
    for(int i=0; i< numberOfEntries; i++){ 
     sum_of_xmass += (masses[i].x * masses[i].mass); 
     sum_of_ymass += (masses[i].y * masses[i].mass); 
     sum_of_mass += (masses[i].mass); 
    } 
    int cg_x = sum_of_xmass/sum_of_mass; 
    int cg_y = sum_of_ymass/sum_of_mass; 

    printf("X = %d Y = %d.",cg_x, cg_y); 
} 

int main() { 
    int number; 
    if((number = readin()) > 0){ 
     computecg(number); 
    } 
    return numberOfEntries; 
} 
+2

Вы разместили свой код, но вы не объяснили, что ваш код должен сделать точно. прочитайте, как спросить http://stackoverflow.com/help/how-to-ask И как создать минимальный, полный и проверенный пример http://stackoverflow.com/help/mcve. – davejal

+0

Эта строка: 'void computecg (int n_masses) {' имеет параметр 'n_masses', но этот параметр не используется в этой функции. – user3629249

+0

Эта строка: 'while (fscanf (файл,"% d ", & num)> 0) {' не соответствует правильному значению. (см. справочную страницу для fscanf()) строка должна быть: 'while (fscanf (файл,"% d ", & num) == 1) { – user3629249

ответ

0

Очень вероятно, что вы назначить больше элементов массы, чем вы определили. Распечатайте свой индекс i в режиме чтения и проверьте, если он идет> 100.

1

Вы пишете такие вещи, как это:

masses[i].x = num; 

, но после того, как:

int massesRead, i, num, partRead = 0; 

вы никогда не присвоить значение i, поэтому, скорее всего, это какой-то огромное количество мусора, который на порядок выше, чем 100 , следовательно, вы выходите за пределы своего массива и получаете свой segfault.

У вас есть аналогичная проблема с никогда не инициализируется massesRead, а затем пытается сделать massesRead++;

Чтобы исправить, вы можете изменить:

int massesRead = 0, i = 0, num, partRead = 0; 
Смежные вопросы