Макросы C для 2-х и 3-х мерной индексации - PullRequest
0 голосов
/ 18 апреля 2011

Я ищу ярлык для 2 и 3-мерной индексации произвольных значений, и я знаю, что это работает для данного массива a []

#define a(i,j,k) a[(i)*span*span+(j)*span+(k)]
#define b(i,j) b[(i)*span+(j)]

Но я не понимаю, как разрешить этим макросам работать с произвольными массивами, например;

x(i,j,k)

Кто-нибудь хочет подсказать мне?

Ответы [ 4 ]

2 голосов
/ 18 апреля 2011

Не определяйте имя макроса как a или b, вместо этого укажите массив в качестве параметра:

#define arr3d(a,i,j,k) a[(i)*span*span+(j)*span+(k)]
#define arr2d(b,i,j) b[(i)*span+(j)]

Тогда a и b будут параметрами, и вы 'Я смогу использовать его для разных массивов.

Редактировать

Например: char newarr [5] [5] [5];arr3d (newarr, 3, 3, 3);

также, если span не является переменной, определенной во всех областях, где вам нужно использовать этот макрос, он не будет работать, и вам нужно будетдобавьте другой параметр в макрос - span, чтобы определение макроса выглядело так:

#define arr3d(a,i,j,k,span) a[(i)*(span)*(span)+(j)*(span)+(k)]

И да, я бы обычно этого избегал.

1 голос
/ 18 апреля 2011

заставьте ваш компилятор предварительно обрабатывать макросы без компиляции их для отладки макросов.

gcc -E -P для gcc.

0 голосов
/ 18 апреля 2011

Как выглядит ваше измерение span кажется целочисленной константой времени компиляции?Тогда вы просто не должны использовать макрос.Если вы используете

double A[span][span][span] = { 0 };

или подобное, где

#define span 42

или

enum { span = 42 };

индексирование в C с A[i][j][k] будет работать из коробки и будетправильная вещь.Не усложняйте свою жизнь непрозрачным макросом для таких случаев.

0 голосов
/ 18 апреля 2011

Этот макрос развернет что-нибудь из формы a(i,j,k) в форму a[(i)*span*span+(j)*span+(k)]. Однако он не использует эти значения (ожидая, что они будут переменными). Таким образом, если вы используете x(i,j,k), он заменит все a с в макросе на x с.

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