0

出于某种原因,我得到了一个非常不正确的问题答案,所以我输入了这个 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;
}

为糟糕的格式道歉。

4

2 回答 2

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视为“哨兵” - 数组的末尾。输入数据中的最后一个条目是否为零?如果是这样,您可能应该让我们知道,并可能在阅读完输入后检查一下。

于 2012-05-20T06:41:01.077 回答
2

您没有loc_data以任何方式初始化条目,这意味着它们将包含垃圾。输入条目后scanf(确保在阅读 1000 行后停止阅读),用零填充数组的其余元素。我知道您说您已经尝试过了,但是在您发布的代码中看不到它。

此外,您应该i(在给它一个更好的名称之后)传递给spl函数,以便它知道您有多少好的来源,而不是寻找 0 作为终止符,如果您有 1000 个好的来源,它可能不存在,或者可能存在如果某个源的幂为 0,则为时过早。

于 2012-05-20T06:40:30.247 回答