【发布时间】:2010-03-15 13:47:10
【问题描述】:
我有一个函数可以处理一些数据并找到对具有最低错误的数据进行分类的阈值。它看起来像这样:
void find_threshold(FeatureVal* fvals, sampledata* data, unsigned int num_samples, double* thresh, double* err, int* pol) {
//code to calculate minThresh, minErr, minPol omitted
printf("minThresh: %f, minErr: %f, minPol: %d\n", minThresh, minErr, minPol);
*thresh = minThresh;
*err = minErr;
*pol = minPol;
}
然后在我的测试文件中我有这个:
void test_find_threshold() {
//code to set up test data omitted
find_threshold(fvals, sdata, 6, &thresh, &err, &pol);
printf("Expected 5 got %f\n", thresh);
assert(eq(thresh, 5.0));
printf("Expected 1 got %d\n", pol);
assert(pol == 1);
printf("Expected 0 got %f\n", err);
assert(eq(err, 0.0));
}
运行,测试通过,输出如下:
minThresh: 5.000000, minErr: 0.000000, minPol: 1
Expected 5 got 5.000000
Expected 1 got 1
Expected 0 got 0.000000
但是,如果我从 find_threshold 中删除对 printf() 的调用,测试会突然失败!注释掉断言以便我可以看到返回的内容,输出是:
Expected 5 got -15.000000
Expected 1 got -1
Expected 0 got 0.333333
我无法理解这一点。
【问题讨论】:
-
问题可能出在你省略的代码中(//省略了计算minThresh、minErr、minPol的代码)
-
你写的第一眼看起来不错,所以实际的错误可能在于你省略的代码。您确定当您删除
printf调用时,它之后的代码仍在执行吗?您可以在源代码级调试器(例如 gdb)中运行它吗? -
在哪里以及如何定义 minThresh、minErr、minPol?
-
这可能是一个优化器错误。我会尝试在禁用所有优化的情况下进行编译,看看问题是否仍然存在。
-
在发布到 SO 之前不要从测试用例中删除代码!你应该做的是编写一个最小的测试用例——你无法解释——然后发布。更多建议:sscce.orgxs4all.nl/~weegen/eelis/iso-c++/testcase.xhtml