Re: [問題] 如何把[][]傳到副程式去??

看板C_and_CPP (C/C++)作者 (cppOrz)時間18年前 (2006/03/31 00:44), 編輯推噓3(300)
留言3則, 3人參與, 最新討論串1/1
※ 引述《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
文章代碼(AID): #14B0hLAH (C_and_CPP)
文章代碼(AID): #14B0hLAH (C_and_CPP)