Re: [問題] 請問有辦法讓陣列的index從1開始嗎?
※ 引述《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)
推
11/05 09:04, , 1F
11/05 09:04, 1F
→
11/05 09:42, , 2F
11/05 09:42, 2F
推
11/05 13:01, , 3F
11/05 13:01, 3F
推
11/05 16:44, , 4F
11/05 16:44, 4F
→
11/05 16:44, , 5F
11/05 16:44, 5F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 4 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章