установка содержимого массива в цель C - PullRequest
3 голосов
/ 27 ноября 2011

Я только начал изучать Цель C и становиться немного озадаченным массивами. По сути, я хочу установить содержимое массива на основе переменной switch / case. Я могу установить массив, когда я объявлю его следующим образом:

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

Однако мне нужно установить содержимое массива на основе значения переменной enum 'dir'. Но я получаю сообщение об ошибке «Ожидаемое выражение» в каждой строке, где я пытаюсь установить содержимое массива:

//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 голосов
/ 27 ноября 2011
aTarget = {{0,-1}, {-1,-1}, {1,-1}};
         // ^^^^^^^^^^^^^^^^^^^^^^^ Initializer list

Это недопустимо C или C ++ .Инициализация элементов массива с использованием списка инициализаторов возможна только во время объявления.Вы должны сделать назначения для отдельных элементов массива, и другого выбора нет.

0 голосов
/ 27 ноября 2011

Учебная цель C требует, чтобы вы хорошо понимали C ... Код, который вы разместили, показывает, что вы тоже новичок в C :) sooooooooo ... Я отвечу на вопрос "C" для вас.

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

- инициализация объявления. Это может быть сделано, потому что программа «сохраняет» эти данные во время компиляции, а затем загружает их в память как есть и указывает aTarget (который на самом деле является указателем) на его начало.

Теперь предположим, что вы хотите поместить {{0, -1}, {-1, -1}, {1, -1}} в aTarget во время выполнения (как в вашем выражении switch на север)

Вы можете сделать это одним из двух способов:

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

Имейте в виду, что это уродливое программирование. Существуют FAR более эффективные способы организации ваших данных эффективно, компактно и в то же время более естественным образом для программирования.

Например, вы можете закодировать все это в один большой массив и инициализировать его:

enum {СЕВЕР, ВОСТОК, ЮГ, ЗАПАД};

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]

Вы должны действительно разбить эти данные на структуры, но это еще один урок сам по себе. :)

0 голосов
/ 27 ноября 2011
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];
...