Это касается C
язык программирования.Проблема со строкой конкатенации в C
У меня есть большое количество 2D-массивов (sizes are not fixed
). Рассмотрим следующий пример.
bool sym_a[][]={{...},{...},...}; //consider these are initialized properly
bool sym_b[][]={{...},{...},...};
...
bool sym_z[][]={{...},{...},...};
bool sym_0[][]={{...},{...},...};
bool sym_1[][]={{...},{...},...};
...
bool sym_9[][]={{...},{...},...};
...
Обратите внимание на соглашение об именах, все имена одинаковы. Изменяется только последний символ имени массива (лучше, если он может быть более одного символа, но это не важно).
Хорошо, теперь у меня есть функция. Он выбирает один из этих 2D-массивов в соответствии с принятым аргументом. Затем выполните некоторую задачу с выбранным массивом. Обратите внимание, что задача является общей, изменяется только выбранный массив.
Например, в соответствии с тем, что я могу сейчас представить, да, я могу реализовать функцию, как показано ниже.
void doStuff(char letter){
switch(letter){
case 'a':
sym_a[0][0]=1; //just for demonstration :D
break;
case 'b':
sym_b[0][0]=1; //same thing, only the character 'a' changed to 'b'
break;
...
case 'z':
sym_z[0][0]=1;
break;
case '0':
sym_0[0][0]=1;
break;
case '1':
sym_1[0][0]=1;
break;
...
...
}
}
Но должен быть лучший способ. Если у меня 1000 таких массивов, то мне нужно написать 1000 таких случаев? Для всех случаев контент точно такой же. Изменяется только один символ имени переменной.
Было бы неплохо, если бы что-то вроде конкатенации строк.
#define conc(a,b) a ## b
conc(sym_,a)
Тогда будет представлять sym_a
. Но это не может быть прямо применено здесь. Поскольку я не могу передать точную букву в правый аргумент conc(a,b)
, можно передать только переменную, содержащую нужную букву.
void doStuff(char letter){
conc(sym_,letter)[0][0]=1;
}
conc(sym_,letter)
дает sym_letter
. Но мне нужно конкатенировать sym_
с содержимым символьной переменной letter
.
Например, если я звоню doStuff('b');
, их следует указать sym_b
, а не sym_letter
.
Надеюсь мое требование ясно. Эта вещь кажется довольно простой, но я не могу придумать, как избавиться от этого. Обратите внимание, что размеры (количество строк/столбцов) двумерных массивов не фиксированы. В противном случае я мог бы использовать 3D-массив.
Любая мысль оценена.
Зачем вам так много живых переменных 2D все время? – akshay202
Я не думаю, что язык C имеет тип данных bool. Вы можете создать один массив int и сохранить все ваши данные bool, используя оператор сдвига бит. – akshay202
@ akshay202 хорошо, они не «живые» все время (что вы имели в виду?). они похожи, жестко закодированы в программе и рассматриваются только тогда, когда это необходимо. Думаю, это не проблема в любом случае. но вы видите лучший вариант? И приведенный выше код - это то, что я сейчас использую (да, это работает). Но мне нужна простая альтернатива – Anubis