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

时间:2011-11-27 11:37:20

标签: objective-c c arrays multidimensional-array variable-assignment

我刚开始学习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,但对于一个简单的整数列表来说,这似乎有点过分。请让我知道我哪里出错了。 非常感谢, 特雷弗

3 个答案:

答案 0 :(得分:0)

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];

答案 1 :(得分:0)

aTarget = {{0,-1}, {-1,-1}, {1,-1}};
         // ^^^^^^^^^^^^^^^^^^^^^^^ Initializer list

这不是 C C ++ 。只有在声明时才可以使用初始化列表初始化数组元素。您必须为各个数组元素进行分配,没有其他选择。

答案 2 :(得分:0)

学习目标C要求你很好地掌握C ...你发布的代码表明你也是C的初学者:) sooooooooo ..我将为你回答“C”问题。< / p>

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

是声明的初始化。这可以完成,因为程序在编译时“保存”这些数据,然后按原样将其加载到内存中,并将aTarget(实际上是指针)指向它的开头。

现在假设您想在运行时将{{0,-1},{-1,-1},{1,-1}}放入aTarget(如在switch语句enum 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 {NORTH,EAST,SOUTH,WEST};

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

但这并不容易维护......虽然你可以用Target [dir] [x] [y]

来获取你的坐标

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