作者loveme00835 (高髮箍)
看板C_and_CPP
標題Re: [問題] const問題
時間Wed Nov 9 04:04:54 2011
※ 引述《handsomepow (handsomepow)》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: Dev C++
: 問題(Question):
: 題目規定要用
: void multiply(const double** const mx,
: const double* const vr,
: int m,int n,double* const pt)
: 但是如果不加上const就跑的出來
: 不知道是哪裡有問題 請高手指導一下 謝謝
: 程式碼(Code):(請善用置底文網頁, 記得排版)
: http://codepad.org/oFbwP78W
先跟你說這介面定得
爛爆, 以屬性來說 m, n 分別代表矩陣的列、
行數, 既然是矩陣的屬性, 參數在清單中的位置應該擺一起:
void multiply(
const double** const mx,
const double*
const vr,
int m,
int n,
double*
const pt)
↓
void multiply(
const double** const mx,
int m,
int n
const double*
const vr,
double*
const pt )
後面 vr(行向量) 因為也有相同的列數, 所以 n 不用再傳一個,
基本上多傳一個可以保持它的完整性, 但是那意味著你要測試的複
雜度相對變高.
其實我還蠻佩服很多人腦內的 mapping 機制都超強. double*是什
麼? 「它是一個列向量」既然是一個列向量, 你不會把它寫成:
typedef double Element;
typedef Element* Row;
typedef Row* Matrix;
清爽多了嗎?
看行就是行, 看列就是列, 矩陣的配置於是變成這樣:
Matrix mx =
new Row[ m ];
// 為矩陣配置 m 個列
for( size_t row = 0; row < m; ++row ) {
mx[ row ] =
new Element[ n ];
// 為每一列配置 n 個元素
}
然後 multiply() 可以變成這樣
(版本2):
typedef Element* Column;
void multiply( Matrix mx, size_t m, size_t n,
Column vr,
Column pt )
這樣雖然可以大概猜出函式在做什麼, 但並沒有明確講出 input/
output 變數有哪些, 這時還需要引進更多的 typedefs:
typedef Element
const ConstElement;
// 此元素無法被更改
typedef ConstElement*
const ConstRow;
// 此列無法配置新元素
typedef ConstRow*
const ConstMatrix;
// 此矩陣無法配置新的列
typedef ConstElement*
const ConstColumn;
矩陣和行向量相乘結果還是一個行向量, 最後 multiply() 的樣子
(版本3):
void multiply( ConstMatrix mx, size_t m, size_t n,
ConstColumn vr,
Column pt )
程式碼:
http://codepad.org/1J3hXo30
配置的部份還需要定義函式把配置記憶體的細節(像是new)隱藏起來
, 不然 main() 程式碼還是相依於「指標」的操作太深, 整套作下
來還是直接用struct比較快, 印出輸入的部份也最好另外寫函式來
做, 不然對於operator[]的依賴太重, 導致實作偏向ptr to ptr這
邊來.
如果客戶碼有
太多藍字(內建型態), 表示對實作型態相依太深, 雖
然你看目前程式碼稍微多了一點, 但是ADT定義的好, 後續維護跟可
讀性都會大大提高,
當你看到藍字一堆的程式碼, 應該考慮把它丟
掉而不要繼續殘害自己的眼睛.
--
★ ★ ★ ★
★ ★ ★ ███ ███ █ █▌█ ██◣ ███ ▋▋█ ★ ★ ★
█▂█ █▃█ █ ███ █▆█ █▄█ ███
★ ★ █ ◣ █ █ █ ▋██ █▆◤ ███ ███ ★ ★
Kim Jae Kyung Koh Woo Ri Cho Hyun Young Kim Ji Sook
φwindyhorse
No Eul Oh Seung A Jung Yoon Hye
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.121.197.115
※ 編輯: loveme00835 來自: 140.121.197.115 (11/09 04:18)
→ purincess:我用的是terminal的vim 所以是綠字o( 艸 ) o 11/09 04:28
→ loveme00835:囧 11/09 04:39
→ purincess:哈 藍字代表我寫很多註解 未必是壞事(但也未必是好事.. 11/09 04:40
推 tropical72:推 :) ,另實作我一直都用 ptr 2 ptr 居多說,看 MFC 也 11/09 05:36
推 handsomepow:非常感謝L大用心講解 11/09 08:30
推 xatier:推板主精美講解! 11/09 09:47
推 angleevil:有版神,快拜 11/09 13:03
推 x000032001:推! 11/09 13:22