出于某种原因,我得到了一个非常不正确的问题答案,所以我把这个printf用来尝试调试。
for (s = 0; s <= 100; s++) {
for (t = 0; t <= 100; t++) {
printf("At (%f,%f), spl = %f\n", s, t, spl(loc_data, s, t)); */
if (spl(loc_data, s, t) > 80) {
p++;
}
}
}
如果省略printf行,我会得到错误的答案。我认为它与内存分配或未初始化的变量有关,但这超出了我的能力范围。任何帮助将不胜感激。
整个代码:
#include <stdio.h>
#include <math.h>
typedef struct {
double x;
double y;
double W;
} data_t;
double spl(data_t *, double, double);
int main(int argc, char **argv) {
data_t loc_data[1000];
double spl0, p = 0, pp;
int i = 0, j = 0;
double s, t;
while (scanf("%lf %lf %lf", &loc_data[i].x, &loc_data[i].y, &loc_data[i].W) == 3) {
i++;
}
printf("\nStage 1\n=======\n");
printf("Number of sound sources: %d\n", i);
for (j = 0; j < i; j++) {
printf("%.1f meters east, %.1f meters north, power %1.5f Watts\n",
loc_data[j].x, loc_data[j].y, loc_data[j].W);
}
printf("\nStage 2\n=======\n");
spl0 = spl(loc_data, 0, 0);
printf("SPL at (0.0,0.0): %.1f dB\n", spl0);
printf("\nStage 3\n=======\n");
for (s = 0; s <= 100; s++) {
for (t = 0; t <= 100; t++) {
printf("At (%f,%f), spl = %f\n", s, t, spl(loc_data, s, t));
if (spl(loc_data, s, t) > 80) {
p++;
}
}
}
pp = p / 102.01;
printf("Points sampled: 10201\nAbove 80.0 dB: %.1f%%\n", pp);
return 0;
}
double spl(data_t *loc_data, double pointx, double pointy) {
int i = 0;
double r_sq, powi, spli, spl;
while (loc_data[i].W != 0) {
r_sq = pow(loc_data[i].x - pointx,2) + pow(loc_data[i].y - pointy,2);
powi = 10*log10(loc_data[i].W / pow(10,-12));
spli = powi + 10*log10((2 / (4 * M_PI * r_sq)) + (4 / (2.5 * M_PI * r_sq)));
spl = 10*log10(pow(10, spl/10) + pow(10, spli/10));
i++;
}
return spl;
}
抱歉格式不佳。
答案 0 :(得分:3)
您在函数spl
中初始化之前使用变量(spl()
):
double spl(data_t *loc_data, double pointx, double pointy) {
int i = 0;
double r_sq, powi, spli, spl;
while (loc_data[i].W != 0) {
r_sq = pow(loc_data[i].x - pointx,2) + pow(loc_data[i].y - pointy,2);
powi = 10*log10(loc_data[i].W / pow(10,-12));
spli = powi + 10*log10((2 / (4 * M_PI * r_sq)) + (4 / (2.5 * M_PI * r_sq)));
spl = 10*log10(pow(10, spl/10) + pow(10, spli/10));
// ^^^
i++;
}
return spl;
}
调用printf()
可能会影响变量恰好具有的值。
此外,您在loc_data
数组中读入了许多条目,但未将该信息传递给spl()
函数。在spl()
中,您将带有字段W
的数组条目视为“sentinel” - 数组的结尾。是否给定输入数据中的最后一个条目将具有零值?如果是这样,你应该告诉我们,并在阅读输入后检查一下。
答案 1 :(得分:2)
您没有以任何方式初始化loc_data
条目,这意味着它们将包含垃圾。在scanf
条目之后(确保在读取1000行后停止读取),用零填充数组的其余元素。我知道你说你已经尝试过了,但是在你发布的代码中看不到它。
此外,你应该将i
(在给它一个更好的名字之后)传递到spl
函数中,这样它就知道你有多少好的资源,而不是寻找一个0作为终结符,如果你有1000个好的资源可能不存在,或者如果某个资源的权力为0,则可能存在得太早。