這問題可能有點牛角,希望能引起一點討論或想法,以解小弟不才之惑。
最近看到 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)