Использование перечислений для доступа к индексам двумерных массивов - PullRequest
0 голосов
/ 08 мая 2019

У меня не было возможности попробовать это, и мое понимание C в лучшем случае любительское.Ближе всего я нашел этот вопрос для c ++, но имел дело с фиксированными значениями enum.

Скажем, у вас есть двумерный целочисленный массив, динамически размещаемый так:

4x4

0 0 0 0
0 0 0 0         
0 0 0 0   
0 0 0 0

Можно ли использовать enum для назначения динамических имен каждому столбцу и строке, а затем обращаться к этим строкам и столбцам по их именам?

Как:

        apples   bread   carrot   dinosaur  
apples    0        0       0         0  
bread     0        0       0         0  
carrot    0        0       0         0   
dinosaur  0        0       0         0 

Позволить мне что-то сделатьнапример:

matrix[apples][bread] += 1;

РЕДАКТИРОВАТЬ Когда я говорю «динамический», я имею в виду, когда значение компилируется во время выполнения без фиксированного размера.Таким образом, за один проход матрица может быть 2x2 или 82x82, а значения enum могут быть яблоками, медведями или яблоками, медведями, тедди и т. Д.

Ответы [ 3 ]

3 голосов
/ 08 мая 2019

Да, вы можете использовать перечисления для создания символических констант для каждого индекса:

enum { apples, carrot, bread, dinosaur };

Вы также можете использовать обычные переменные:

const int apples   = 0;
const int carrot   = 1;
const int bread    = 2;
const int dinosaur = 3;

Вы также можете использовать препроцессор:

#define APPLES   0
#define CARROT   1
#define BREAD    2
#define DINOSAUR 3

То, что вы не можете сделать, - это создать любую из этих вещей во время выполнения .Если вы решите во время выполнения создать массив 5x5, вы также не сможете создать новую символическую константу (через enum или переменную или макрос).Это может быть сделано только во время компиляции.

РЕДАКТИРОВАТЬ

Что вы можете можете сделать - это создать некую ассоциативную структуру данных (карту или таблицу поиска), которая связывает строку с целым числомзначение, а затем вы можете сделать что-то вроде ...

Some_Map_Type map;
...
addIndex( map, "apples", 0 );
addIndex( map, "carrot", 1 );
addIndex( map, "bread", 2 );
addIndex( map, "dinosaur", 3 );
...
do_something_with( matrix[getIndex(map, "apples")][getIndex(map, "bread")] );

, а затем во время выполнения запросить новое имя индекса и значение, например:

printf( "Gimme a new index: " );
scanf( "%s %d", name, &value ); // doing it this way *just* for brevity - don't actually do it like this
addIndex( map, name, value );
...
do_something_with( matrix[getIndex(map, name)][getIndex(map, "bread")] );

Это может или не можетстоить усилий для вас.

3 голосов
/ 08 мая 2019

C - это статически типизированный язык , и вы не можете добавлять имена переменных в вашу программу во время выполнения.Это включает в себя также перечисления.Хеш-таблица типа std::map может использоваться для ваших целей, но C не предоставляет такой тип, поэтому вы должны реализовать ее самостоятельно.

1 голос
/ 08 мая 2019

Enum в C - это не что иное, как отображение имен и целых чисел. Таким образом, вы могли бы сделать что-то вроде

enum Fruit{apple, orange, banana};
array[apple][banana] = 1;

Но, как и его названия, вы должны перечислить его, ДО того, как вы его используете. Поэтому невозможно добавить один во время выполнения. Однако может работать какая-то структура карты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...