【问题标题】:Use function to declare array values in a function使用函数在函数中声明数组值
【发布时间】:2019-10-26 14:48:18
【问题描述】:

首先,如果我混淆了声明/定义等一些术语,我很抱歉。我目前正在尝试熟悉它们。我的问题是:我必须在我的代码中创建一个大矩阵。我想将它移到文件末尾的单独函数中,以使事情更简单。有什么简单的方法可以做到这一点?我不能使用“向量”,因为我必须稍后将矩阵交给一个不支持“向量”的函数(别问,这个函数不是我写的)。

我目前使用这段代码(因为它正在工作),它在主函数中声明矩阵,这样它就不会超出范围。我希望可以直接在函数中分配矩阵的值,但我无法让它工作。

void make_matrix(float (&matrix_float)[255][4]);

int main()
{
    // ...
    float matrix[255][4]{ 0 };
    make_matrix(matrix);
    // ...
}

void make_matrix(float (&matrix_float)[255][4])
{
    float preparation[255][4]{ { 0, 0, 0, 0 },
                               { 0.639999985694885, 0, 0.800000011920929, 1 },
                               { 0, 1, 0, 1 },
                               // ........
                             };

    for (int i = 0; i < 255; i++)
        for (int j = 0; j < 4; j++)
        {
            {
                matrix_float[i][j] = preparation[i][j];
            }
        }
}

有更优雅的方法吗?

【问题讨论】:

  • 您显示的(不完整的)代码有什么问题?请刷新how to ask good questions,以及this question checklist。不要忘记如何创建minimal reproducible example
  • 您是否需要一个明确的循环来希望更改?
  • 不要使用像 255 和 4 这样的幻数。它会使代码更清晰,更容易更改这些数字
  • 如果可能,将矩阵包装在一个类中允许只使用赋值(如std::array)。
  • 您可以使用单个memcpy代替循环

标签: c++ arrays function c++11


【解决方案1】:

问题是:普通数组不可赋值。

您可以在定义点初始化数组。但是您以后不能将不同的数组分配给已经存在的数组。

然后,只有元素明智的分配是可能的。正如您在子功能中所做的那样。您应该至少在准备中添加 constexpr。但这不会真正有所作为。将二维数组作为参考传递是一大优势!

您要求提供更优雅的解决方案。 Jarod42 已经给出了提示。将矩阵包装在一个 POD(Plain Old Structure)结构中。然后 C++ 会为你创建各种特殊的函数,比如赋值运算符。

将新的初始化列表分配给 POD 将起作用。而不是矩阵,您将编写 "pod.matrix" 。就是这样

请看下面的例子:

#include <iostream>
constexpr size_t Rows = 3;
constexpr size_t Cols = 4;

struct POD
{
    double matrix[Rows][Cols];
};
void makePOD(POD& pod);

int main()
{
    // ...
    POD pod{};
    makePOD(pod);

    std::cout << pod.matrix[1][0];
    // ...
}

void makePOD(POD& pod)
{
    pod = { {   { 0.0, 0.0, 0.0, 0.0 },
                { 0.639999985694885, 0.0, 0.800000011920929, 1.0 },
                { 0.0, 1.0, 0.0, 1.0 }
            }
    };
}

希望这会有所帮助。 . .

【讨论】:

  • std::array 已经达到了这个目的,你真的是在重新发明轮子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 2019-12-05
  • 2015-07-29
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
相关资源
最近更新 更多