【发布时间】:2014-10-30 12:52:19
【问题描述】:
下面的代码获取一个大小为 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;
}
【问题讨论】:
-
嗯...您不能将代码剔除到显示错误所需的最低限度吗?我真的不想经历所有这些来找到出错的地方......
-
在执行 i++ 时检查 int commands[i],因为定义 int commands[3];
-
在进行 I/O 之前不要检查
feof(),它不会那样工作。 -
Sizeof 和你想的不一样。
if (sizeof(values)/sizeof(float)...完全错误 -
sizeof (values)表示:指向浮点数的指针的大小(values是指向浮点数的指针)sizeof (float)是浮点数的大小。根据您的平台,将它们分开可能会产生 1 或 2。将结果与arrayCounter-1进行比较通常会得出not equal的结果。 (但这将不取决于先前分配的 values 指向的对象的大小,这显然是您想要的)
标签: c file heap-memory stack-memory fclose