2010-11-09 37 views
1

我試圖讀取二維數組中的值並將它們相乘以生成新的數組數組。這並不完全重要。使用宏數組訪問的語法錯誤

我已經創建了一個宏來讀取值,而不是一個函數在理論上是更有效的,但我有一個語法錯誤,我無法弄清楚。問題的線是

// compute and write the value for the result array 
     writearr(result, n, r, c, (READ(r, c, A*) * READ(c, r, A*))); 

與函數頭

void newarr(int n, int* A, int* result) 

#define READ(a, b, arr) (arr[a][b]) 

,當我嘗試編譯此我得到

gcc -Wall -O2 -c -o placeholder.o placeholder.c 
    placeholder.c: In function âwritearrâ: 
    placeholder.c:26: error: expected expression before â[â token 
    make: *** [placeholder.o] Error 1 

,但我不能完全弄清楚什麼問題是。

+2

「我創建了一個宏來讀取值而不是函數,理論上是更高效的」這就是你錯誤的地方。你爲什麼要爲理論優勢編碼?你應該編碼清潔和優雅。當你完成*你可以分析你的代碼,找出緩慢的部分,並修復它們。猜測是毫無價值的。 – GManNickG 2010-11-09 23:09:52

+0

另外,只有給出開始和大小,您無法對其進行二維索引。你還需要一個寬度,所以你可以執行算術。查看弗拉德答案的評論。 – GManNickG 2010-11-09 23:13:47

回答

3

首先,你需要將你的宏參數括在括號內。

#define READ(a, b, arr) ((arr)[a][b]) 

其次,你應該使用A,而不是A*解引用。 A*根本無效,但您想要&A(實際上也是錯誤的)?

第三,在這種情況下,這個宏實際上並沒有爲訪問數組帶來任何好處。

第四,您將A聲明爲一維數組,您不能將其用作多維數組。獲取一維數組的地址不允許您自動切換到「下一個」行,因爲C++不知道該行的行將有多大。

+0

如果不是'READ(r,c,A)'?解引用只會給你一個整數;你不能索引。即使如此,'(arr)[a]'產生一個整數,不能通過'b'索引。代碼被破壞。 – GManNickG 2010-11-09 23:11:29

+0

@GMan:實際上函數簽名表示A是一個指向int的指針,所以這個代碼在任何情況下都是無效的。 – Vlad 2010-11-09 23:12:41

+0

對不起,我誤解了代碼。 A是以行主要順序存儲爲一維數組的二維數組。謝謝。 – Rowhawn 2010-11-09 23:25:33

0

這裏我沒有看到使用READ宏的觀點。如果你必須使用這種語義,你需要這樣做:

writearr(result, n, r, c, (READ(r, c, A) * READ(c, r, A)));