【发布时间】:2015-11-23 00:33:21
【问题描述】:
为什么这会引发分段错误?我正在调试它,并将其范围缩小到 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;
}
【问题讨论】:
-
您放置了您的代码,但您还没有解释您的代码究竟需要做什么。请阅读如何提问stackoverflow.com/help/how-to-ask 以及如何创建最小、完整和可验证的示例stackoverflow.com/help/mcve。
-
这一行:
void computecg(int n_masses) {有参数“n_masses”,但函数中没有使用该参数。 -
这一行:
while( fscanf( file, "%d", &num ) > 0) {没有与正确的值进行比较。 (参见 fscanf() 的手册页)该行应该是:`while( fscanf( file, "%d", &num ) == 1) { -
在 'switch()' 案例中,1) 以 'break;' 结束每个案例不是“继续;”并为“partread”不是 0 或 1 或 2 时添加一个“默认”情况
-
这种行:
masses[i].x = num;正在使用未初始化的变量 'i' 这种行:massesRead++;正在使用未初始化的变量 'massesRead'。
标签: c segmentation-fault