作者loveme00835 (朴髮箍)
看板C_and_CPP
標題Re: [問題] malloc"又"一問...
時間Tue Apr 12 04:51:27 2011
※ 引述《KSJ (阿真)》之銘言:
恕刪
: 貼上重點
: 函式test:
: {
: long int row;
: long int col;
: double *array_2d;
: PyObject *LIST;
: pylist2array(LIST, &row, &col, &array_2d);
: }
: 宣告要用到的變數 然後放到下面這個函式
: void pylist2array(PyObject *pylist,
: long int *M,
: long int *N,
: double **array_2d)
建議把參數名改成 p_array_2d 之類的, 這樣比較能表達你想對它
做的操作:
○
1.一個 double* 變數的位址
╳
2.一個 double** 變數的值
1、2的差別在於, 第一個直接 dereference絕對合法, 後者就不一
定了.
同理 M, N 除非在問題領域有特殊的涵義, 建議改成 p_row、p_col
, 函式的 prototype 於是焉變成這樣:
void pylist2array( PyObject *pylist,
long int *p_row,
long int *p_col,
double **p_array_2d );
: M跟N是array_2d的row跟col 會在函式中給值 用來malloc用的
: 補充說明(Supplement):
: pylist2array函式中
: 程式會抓取pylist的row跟col 放到 *M 跟 *N 中
養成良好習慣, 為它們加上括號, 之後你就知道為什麼:
(*p_row) = pylist->row;
(*p_col) = pylist->col;
: 然後
: *array_2d = (double *)malloc((*M)*(*N)*sizeof(double));
(*p_array_2d) = (
double*)malloc( (*p_row) * (*p_col) *
sizeof(
double) );
在這邊的 (*p_array_2d) 就是傳進來的引數 array_2d, 所以當你
想用 array_2d[ 0 ]來取矩陣裡的元素, 在函式裡則要寫成:
(*p_array_2d)[ 0 ] = 99.9;
才有一樣的效果.
: 動態配置
: double a = PyFloat_AsDouble(pyitem);
: py值轉c double
: *array_2d[(*M)*i+j] = a;
(*p_array_2d)[ ((*p_row) * i) + j ] = a;
: 放入陣列中 (i是row j是col)
: 結果只能放入第一個值… *array_2d[0]
: 之後就爆掉了
: 因為是第一次用** 觀念來可能還差一點
: 錯在哪看不出個所以然來( 黃色程式碼是自認為可能有誤的部份)
: 希望能提點一下 感恩 <(_ _)>
接下來用圖解:
(*p_array_2d) = (
double*)malloc( (*p_row) * (*p_col) *
sizeof(
double) );
┌─────┐
│p_array_2d├──┐
└─────┘ ↓
┌─────┐ ┌──┬──┬──
│ array_2d ├─→ │ │ │ 。。。
└─────┘ └──┴──┴──
當你寫成 *p_array_2d[ 2 ] = a; 跟寫成 *(p_array_2d[ 2 ]) = a;
是一樣的:
┌─────┐
│p_array_2d├──┐
└─────┘ ↓
┌─────┐ ┌──┬──┬──
[ 0 ] │ array_2d ├─→ │ │ │ 。。。
├─────┤ └──┴──┴──
[ 1 ] │ │
├─────┤ ┌──┐
[ 2 ] │ ├─→ │
a │
├─────┤ └──┘
│ 。 │
。
。
不過為了隱藏不必要的符號, 我通常會在函式的最後才為參數指向
的變數賦值, 而中間主要的演算法部分都用自動變數來取代:
void pylist2array( PyObject *pylist,
long int *p_row,
long int *p_col,
double **p_array_2d )
{
long int row = pylist->row,
col = pylist->col;
double *array_2d = (
double*)malloc( row * col *
sizeof(
double) );
// 其他程式碼 ...
array_2d[ (row * i) + j ] = a;
(*p_row) = row, (*p_col) = col;
(*p_array_2d) = array_2d;
}
最後再嘮叨一句: 都用 VC 寫了, 改傳 reference 吧!
--
▂▅▂ ▁ ● ◣ 朴 ☆ 素 ★ 妍 ◢
◢ ◣ ◢▂▂◣ ◢▂※◣ ◢▄▂◣ T.T.L Listen 2
★ ★ ★ ★ ▉ ★ ★▏▉ ★ ★◣ http://ppt.cc/jIUk
◥ˇ◢ ▃◥ˇ◤▃ ◥ˇ◤ ◥ˇ◤◢ 說什麼結束
▃▃▇▃▃ ◢▇◣ ▋
▎ ▋¥▎ ◢ http://ppt.cc/zQtB
▼ ▼ ▼ ▼ ψ髮箍 ◤ ◣
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.121.197.115
※ 編輯: loveme00835 來自: 140.121.197.115 (04/12 05:16)
推 KSJ:萬分感謝>"< 小的受教了 不過…還有個fatal error… 04/12 05:48
→ KSJ:我用一維代替二維的時候應該要是 [i*col+j] 而不是[i*row+j] 04/12 05:49
→ KSJ:程式想久了 人都傻了... 再次謝謝版大 繼續努力去!!! 04/12 05:51
推 xatier:推版主用心圖解:) 04/12 12:46
推 VictorTom:推圖XD 04/12 21:05