2013-02-08 843 views
0

我試圖定義一個macro2D 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

爲什麼一個宏?我會認爲這是功能領域,尤其是。如果你在談論把它暴露給別的東西。記住宏只是預處理器時間。 – 2013-02-08 15:16:28

+0

不要使用宏。他們是邪惡的。 – 2013-02-08 15:35:02

+1

你爲什麼這麼做?正常的[] []語法有什麼問題? – 2013-02-08 16:08:45

回答

1

,你可以做的唯一方法是用()而不是與[]

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

,並在代碼中,你以這種方式

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

這怎麼能工作。該宏將擴展'matrix'的兩個實例。 – 2013-02-08 15:34:34

+0

我用'的GCC -E'和沒有problemwith該 – MOHAMED 2013-02-08 16:01:55

+0

代碼與'的GCC -E'生成檢查:'INT主() { INT矩陣[12 * 12]; 矩陣[12 * 1 +1] = 15; }' – MOHAMED 2013-02-08 16:03:05

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)]; 

所以你不侷限於在宏定義的獨特的矩陣。

更根本的是,爲什麼你甚至想這樣做呢?普通的多維數組語法已經在那裏完成了。