看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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