Re: [問題] 如何把[][]傳到副程式去??
※ 引述《aecho (星空下的鮪魚)》之銘言:
: ※ 引述《ledia (contemplation)》之銘言:
: : myAry.row = row;
: : myAry.col = col;
: : myAry.array = (int **) malloc(sizeof(int *) * row);
: : for (i=0;i<row;i++)
: : {
: : myAry.array[i] = (int *) malloc (sizeof(int) * col);
: : for (j=0;j<col;j++)
: : myAry.array[i][j] = count++;
: : }
: : print_struct(&myAry);
:
: 拿學長的code問一個問題 XD
: 上面的是不是可以弄成一段連續的記憶體空間
: 嗯 只是突然想到的 …
: 因為這樣宣告的話,好像會變成一條一條的…
二維陣列的問題好像常常出現,可以參考一下精華區啦,有介紹各種常用的方式。
對於傳遞大型資料,個人的建議是儘量包裝成 class(或 struct):
class X { ... };
// 假設 sizeof(X) 大到你不能忍受傳值呼叫(複製參數),有動態配置記得加上去
// 假設 N = sizeof(X) / sizeof(int)
// 如果 N <= 2,直接用傳值就好了
// 如果 N <= 10,非核心或大量使用,直接傳值無妨
// 如果 N > 1024,最好乖一點,不要直接傳值。
// 其他狀況,自己評估。(總之,大、小是相對的)
基本方法:
void foo(X &); // C++
void foo(X *); // C
如果養成好習慣,光看這個函式的介面,參數是 reference or pointer to
non-const object,就知道它用來作為輸入和輸出。
換言之,如果只是作為函式的輸入,而非輸出,最好是養成好習慣加上 const:
void foo(X const &);
void foo(X const *);
這樣寫還有很多好處,例如萬一 class X 的實作改了,函式的介面不用改。
(最重要的是看得清爽,看到兩連星、甚至三連星以上頭就昏)
如果要傳遞的東西恰好是二維陣列的話,可以考慮:
(C++)
typedef std::vector<std::vector<T> > Array2D_T;
void foo(Array2D_T &); // 視是否作為輸出決定加不加 const
如果是三維以上的話,可以考慮用 boost::multi_array
(C)
如果確知 n1, n2 的話,可以這樣:
void foo(T (*)[n1][n2]); // 作為輸入和輸出
void foo(T const (*)[n1][n2]); // 只作輸入時,加 const
不過只有 C99 支援非常量規模的 Array,所以當 n1 或 n2 是變量時,C++ 不能這樣寫。
(如果 n1, n2 都是編譯期常量,C++ 可以寫:void foo(T (&)[n1][n2]);
看不習慣的話可以用 typedef,例如:
typedef T (*P_Array)[n1][n2];
typedef T (&R_Array)[n1][n2];
void foo(R_Array); // 輸入和輸出
void foo(R_Array const); // 只用來輸入 )
如果不知道的 n2 的話:
1.如果只有 C 編譯器,建議使用基本方法,就是寫一個 struct X 把它包起來,
2.或者直接使用現有的程式庫,這個部份 C 的語法太繁複了,即使你已寫過 n 遍,
當你寫(或剪貼相似代碼再修改)第 n+1 遍時,仍然有可能在小細節上出錯。
3.強烈建議改用 C++ 來寫,因為它有現成的工具(標準程式庫的 std::vector 或
boost::multi_array)。既然目的只是要傳二維陣列,不要浪費時間在微小的細
節上面。
寫了一堆之後,發覺 C/C++ 真是麻煩 ... orz ...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.120.214.120
推
03/31 12:37, , 1F
03/31 12:37, 1F
推
03/31 16:05, , 2F
03/31 16:05, 2F
推
04/01 10:12, , 3F
04/01 10:12, 3F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章