首页 > 解决方案 > 关于结构和数组的意外错误

问题描述

因此,我正在关注某个教程系列,并尝试利用这些知识对与该系列本身相似但又不同的东西进行自己的解释。在一个部分中,为了解决对我的问题范围不重要的某些不便,一种可能的解决方案是将某些数据块存储到结构的成员中,然后将该结构调用到稍后精确输出数据的函数上我们想要的方式 - 作为一个数组。

一切都很好,直到函数由于某种原因拒绝接受数组的值,声称数组参数中的信息过载(我稍后会指定错误),并且我返回的实体没有匹配函数的返回类型。

这是我的代码:


struct TriCoord
{
    float Position[3];
    int Label[2];
};

std::array<TriCoord, 3> Implement(float x, float y, float z, int j) //2
{
    float size = 1.0f;

    TriCoord f0;
    f0.Position = { x, y, z }; //1
    f0.Label = { j, 1 }; //1

    TriCoord f1;
    f1.Position = { x + 0.5, y + 0.5, z };
    f1.Label = { j, 2 };

    TriCoord f2;
    f2.Position = { x + 0.5, y, z };
    f2.Label = { j, 3 };

    return { f0, f1, f2 }; //2
};

int main()
{
    int X;
    float A[3] = Implement(3, 4, 5, 1); //3
    std::cout << A[0] << ", " << A[1] << ", " << A[2] << std::endl;
    std::cout << "Press Enter key to return" << std::endl;
    std::cin >> X;
    return 0;
}

我已将注释专门定位在错误所在的位置。

1)编译器说 f0 是“不可修改的左值”。我认为没有理由不应该这样做。在数组的第二个元素(在本例中为 y)的数组参数中,编译器说我正在添加“太多初始化值”。再次,没有任何意义。我将 Position 数组指定为具有 3 个元素,并插入 3 个匹配类型(浮点数)的元素。

这两个错误扩展到 f0.Label 以及其他 TriCoords。

2) 编译器说函数“返回不完整的类型'std::array'”。此外,在返回行中,“不允许对对象类型 'std::array' 进行列表初始化,因为该类型不完整”。

从技术上讲,我返回的是一个 std 数组,它的元素是 TriCoords 并且数量为 3,所以我再也看不到这个问题了。我确实通过将函数的返回类型更改为浮点数来解决这个问题,但是返回行反而会为第二个元素(在本例中为 f1)生成与问题 1 中相同的错误。

3)“聚合对象需要使用'{...}'进行初始化”我不知道这是什么意思。无论我为函数指定哪种返回类型,我都会收到此错误。

我必须强调,我和我正在关注的系列都在使用 Visual Studios,并且在我关注的视频中没有出现此类错误。我什至逐行复制粘贴了整个视频的代码,但错误仍然存​​在,这让我得出结论,我的 Visual Studios 配置方式有问题,可能是由于版本差异(视频是今年上传,所以它不会在太旧的版本上运行)。我所有的依赖项也是正确的,并且存在于它们各自的基于项目的目录中,我已经仔细检查了这些。

最后,我上面使用的代码是我在一个新项目上重新编写的一个单独的测试代码,试图隔离错误。不用说,我在这两种情况下都遇到了同样的错误,表明我的原始项目的自定义标头和库本质上没有任何问题。

标签: c++arraysstruct

解决方案


1)一旦初始化,就不能像这样分配给数组。

int arr[3] = {1, 2, 3};    //valid

int arr2[3];
arr2 = {1, 2, 3};    //invalid

在您的情况下,您可以做的是: -

TriCoord f0;
f0.Position = { x, y, z }; 
f0.Label = { j, 1 }; 

写: -

float tempFloat[3] = { x, y, z }; 
int tempInt[2] = { j, 1 };
TriCoord f0;
for (int i = 0; i < 3; ++i)
    f0.Position[i] = tempFloat[i];
for (int i = 0; i < 2; ++i)
    f0.Label[i] = tempInt[i];

2)解决1解决2...

3)您正在尝试分配std::array<TriCoord, 3>一个浮点数组,这当然是不可能的......

在这一点上,我强烈建议你std::array到处使用。


推荐阅读