C++通过引用函数传递数组但内容保持不变

标签 c++ arrays multidimensional-array

我正在开发一个解决经济学模型的程序。首先,我声明一个命名空间如下:

namespace myNameSpace
{
    const int d1{10};
    const int d2{5};
    const int d3{7};
    double array[d1][d2][d3]={};
}

然后,我有一个修改数组的函数:

void doSomething(double (&array)[myNameSpace::d1][myNameSpace::d2][myNameSpace::d3])
{
    int i,j,k;
    for (i=0, j=0, k=0; i<myNameSpace::d1,j<myNameSpace::d2,k<myNameSpace::d3; i++,j++,k++)
        array[i][j][k]=i+j+k+1.0;
}

在主函数中,我将 doSomething 调用为:

int main()
{
    doSomething(myNameSpace::array);
    for (int i=0;j<myNameSpace::d1;j++)
        std::cout << myNameSpace::array[i][1][1] << std::endl;
}

我在控制台中得到的输出是:

0
0
0

您能就此提供任何指导吗?我试过在没有地址运算符 & 的情况下传递 array,但是在 doSomething 中,array 丢失了第一维。任何帮助将不胜感激!!

最佳答案

首先,您的 for循环

for (i=0, j=0, k=0; i<myNameSpace::d1,j<myNameSpace::d2,k<myNameSpace::d3; i++,j++,k++)

没有按照您的想法行事,如果您编译时带有警告(警告:关系比较结果未使用),您会(希望)注意到这一点。

它有 2 个相关的主要问题:

  1. i<myNameSpace::d1,j<myNameSpace::d2,k<myNameSpace::d3由于 comma operator,只返回最后一次比较的值正在使用。因此,您实际上是在迭代直到 k<myNameSpace::d3。 .

  2. for你写的循环 - 只是一个循环。它不会遍历 i 的所有可能值组合。 , j , 和 k ,如您所愿。

    它初始化i , j , k到 0;检查比较表达式(如 (1) 所述,它仅检查 k 的值);在循环中的代码运行后 - 递增 iall , j , k 1. 因此 - 你只设置了 0/0/0 , 1/1/1 , 2/2/2 , ... , 直到 k/k/k你的数组的索引。而且,因为你的中间数组有一个边界,它小于 k - 您通过越界调用未定义的行为。

最后,您只打印 i/1/1数组的索引,并且因为索引范围内只有一个值 0/1/1 - d1/1/1设置为 1/1/1 - 它是,exactly用非零值打印的内容。

遍历整个数组,这可能是您的意图 - 您应该使用嵌套循环,这样它们将允许所有循环变量相互独立地改变:

for (i=0; i<myNameSpace::d1; i++)
    {
    for (j=0; j<myNameSpace::d2; j++)
        {
        for (k=0; k<myNameSpace::d3; k++)
            {
            array[i][j][k]=i+j+k+1.0;
            }
        }
    }

关于C++通过引用函数传递数组但内容保持不变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45551477/

相关文章:

c++ - 如何在 gcc 和 VS 中强制使用 cmov

C++:为什么在#include <vector> 之前调用 std::wstring::begin() 会导致此代码中出现编译器错误?

c++ - 如何使用 cvWaitKey openCV 捕获 Num 小键盘键

javascript - 如何在angularjs中绑定(bind)和显示数组的数组

c++ - 返回 boolean 数组

php - 使用 PHP 多维数组将 MySQL 转换为 JSON

c++ - 如何根据某些值删除/删除类对象的 vector

javascript - 不可点击可触摸可突出显示

C - 二维动态数组(双指针) - 共享内存

c++ - 排序通过引用传递的二维 vector