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