我正在调用下面的函数,它计算传入的变量中给出的值。但是,当函数(calculate_distance
)运行时,传递给函数的变量(loc_ptr
)中包含的数据似乎会发生变化。
我已经逐步完成了代码,发现变量loc_ptr
在函数调用中受到影响,而不是在函数本身内部。
在while循环中调用该函数。 while循环的第一次迭代正确计算,只有在后续迭代中才会出现问题。
_注意:location是一个typedef结构,包含char * name,double latitude,double longitude。 options
是一系列双打._
double calculate_distance(location from, location to) {
return to.latitude - from.latitude;
}
main() {
location current_location = {"Plymouth", 50.378565, -4.134339};
location locations[3] = {{"Padstow", 50.5384, -4.9378},
{"Newquay", 50.412, -5.0757},
{"Boscastle", 50.684, -4.6929}};
// create a pointer to an array of locations.
location* loc_ptr;
loc_ptr = &locations[0];
double options[3];
int i = 0;
int position = 3;
while (i < position) {
// calculate the distance between the current and other locations
options[position] = calculate_distance(current_location,
loc_ptr[position]);
position--;
}
// handle the rest of the algorithm
}
注意:代码是较大算法的一部分,它会缩短,因为它会很长。 while循环结束后,重建loc_ptr
数组以删除其中一个元素。
答案 0 :(得分:2)
您的示例代码确实......
因各种原因,拼写错误和遗漏而无法编译;以及
不包含任何可以解释您观察到的行为的明显错误。
它也是荒谬的(例如,locations
不存在)。这意味着你要么看到鬼,要么你的示例代码没有显示真正的代码真正做的事情(并且不再包含有问题的bug,因为你将它删除了)。
无论哪种方式,没有人能说出来,因为你没有提供足够的信息。
尝试this little debugging technique。
编辑:更新问题后,至少您的示例代码正确编译(在我添加typedef之后)。它访问第一个循环上的未定义内存(因为定义为例如options[3]
的数组确实具有元素options[0] .. options[2]
,但不具有options[3]
)。 不发生的是loc_ptr
的值以任何方式发生变化(正如我使用调试器验证的那样)。所以,要么你仍然看到鬼,或者你的示例代码没有表现出你所遇到的问题(以它为例来说它毫无价值)。我的建议(见上面的链接)仍然存在。
答案 1 :(得分:2)
堆栈损坏?检查options [] locations []数组的大小。使用断言以避免超出界限也很好。
所以,现在我看到了索引的问题。 locations []数组有3个元素,但你在第一个循环中访问第四个元素(loc_ptr [position] - &gt; loc_ptr [3]),与options []相同。
答案 2 :(得分:1)
形成代码,似乎第一次调用不存在的元素位置[3]。这有意义吗?
答案 3 :(得分:0)
您无法访问位置[3],因为该数组中的最高索引是2.您可能想要:
for (int i = 2;i >= 0;i--)
options[i] = calculate_distance(current_location, locations[i]);
}
答案 4 :(得分:0)
问题似乎在
loc_ptr = &locations[0];
locations
似乎是location
元素的数组。获取此数组的第一个元素的地址将为您提供指向此元素的指针。
为什么不只是locations[position]
而不是创建额外的loc_ptr
来保存相同的信息?我很确定问题与locations
的内容有关 - 这也不在您的代码段范围内。