看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《genghiskii (SaoAn)》之銘言: : //main.cpp : int main() : { : int *in, *out, *mid1, ....*midn; : new以上 : func(in, out, mid, ...midn); : free掉 : } 恕刪. 這問題在 C++ 做規劃時應會較方便 ( 就一個 class 有 data member, 再呼叫 initialize 去配置, release 做釋放) C language 寫到後來幾乎都用下列方式, 應即推文中 LPH66 大所指。 以下實例,假設要做的是二個 matrix 相乘動作,A[x][y] * B[y][z] 例子可能沒舉得很好,但應可供參考。 首先,新建二個 file, Matrix.h / Martix.c ,內容大致如下 --------------- // Matrix.h #ifndef __MATRIX__ #define __MATRIX__ void MatrixSetParam(int x, int y, int z); // 設大小 int MatrixAllocate(); // 做記憶體配置動作, return 0/1 : fail/success void MatrixRead(); // 讀取 matrix 內容 int** MatrixMulti() ; // 執行乘法, 傳回結果之 pointer void MatrixRelease() ; // 釋放記憶體大小 #end __MATRIX__ -------------- // Matrix.c #include "Matrix.h" static int **A, **B, **rst; // rst 是放結果用的 static int x, y, z; static int* Alloc1(int X) {....} // 配置一維動態記憶體 static int** Alloc2(int X, int Y) {...}// 配置二維動態記憶體 static void Free2(int **p, int X, int Y) {...} // 釋放二維動態記憶體 到以上,這些資料變數、函式之 scope 都只存在於 Matrix.c 裡面, 意即「其他地方看不到」,除非引入 Matrix.c ,但這點很多人都知道, 別那麼幹! 會寫 Alloc1, Alloc2 是因這個動作在此 file 裡很常用到, 但這二個動作卻沒必要讓 main 裡東西去管理,於是寫在 matrix.c 裡面, 不讓 main.c 看到其 scope, 這作法我認為即相似於 class 中之 private member。 --------- 接下來才繼續實做 Matrix.h 裡面有宣告的東西 void MatrixSetParam(int X, int Y, int Z) { x=X, y=Y, z=Z; } int MatrixAllocate() { A = Alloc2(x, y), B = Alloc2(y, z); rst = Alloc2(x, z); } void MatrixRead() {...} // 讀取 matrix 內容 int** MatrixMulti() {....} // 執行,傳回結果 void MatrixRelease() {....} // 釋放記憶體大小 --------- 其它的在 main 裡面就沒什麼就沒什麼特別的了 // main.c int ** rst; // 準備接結果 MatrixSetParam(2,3,4);// 設參數 MatrixAllocate(); // 配記憶體 MatrixRead(); // 讀取 matrix 內容 rst = MatrixMulti(); // 執行乘法, 去接結果 MatrixRelease(); // 結束前釋放記憶體 --------- 函式名稱我一律用 Matrix 開頭,是想效仿 class 之作用: Matrix.SetParam(2, 3, 4); <=====> MatrixSetParam(2, 3, 4); Matrix.Allocate(); <=====> MatrixAllocate(); 至於 .h / .c 命名,實為一種藝術,目前我把它當 namespace 使用, 但這部份這麼比喻確實也沒那麼恰當。 --------- 不停使用 alloc / release 時,我比較建議能包 class 就包 class 這樣在管理上比較方便,除非遇到跟我一樣的窘境: 限定,副檔名一律用 .c !! 即只能使用 C language 語法。 以上淺見,參之。 -- YouLoveMe() ? LetItBe() : LetMeFree(); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.73.222
angleevil:t哥,這是以前c用來封裝資料的方法嘛?只是c++ class有 06/21 15:15
angleevil:private member,所以不用那麼麻煩,可以這樣解釋嘛? 06/21 15:16
這方法我想在寫 hardware 的還是看得到, 畢竟 hardware「應」大多還是以 C 為主。 只是認為 c++ 如果要寫成上面這樣, 倒不如認真思考, 該程式碼是不是可以包成 class 以原原 po 而言,其程式碼「可能」是可以包成 class 的 (何況他 keyword 是用 new/delete, 非 malloc/free) 也可能是專案太小,認為還不到包 class 之地步。 ※ 編輯: tropical72 來自: 180.177.73.222 (06/21 15:34)
tomap41017:推熱心分享!!辛苦了 06/21 15:58
angleevil:發卡<m.m> 06/21 16:01
loveme00835:static才是看不到喔! 不然我extern一樣用得到 06/21 16:11
tropical72:完全忘了這件事,多謝 loveme00835 補充指正這件事。 06/21 16:12
hilorrk:推樓上 我前幾天才犯過一模一樣的錯 忘記static才會找不到 06/21 19:02
ericwang1017:C有function pointer, 應該不用弄的那麼怪吧? 06/21 22:01
ericwang1017:struct包含fp,應該會更趨近於C++ 06/21 22:02
tropical72:eric~所指確實為是,只是用 C 模擬class實在是..到時引 06/21 22:44
tropical72:數要改麻煩很多,此篇只是針對原原po提一點經驗.離真正 06/21 22:45
tropical72:之 OO 實做的確是差很遠!! 06/21 22:45
ericwang1017:了解,謝分享 06/21 23:05
genghiskii:感謝分享! 06/21 23:27
※ 編輯: tropical72 來自: 180.177.78.41 (11/11 17:19)