2011-02-01 31 views
3

我想將我在程序中的矩陣的特定列傳遞給函數。 如果我使用呼叫<function_name>(<matrix_name>[][<index>]);作爲呼叫 然後我得到的錯誤將矩陣中的列傳遞給函數c

error: expected expression before ‘]’ token

所以,請幫我找到合適的方式 感謝

回答

5

您使用不存在的語法。

矩陣按行存儲在內存中(或者更好,在第二個維度中,您可以爲其指定行的語義),因此您不能在本地執行此操作。您可以將所有列元素複製到矢量(單維數組)中並傳遞它。

如果您只需要按列操作(而不是按行操作),則可以更改爲第一個維和第二個維創建的語義:將矩陣視爲matrix[row][column]而不是matrix[column][row]

否則,如果你需要經常這樣做,尋找一個更好的數據結構,而不是一個簡單的數組。

+0

試試這個替代結構http://stackoverflow.com/questions/3244495/most-efficient-way-to-get-columns-of-a-multi-dimensional-array-in-c/3245008#3245008 – JeremyP 2011-02-01 19:36:22

1

您將不得不重新格式化數據。該列在內存中不連續。例如,如果你有一個數組:

arr[5][4] 

然後試圖通過一個「列」無異是想每5個元素通過在數組中。把它看作一個巨大的陣列。

1

這裏有幾件事你需要記住C語言。

我假設你的矩陣存儲爲一個二維數組,像這樣:

float mat[4][4];

你需要記住的是,這是存儲在內存中連續只有16彩車;你可以訪問mat [3] [2]的事實只是編譯器給你的一個捷徑。不幸的是,它實際上並沒有將這些元數據傳遞給其他函數調用。訪問墊[3] [2]實際上是一個快捷方式:

mat[ (3*4 + 2) ]

當你進入一個功能,您需要指定要傳遞的矩陣的界限,然後列數量:

void do_processing(float* mat, int columns, int rows, int column_idx)

在這個函數中,你必須自己計算出特定條目,用公式:

mat[ (column_idx * rows) + row_idx ]

1

由於處理作品的方式,您不能簡單地傳遞'列',因爲'列'值實際上存儲在'行'中。這就是爲什麼你的編譯器不允許你在'行'引用中傳遞任何值,即:'[]'。

一個簡單的解決方案是傳遞整個矩陣,並將列索引作爲單獨的整數和行數傳遞。然後,您的函數可以遍歷每一行來訪問該列的所有成員。 即:

functionName(matrixType** matrixRef, int colIndex, int numRows) 
{ 
    for(int i=0; i< numRows; ++i) 
     matrixType value = matrixRef[i][colIndex]; //Do something 
}