Доступ к индексу массива
У меня есть массив из 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 отдельных символов будет болезненной, будь то макроопределения или перечисления.