好吧,我猜这是一个简单的问题,所以我会抓住机会,但我找不到谷歌或者我需要的东西。我想在一个地方创建一个数组,并将其填充到一个不同的函数中。
我定义了一个函数:
void someFunction(double results[])
{
for (int i = 0; i<100; ++i)
{
for (int n = 0; n<16; ++n) //note this iteration limit
{
results[n] += i * n;
}
}
}
这是我的代码所做的近似,但无论如何,不应该遇到任何溢出或超出范围的问题或任何事情。我生成一个数组:
double result[16];
for(int i = 0; i<16; i++)
{
result[i] = -1;
}
然后我想将其传递给someFunction
someFunction(result);
当我设置断点并逐步执行代码时,在输入someFunction
后,results
将设置为与result
相同的地址,并且其值为-1.000000。但是,当我开始遍历循环时,results[n]
似乎无法解析为*(results+n)
或*(results+n*sizeof(double))
,它似乎只能解析为*(results)
。我最终得到的是,我只获得一个值,而不是填充我的结果数组。我做错了什么?
修改
哦好玩,我有一个错字:它不是void someFunction(double results[])
。那是:
void someFunction(double result[])...
所以也许这会变成一个范围问题。如果我的double result[16]
数组在main.cpp中定义,并且someFunction
在main.cpp包含的Utils.h文件中定义,那么result
变量在{{1}中然后对main中的someFunction
数组造成严重破坏?
编辑2:
@gf,在尝试用新项目重现这个问题的过程中,原始项目“神奇地”开始工作。
我不知道如何解释它,因为没有改变,但我很清楚我所看到的 - 我对这个问题的原始描述非常清楚,所以我不认为我是幻觉。我很感激时间和答案...抱歉浪费你的时间。如果再次发生,我会再次更新,但与此同时,我认为我很清楚。再次感谢。
答案 0 :(得分:1)
void someFunction(double results[])
应完全等同于
void someFunction(double *results)
尝试使用替代声明,看看问题是否仍然存在。
答案 1 :(得分:1)
对我而言,您的代码似乎应该可以正常工作。
我刚用g ++试过这个并且工作得很好。我想你的问题在别的地方?你试过你发过的剪了吗?
#include <iostream>
void someFunction(double results[])
{
for (int i = 0; i<100; ++i)
{
for (int n = 0; n<16; ++n) //note this iteration limit
{
results[n] += i * n;
}
}
}
int main()
{
double result[16];
for(int i = 0; i<16; i++)
{
result[i] = -1;
}
someFunction(result);
for(int i = 0; i<16; i++)
std::cerr << result[i] << " ";
std::cerr << std::endl;
}
答案 2 :(得分:1)
你有没有在几个地方双重定义你的结果数组,然后意外地在一个地方提到一个副本而在别处提到另一个副本?也许第二个是指针而不是数组,这就是调试器混淆的原因?
答案 3 :(得分:1)
为了确保不会发生此问题,您绝不应该使用这样的全局变量。如果你绝对必须有一个,为了清楚起见,请将它放在命名空间中。
答案 4 :(得分:1)
关于问题的变量范围部分的一点 - 这里没有变量范围的问题。 someFunction定义中的结果/结果是参数 - &gt;它将采用传入的值。被调用函数中的变量与调用者之间没有关系 - &gt;除非传入,否则调用函数中的变量对于被调用的函数是未知的。此外,在C ++中的例程之间不会发生变量作用域问题,因为没有嵌套例程。以下代码片段将演示范围问题:
int i = 0;
{
int i = 0;
i = 5; //changes the second i, not the first.
//The first is aliased by the second i defined first.
}
i = 5; //now changes the first i; the inner block is gone and so is its local i
所以如果C ++确实有嵌套例程,这将导致变量范围
void main()
{
double results[16];
double blah[16];
doSomething(blah);
void doSomething(double * results)
{
//blah doing something here uses our parameter results,
//which refers to blah, but not to the results in the higher scope.
//The results in the higher scope is hidden.
}
}