作者realmeat (真肉)
看板C_and_CPP
標題Re: [問題] 請問有辦法讓陣列的index從1開始嗎?
時間Thu Nov 5 02:23:53 2009
※ 引述《HeyScng ( )》之銘言:
: 剛剛在書中的程式看到的,不過目前還看不懂他在寫什麼,
: 大概跑了一下也是抓不到規律,有興趣的人可以看看! 謝謝!
: float **matrix(long nrl, long nrh, long ncl, long nch)
: /* allocate a float matrix with subscript range m[nrl..nrh][ncl..nch] */
: {
: int NR_END = 1;
: long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
: float **m;
: /* allocate pointers to rows */
: m=(float **) malloc((size_t)((nrow+NR_END)*sizeof(float*)));//size_t???
: if (!m) nrerror("allocation failure 1 in matrix()");
: m += NR_END; m -= nrl;
: /* allocate rows and set pointers to them */
: m[nrl]=(float *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(float)));
: if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
: m[nrl] += NR_END; m[nrl] -= ncl;
: for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
: /* return pointer to array of pointers to rows */
: return m;
: }
跑了一下才知道它要幹嘛
難怪會取到軌異的位置去
簡單的說就是
取個矩陣只有指定的範圍才有宣告實體位置
其他則都沒宣告實體位置
寫法相當差, 很多無意義的程式碼
個人習慣, 全面性改寫
float **matrix(long row_low, long row_high, long col_low, long col_high)
{
long i;
long row_sub = row_high-row_low+1;
long col_sub = col_high-col_low+1;
// 宣告放指標的空間
float **m=(float **) malloc((size_t)((row_sub)*sizeof(float*)));
if (!m){
//error ("allocation failure 1 in matrix()");
return NULL;
}
// 宣告放float的空間
float* m2=(float *) malloc((size_t)((row_sub*col_sub)*sizeof(float)));
if (!m2){
//error ("allocation failure 2 in matrix()");
return NULL;
}
m[0] = m2-col_low; // 做col 位移
// 依序填入值
for(i=1; i<row_sub; i++){
m[i] = m[i-1]+col_sub;
}
return &m[-row_low]; //做row 位移
}
簡單的說就是宣告2次陣列的簡單程式
然後把位址移動一下欺騙程式就好了
寫那麼複雜是怎樣?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.204.174.200
※ 編輯: realmeat 來自: 123.204.174.200 (11/05 02:26)
推 QQ29:那本書真的都這樣寫 還滿難讀他的code的= = 11/05 09:04
→ TeaEEE:我一直認為這本書主要是賣他的CD才把code給寫成這樣 11/05 09:42
推 snowlike:不好意思個人觀感,除不採第一位址不用,不清楚簡化哪裡 11/05 13:01
推 ledia:我覺得他的程式寫得很好懂呀, 改寫也沒差多少 11/05 16:44
→ ledia:NR_END 應該有他的用處在 11/05 16:44