Хорошо ли инициализированный 2d массив для отображения последовательных целых чисел в строки в C? - PullRequest
0 голосов
/ 24 сентября 2019

Мне нужно отобразить последовательные целочисленные коды от 1 до 100 в строки в C. Обычно, для отображения числа в строку, я хотел бы что-то вроде этого:

#define code1   1
#define code2   2
.
.
#define code100 100

struct map 
   {
     int code;
     char *msg;
   }objs[100];

Я бы затем зациклилсяobjs и, если число совпадает, я бы использовал соответствующую строку массива obj.Поскольку я знаю, что отображаемые числа являются последовательными, я могу просто сделать это:

const char *arr[100] = { "abc", "def", ....... "100th msg"};

Тогда я могу забыть цикл и просто напечатать arr [code].Это плохой подход?Единственный недостаток, который я вижу, состоит в том, что когда кто-то добавляет код посередине, он должен быть осторожен с этим.Преимущество состоит в том, что мне не нужно перебирать массив структур.

Ответы [ 3 ]

2 голосов
/ 24 сентября 2019

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

Если вам нужно справиться с более динамическими обновлениями данных во время компиляции, то следующая лучшая вещь - это отсортированный массив.Если вы можете гарантировать, что ваши записи всегда в порядке, но, возможно, есть пробелы или новые записи добавлены в конец, то вы можете нарезать двоичные данные вашего упорядоченного массива, чтобы быстро найти нужную запись.Возможно, вы захотите выполнить начальный этап, который проверит правильность упорядочения массива, но вы должны сделать это только один раз.

Если вам нужно беспокоиться об обновлениях во время выполнения, вам нужно серьезно рассмотретьуровень абстракции контейнера, такие как деревья отображения или хеш-карты.

1 голос
/ 24 сентября 2019

Единственная проблема с вашим подходом состоит в том, что коды никогда не могут измениться.Вы не можете добавить промежуточные коды без изменения всего кода.Но это должно работать.Кроме того, первый код должен быть равен нулю, иначе вам придется либо дополнить массив, либо сдвинуть коды при доступе.

По сути, у вас есть неизменяемая хеш-таблица.

#define BASE_CODE 5
#define CODE_BLUE 5
#define CODE_GREEN 6

const char *responses[] = {'blue', 'green'};
printf("%s\n", responses[code - BASE_CODE]);

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

1 голос
/ 24 сентября 2019

Предположим, в массиве есть сообщения об ошибках.Тогда общий подход заключается в определении констант для каждой ошибки и печати сообщения, связанного с ней, например:

#define ERR_NONE 0
#define ERR_NOMEM 1
#define ERR_BADNUM 2
// etc

, и определения массива как:

const char *msgs[] = {
    "No error",
    "Out of memory",
    "Bad number",
    // etc
};

и функциинапечатать сообщение, например:

void printmsg(int code)
{
    printf("%s\n",msgs[code]);
}

, которое можно назвать

    printmsg(ERR_NOMEM);

Для модульности #define s может быть, например, errors.h вместе спрототип printmsg, а массив может быть в errors.c.

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