Re: [請益] 年紀大的人適合進來這行嗎?
※ 引述《sedgewick (三分熟的鬧鐘)》之銘言:
: 我就寫一段小小的程式碼, 來說明為什麼 C coder 需要經驗.
:
: unsigned char myarray[1000], *s, n;
:
: n = 4;
: s = myarray + 100;
: s[-n] = 4;
:
: 把其中的 n 從 type char 改成 type short 就可能會當.
: 請問為什麼?(以上是我從某個鳥程式所取出來並化簡過的魔物. )
:
: 但是也可能不會當, 請問又是為什麼?
:
: 推 tyc5116:能不能公佈一下那段程式的答案,很詭異XD
那個答案倒還好, 前因後果才有趣...
話說這段 code 來自於某個大概 5,000 行左右的 C codes.
算是一個不大不小的東西...
某天有個程式員跟我抱怨他的程式一直當.
也特別強調本來好好的.
這傢伙從來不用 version control system, 版本差異全部靠紙筆作業.
當然, 外加滿滿的
myproject-20140320-1.bak/
myproject-20140323-1.bak/
myproject-20140326-1.bak/
myproject-20140326-2.bak/
myproject-20140329-1.bak/
這種老派程式員其實寫起程式來還是有模有樣的.
裡面有
#define DATA_SET_SIZE 200
typedef unsigned char datatype;
typedef datatype mycounter;
typedef datatype dataset[DATA_SET_SIZE*4];
struct dataencaps {
mycounter n;
dataset s;
};
struct dataencaps mydata;
像這樣的東西, 而且會很乾淨地放在一個 .h 的 header file.
換句話說, 你根本不會特別研究這個 mydata.n 是什麼 data type.
因為這種寫法會讓人覺得「其實他對資料結構已經考慮得很清楚了」.
我花了很久的時間才領悟「華麗的草包依舊是草包」(此話鮮血淋漓. )
這是其中一個例子.
然後他有這樣的迴圈, 寫在另一個遙遠的 .c file 裡面:
mydata.n = DATA_SET_SIZE/2;
t = &mydata.s[mydata.n];
while (mydata.n) {
t[-mydata.n] = my_reversed_first_half(...);
mydata.n--;
}
這個迴圈真是非常正常........如果不看 .h 裡面的東西.
前面有鄉民指出 s[-(unsigned int)1] 這種東西不正確......
當然這寫法不太合理(如今的記憶體已經巨大到不能肯定這不正確. )
但就有天才可以把它「調整到會動」.
寫法就像這個迴圈(迴圈倒著寫並不詭異, 算是常見的技巧. )
只要一直用同樣的 index domain, 加上夠大的 t[].
那一定會產生同樣的結果──雖然資料並不是存在預期中的 t[0]~t[99].
但總而言之, 它不但不會當, 而且只要寫法一致, 怎麼測都是正確的.
但是把
typedef unsigned char datatype;
改成
typedef unsigned short datatype;
就當了.
糟糕的是他忘了他改過什麼(每份 backup 都改了一大沱... )
此外他非常喜歡亂用 malloc()/new() 這些東西...
更好玩的是只要開了 gdb 就不會當.
所以當 printf() 一行一行找到當掉的位置在
t[-X] = ...
但 t 是對的, X 是對的, -X 是對的, 連 t - X 也是對的...
而且 *(t - X) 正確, 至於 t[-X] 則是一印就當...
把附檔名從 .c 改成 .cpp 之後, 寫成 t[-X] 卻又沒事.
這種情形你會怎麼猜?(幸好這不是 multi-threaded program. )
花一個禮拜把 malloc()/free() 全部重查過... 大概是這樣吧?
真正印得出問題的 expression 是 &t[-X] 這種寫法.
事後我問他, 為什麼會定義成 DATA_SET_SIZE*4 這麼大的 storage size?
他的答案也很妙:「提高安全係數. 」
所以實際上程式員並不確定他會用到陣列的哪個部分. :D
--
新詩練習:新鮮。踩破初春裡的狗大便;不經意的滄桑,滿溢著嫩黃的喜悅。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.176.223.182
※ 文章網址: http://www.ptt.cc/bbs/Soft_Job/M.1396035240.A.473.html
推
03/29 07:25, , 1F
03/29 07:25, 1F
推
03/29 08:10, , 2F
03/29 08:10, 2F
推
03/29 08:12, , 3F
03/29 08:12, 3F
推
03/29 08:32, , 4F
03/29 08:32, 4F
推
03/29 10:19, , 5F
03/29 10:19, 5F
→
03/29 10:19, , 6F
03/29 10:19, 6F
→
03/29 10:36, , 7F
03/29 10:36, 7F
推
03/29 11:03, , 8F
03/29 11:03, 8F
推
03/29 11:05, , 9F
03/29 11:05, 9F
推
03/29 11:19, , 10F
03/29 11:19, 10F
→
03/29 12:00, , 11F
03/29 12:00, 11F
→
03/29 15:07, , 12F
03/29 15:07, 12F
推
03/29 15:07, , 13F
03/29 15:07, 13F
→
03/29 15:07, , 14F
03/29 15:07, 14F
→
03/29 15:08, , 15F
03/29 15:08, 15F
→
03/29 15:10, , 16F
03/29 15:10, 16F
→
03/29 22:19, , 17F
03/29 22:19, 17F
→
03/29 22:25, , 18F
03/29 22:25, 18F
推
03/29 22:37, , 19F
03/29 22:37, 19F
→
03/29 22:37, , 20F
03/29 22:37, 20F
→
03/29 22:55, , 21F
03/29 22:55, 21F
→
03/29 22:56, , 22F
03/29 22:56, 22F
→
03/29 22:56, , 23F
03/29 22:56, 23F
推
03/30 00:15, , 24F
03/30 00:15, 24F
→
03/30 22:03, , 25F
03/30 22:03, 25F
討論串 (同標題文章)