在目标C中设置数组的内容



我刚开始学习Objective C,对数组有点困惑。基本上,我想基于switch/case变量设置数组的内容。当我如下声明数组时,我可以设置它:

int aTarget[3][2] = {{-1,0}, {-1,-1}, {-1,-1}};

但是,我需要根据枚举变量"dir"的值设置数组的内容。但是我在尝试设置数组内容的每一行都会得到一个错误"Expected expression":

//define the target cells
int aTarget[3][2];
switch (dir) {
    case north:
        aTarget = {{0,-1}, {-1,-1}, {1,-1}};
        break;
    case east:
        aTarget = {{1,0}, {1,-1}, {1,1}};
        break;
    case south:
        aTarget = {{0,1}, {-1,-1}, {1,-1}};
        break;
    case west:
        aTarget = {{-1,0}, {-1,1}, {-1,-1}};
        break;
    default:
        break;
}

我一直在网上搜索,但大多数例子都使用nsArray,但对于一个简单的整数列表来说,这似乎有点过头了。请告诉我哪里出了问题。非常感谢,Trevor

typedef enum {north = 0, east, south, west} Direction;
const int COLS = 6;
Direction dir = north;
int targets[4][COLS] =
{{0,-1,-1,-1,1,-1},
 {1,0,1,-1,1,1},
 {0,1,-1,-1,1,-1},
 {-1,0,-1,1,-1,-1}};
//define the target cells
int aTarget[COLS];
// Fill the array with the appropriate values, dependent upon the
// value of dir.
for (int i = 0; i < COLS; i++)
    aTarget[i] = targets[dir][i];
aTarget = {{0,-1}, {-1,-1}, {1,-1}};
         // ^^^^^^^^^^^^^^^^^^^^^^^ Initializer list

这是无效的CC++。使用初始值设定项列表初始化数组元素只能在声明时进行。您必须为单个数组元素进行赋值,没有其他选择。

学习目标C需要你很好地掌握C…你发布的代码表明你也是C的初学者:(sooooooooooo。我将为你回答"C"的问题。

int aTarget[3][2] = {{-1,0}, {-1,-1}, {-1,-1}};

是声明的初始化。这样做是因为程序在编译时"保存"了这些数据,然后按原样将其加载到内存中,并将aTarget(实际上是一个指针(指向它的开头

现在假设您希望在运行时将{{0,-1},{-1,-1},{1,-1}}}放入aTarget中(如您的switch语句枚举North中所示(

你可以使用两种方法之一:

1( 逐元素设置值。例如,

  aTarget[0][0] = -1;
  aTarget[0][1] = 0;
  aTarget[1][0] = -1;
  aTarget[1][1] = -1;
  aTarget[2][0] = -1;
  aTarget[2][1] = -1;

繁琐,但这本质上是你要做的,要么像这样扩展,要么通过一些巧妙的循环。

2( 另一种方法是,如果映射是静态的(如您的(,则声明一些常量并使用它们

int aTarget[3][2];
const int dueNorth[3][2] = {{0,-1}, {-1,-1}, {1,-1}};
const int dueSouth[3][2] = {{0, 1}, {-1,-1}, {1,-1}};

const int dueEast[3][2] =  {{1,0}, {1,-1}, {1,1}};
const int dueWest[3][2] =  {{1,0}, {1,-1}, {1,1}};

然后在你的交换机里,像这样的东西:

switch (dir) {
    case north:
        memcpy(aTarget, dueNorth, sizeof(aTarget)); 
        break;
    case east:
        memcpy(aTarget, dueEast, sizeof(aTarget)); 
        break;
    case south:
        memcpy(aTarget, dueSouth, sizeof(aTarget)); 
        break;
    case west:
        memcpy(aTarget, dueWest, sizeof(aTarget)); 
        break;
    default:
        break;
} 

请注意,这是一种丑陋的编程——有更可爱的方法可以高效、紧凑地组织数据,同时以更自然的方式进行编程。

例如,你可以将整个东西编码在一个大数组中并初始化它:

enum{北、东、南、西};

int target[4][3][2]={{{0,-1},{-1,-1},{{1,0}、{1、-1}、}1,1}},{{0,1},{-1,-1},},{{-1,0}、{-1、1}、}-1、-1}}};

但这并不容易维护。。。尽管你可以通过Target[dir][x][y]获得你的坐标

你真的应该把这些数据分解成结构,但这本身就是另一个教训。:(

相关内容

  • 没有找到相关文章

最新更新