Доступ к индексу массива

У меня есть массив из 255 элементов. Мне нужно хранить 100 значений в этом массиве. Например, если есть 3 предмета: роза, красный, крыса, то arr[0] должен представлять rose, arr[1] должен представлять red а также arr[2] как rat, Тогда эти значения присваиваются как arr[0] = 100, arr[1] = 200, arr[2] = 300, Теперь, когда я хочу получить значение rat Я должен быть в состоянии получить значение непосредственно путем доступа к его индексу, т.е. arr[2]=300, Моя идея состоит в том, чтобы создавать макросы и присваивать значения каждому элементу и напрямую обращаться к значению в массиве. Пример:

#define ROSE 0 
#define RED 1
#define RAT 2

Тогда прямо для rat я скажу arr[RAT] чтобы получить значение. Это хороший подход для 100 предметов?ADDITION:Что теперь, если размер значений предметов меняется? Например red имеет значение 4 байта и rat имеет значение 2 байта, то для uint8 arr[255];red должен начинаться с arr[1] а также rat должен начинаться с arr[5], Enum все еще работает здесь?

4 ответа

Решение

Вы также можете использовать C перечисления объявлений, enums:

typedef enum {rose, red, rat} index; 

Теперь в вашем коде вы можете получить доступ arr[rat] то есть == arr[2],

Обычно я избегаю макросов для этого вида констант (где много констант одного типа). Я думаю, что это должен быть тип с пользовательским доменом, который enum,

Перечисление состоит из набора именованных целочисленных констант. Объявление типа перечисления дает имя (необязательного) тега перечисления и определяет набор именованных целочисленных идентификаторов (называемых "набор перечислений", "константы перечислителя", "перечислители" или "члены").

Макрос я предпочитаю для размера массива:

#define SIZE  100;

int arr[SIZE]

Спасибо @ junix, чтобы добавить очень хороший момент в моем ответе:

Это будет хорошая идея для определения enum с помощью добавить последний элемент, который дает общее количество элементов, например:

typedef enum { rose, 
               red, 
               rat, 
               /* add new elements here */ 
              item_count
        } index;

Теперь мой диапазон enum-доменов [0, item_count]и мы можем использовать item_count значение, например, как:

int arr[item_count];

И, конечно, это преимущество, которое мы не имеем с макросами!

Возможно, лучше использовать перечисление:

enum Item {
    ROSE = 0,
    RED = 1,
    RAT = 2
};
arr[RAT]=300

enum структуры легче расширять (добавить новый itemвставьте новый элемент и увеличьте индексы других). Если вы используете макросы, вам придется делать это вручную.

Вы должны использовать enum:

enum {ROSE, RED, RAT, ...}

Лучше выразить свое намерение. Вы уверены, что другой тег получит другое значение. Также, если позже вы используете переключатель, вы получите предупреждение, если вы забыли какой-то индекс.

На самом деле, это звучит как идеальный кандидат на хэш-таблицу.

Необходимость поддерживать 100 отдельных символов будет болезненной, будь то макроопределения или перечисления.

Другие вопросы по тегам