2

我为整个菜鸟问题道歉,但我找不到答案。我用谷歌搜索,在这里搜索,搜索 C++ 数组文档和一些 C++ 数组教程。
问题很简单。为什么

#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
      short pixelarray[3][3] = {{1,1,1},{0,0,0},{-1,-1,-1}};
      ... //do stuff.  Imagine a loop here, and BIG array - I'm just simplifying it for StackOverflow
      pixelarray = {{1,0,-1},{1,0,-1},{1,0,-1}};

    return 0;
}

导致错误?

1>arraytest.cpp(11): error C2059: syntax error : '{'

如何在我的数组中放置一个静态数组?我意识到我可以单独设置每个项目,但必须有更好的方法。

4

6 回答 6

6

C++ 中的内置数组有其问题,不可赋值确实使它们相当不灵活。我会坚持使用std::arrayC++11 容器,它可以模拟更好的数组样式,它允许与您正在寻找的语法有点相似:

std::array<int, 3> arr{{1, 2, 3}};
std::array<int, 3>{{4, 5, 6}}.swap(arr);
//now arr is {4, 5, 6}

这是一个完整的示例。诀窍是在新构造的数组上使用初始化列表,然后将其与你的交换。我相信下一次 C++ 更新也将消除对双括号的需求,这使得它更接近于熟悉的语法。

于 2012-12-20T01:29:24.037 回答
3

初始化器列表可仅用于初始化:)
就像声明变量时一样:

short pixelarray[3][3] = {{1,1,1},{0,0,0},{-1,-1,-1}}; // this is ok

你必须删除这个:

pixelarray = {{1,0,-1},{1,0,-1},{1,0,-1}};

并手动分配新值(即pixelarray[x][y] =或使用 a memcpy(pixelarray, <some other array>, sizeof(pixelarray))

于 2012-12-20T01:23:31.113 回答
2

如果您不想手动分配每个单独的元素,您可以这样做:

short pixelarray2[3][3] = {{1,0,-1},{1,0,-1},{1,0,-1}};
memcpy(pixelarray, pixelarray2, sizeof(pixelarray));

正如@Nick 指出的那样:初始化列表不用于赋值。

于 2012-12-20T01:32:43.967 回答
2

数组是不可分配的,所以简短的回答是你不能完全按照你的要求去做。对于大多数目的来说,最直接的方法可能是一个 2D 数组类,它充当 a 的包装器,其顺序与我在上一个答案std::vector中发布的顺序相同。

如果您坚持使用 C 风格的数组,一种可能性是使用指针:

int main() { 
    typedef short array[3];

    array pixelarray0[3] = {{1,1,1},{0,0,0},{-1,-1,-1}};
    array pixelarray1[3] = {{1,0,-1},{1,0,-1},{1,0,-1}};

    array *pixelarray = pixelarray0;

    // when needed:
    pixelarray = pixelarray1;
}
于 2012-12-20T01:35:10.040 回答
2

从直接的 C 上下文中提出这个问题,您可以拥有不同的常量数组,并使用以下命令复制它们memcpy

typedef short TArray[3][3];
const TArray a1 = {{1,1,1},{0,0,0},{-1,-1,-1}};
const TArray a2 = {{1,0,-1},{1,0,-1},{1,0,-1}};

// ...    
TArray a;
memcpy( a, a2, sizeof(TArray));

或者您可以利用 C99 结构复制,但我认为这是一种危险的 hack,因为该结构可能被填充为大于数组,或者具有不同的对齐方式。

typedef struct {
    TArray arr;
} TDummyArray;

// ...
TArray a;
*(TDummyArray*)a = *(TDummyArray*)a2;
于 2012-12-20T01:40:02.383 回答
0

一旦声明了数组,就无法使用赋值运算符重新分配数组的全部内容。

因此,在此之后更改内容或数组:

short pixelarray[3][3] = {{1,1,1},{0,0,0},{-1,-1,-1}};

您需要遍历数组并手动更改每个值,或者使用 std::memcpy 之类的东西来复制新值。

但是你真的不应该首先使用数组,而是使用 std 集合库中的一些东西,比如 std::array 或 std::vector。仅当您有一个非常好的理由不能使用集合时才使用数组。

于 2012-12-20T01:35:08.410 回答