C ++数组作为参数,EDIT:现在包括变量作用域

时间:2010-04-27 23:16:04

标签: c++ pointers arrays scope subscript-operator

好吧,我猜这是一个简单的问题,所以我会抓住机会,但我找不到谷歌或者我需要的东西。我想在一个地方创建一个数组,并将其填充到一个不同的函数中。

我定义了一个函数:

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,在尝试用新项目重现这个问题的过程中,原始项目“神奇地”开始工作。

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

5 个答案:

答案 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.  
     }  
}