2

好吧,我猜这是一个简单的问题,所以我会接受敲门,但我在谷歌或 SO 上找不到我需要的东西。我想在一个地方创建一个数组,并将其填充到另一个函数中。

我定义了一个函数:

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);

当我设置断点并单步执行代码时,在输入 时someFunctionresults设置为与 相同的地址result,并且该值如预期的那样为 -1.000000。但是,当我开始遍历循环时,results[n]似乎没有解析为*(results+n)or *(results+n*sizeof(double)),它似乎只是解析为*(results). 我最终得到的是,我没有填充我的结果数组,而是得到一个值。我究竟做错了什么?

编辑 哦,有趣,我有一个错字:不是void someFunction(double results[]). 它是:

void someFunction(double result[])...

所以也许这正在变成一个范围界定问题。如果我的double result[16]数组在 main.cpp 中someFunction定义,并且在 main.cpp 包含的 Utils.h 文件中定义,那么其中的result变量是否会对 mainsomeFunction中的数组造成严重破坏result

编辑2:

@gf,在尝试使用新项目重现此问题的过程中,原始项目“神奇地”开始工作。

我不知道如何解释它,因为没有任何改变,但我很确定我所看到的 - 我对这个问题的原始描述很清楚,所以我不认为我是在产生幻觉。我感谢您的时间和答案……很抱歉浪费您的时间。如果再次发生,我会再次更新,但与此同时,我想我很清楚。再次感谢。

4

5 回答 5

1
void someFunction(double results[])

应该完全等同于

void someFunction(double *results)

尝试使用替代声明,看看问题是否仍然存在。

于 2010-04-27T23:20:39.510 回答
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;  
}
于 2010-04-27T23:31:29.953 回答
1

您是否可能在几个地方双重定义了结果数组,然后意外地在一个地方引用了一个副本,而在其他地方引用了另一个副本?也许第二个是指针而不是数组,这就是调试器感到困惑的原因?

于 2010-04-28T00:07:12.550 回答
1

为确保不会发生此问题,您永远不应使用这样的全局变量。如果您绝对必须拥有一个,请将其放在名称空间中以清楚起见。

于 2010-04-28T00:21:55.140 回答
1

只是关于问题的可变范围部分的一点 - 这里没有可变范围的问题。你的 someFunction 定义中的结果/结果是一个参数->它将采用传入的值。被调用函数中的变量与其调用者之间没有关系->调用函数中的变量对于被调用函数是未知的,除非传递此外,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.  
     }  
}
于 2010-04-28T01:42:06.487 回答