看板 C_and_CPP 關於我們 聯絡資訊
這問題可能有點牛角,希望能引起一點討論或想法,以解小弟不才之惑。 最近看到 C language 中一段 code ,由於實屬管中窺豹,我看不到 function body, 推了一陣之後認為筆者寫法「可能」如下,但潛藏性的問題應很大(若我真猜中的話..), 想請教各位先進有何看法。 ------ int **ivec = imatrix(1, 10, 1, 15); /* 將生成 ivec[1..10][1..15] */ int **sub = isubmatrix(ivec, /* 從 ivec裡面複制部份元素 */ 3, /* 第一維從3開始 */ 5, /* 第一維到5結束*/ 4, /* 第二維從4開始*/ 8, /* 第二維到8結束*/ 100, /* sub 第一維從100開始 */ 1000); /* sub 第二維從1000開始*/ 第二行簡單的說, sub[100..102][1000..1004] = ivec[3..5][4..8]; 這裡要硬做的話是做的出來, 只是過程中會不段調用 macro/sub_function 去調整 index, 但在主函式裡面,它反而又是這麼寫 int main() { int i, j, cnt, **ivec = imatrix(1, 10, 1, 15); // ivec[1..10][1..15] for(cnt=0, i=1; i<=10; ++i) for(j=1; j<=15; ++j) ivec[i][j]=++cnt; free_imatrix(ivec, 1, 10, 1, 15); return 0; } -------- 以 int **a = imatrix(start_x, end_x, start_y, end_y) 而言, 我「推測」做法應類似如下 (跳過 catch malloc fail 情況), 也想請教這裡是否有更佳之做法。 int ** imatrix(unsigned sx, unsigned ex, unsigned sy, unsigned ey) { int **t; unsigned i, j; t = (int**)malloc(sizeof(int*) * (ex+1) ); /* 0~ex */ /* 這行是我猜的 */ for(i=0; i<sx; ++i) free(t[i]); for(i=sx; i<=ex; ++i) t[i] = (int*)malloc(sizeof(int) * (ey+1) ); /* 下面這兩行也是我猜的 */ for(i=sx; i<=ex; ++i) for(j=0; j!=sy; ++j) free(&t[i][j]); return t; } 這麼做,無疑效率變非常差,甚至會有嚴重空洞現象, 想請問是否有其它想法 這方法我認為有一嚴重缺點,sx、sy 本身起始值很大時, a[100000..100002][100000..100002] 本來只是要 [0..2][0..2] , malloc 可說幾乎必成功, 但要先配 100003 個,有可能導致失敗。 ----------- 以上,謝謝各位不吝指教,感激不盡 *^_^* -- YouLoveMe() ? LetItBe() : LetMeFree(); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.78.41 ※ 編輯: tropical72 來自: 180.177.78.41 (08/01 12:41)