2013-02-08 4 views
0

Я пытаюсь определить macro для преобразования 2D array синтаксиса в 1D vector. то есть для массива 12x12, matrix[i,j] должен оцениваться до matrix[12*i + j]. До сих пор я пыталсяОпределение макроса макроса

#define matrix[i,j] matrix[12*i+j] 

#define (matrix[i,j]) matrix[12*i+j] 

#define matrix[(i,j)] matrix[12*i+j] 

#define matrix([i,j]) matrix[12*i+j]` 

Причиной, побуждающей я использую matrix[i,j] синтаксис, потому что это будет расширение для вызова из R кода, и я хотел бы, чтобы другие авторы проекта, чтобы понять, что именно это делается , Есть ли способ сделать это с помощью макроса?

+2

Почему макро? Я бы подумал, что это функциональная территория, особенно. если вы говорите о том, чтобы разоблачить его чем-то другим. Помните, что макросы - это только предварительное процессорное время. –

+0

Не используйте макросы. Они злы. –

+1

Зачем вы это делаете? Что не так с нормальным синтаксисом [] []? –

ответ

1

Единственный способ, которым вы можете сделать это с (), а не с []

#define matrix(i,j) matrix[12*i+j] 

и в коде, можно определить матрицу таким образом

int matrix[12*12]; 
matrix(i,j) = 5; 
+0

Как это может работать. Макрос будет расширять оба экземпляра 'matrix'. –

+0

Я проверил с 'gcc -E' и без проблем с этим – MOHAMED

+0

Код, сгенерированный с помощью' gcc -E': 'int main() { int matrix [12 * 12]; матрица [12 * 1 +1] = 15; } ' – MOHAMED

1

Нечто подобное может работать:

#define TO_1D(m,x,y) (m[x*12+y]) 

int matrix[100]; 
TO_1D(matrix, 0, 4) = 13; 

, но мне интересно, почему вы не предпочитаете что-то более безопасное:

int data[100]; 
inline int& matrix(int x, int y) 
{ 
    return data[x*12+y]; 
} 
1

Было бы лучше определить макрос для расчета, а не разыменования.

#define X_DIM 12 
#define Y_DIM 12 
#define D21(x,y) (X_DIM*(x)+(y)) 

int my_matrix1[X_DIM*Y_DIM]; 
double my_matrix2[X_DIM*Y_DIM]; 

my_matrix1[D21(4, 3)]; 
my_matrix2[D21(2, 1)]; 

Таким образом, вы не ограничены уникальной матрицей, определенной в вашем макросе.

Более фундаментально, почему вы даже пытаетесь это сделать? Обычный синтаксис многомерных массивов уже существует, чтобы сделать именно это.

Смежные вопросы