看板 C_and_CPP 關於我們 聯絡資訊
顯少看到版上發這類型的討論文,也可能較少人專門做測試這塊。 先提最大疑問: 目前有沒有 tool 可以自動生成測資, 測試程式直接 redirect 至該 file 即可? 每次自己寫的 function 自己測,要完整測試所花時間, 根本和開發時間沒什麼兩樣 Orz.. 接下來提的例子算有點特例,有一批作用目的相同,方法不同之 function, 要測其準確性,像是 int f1(int); int f2(int); ... int fn(int); 這方式要手動測不難, typedef int (*pFunc)(int); pFunc p[] = {f1, f2, ..fn}; int y[MAX]={0}; for(i=0; i<sizeof(p)/sizeof(*p); ++i) for(j=low; j<=up; j+=step) { y[j] = p[i](j); /* log y[j] */ } 比較常見到的是,裡面需要「額外」的幾個引數 ( 這也是前提,是 extension,不是 different) int f1(int a); int f2(int a, int b); // 多了 b int f3(int a, int b, int c); // 又多了 c 這時候要測就有不少可議性, 最沒問題的方法是一個一個測,但如果有近 10 個方法,就要寫 10 次測試函式, 於是想出了異想天開的方式, 拿最長的引數為基準,其它的全都擴出去,也就是 int fa(int a, int b, int c); // b, c 沒用 int fb(int a, int b, int c); // c 沒用 int fc(int a, int b, int c); // 都用 再以 function pointer 方式呼叫,不過這樣下來就改到了原 function,不好。 於是嚐試了較危險的作法,以上述 f1, f2, f3 為例。 typedef int (*pfLong)(int, int , int); // 定義最長的引數 pfLong p[] = {(pfLong)f1, (pfLong)f2, f3}; /* 硬轉型 */ int y[MAX]={0}; for(i=0; i<sizeof(p)/sizeof(*p); ++i) for(j=low; j<=up; j+=step) { y[j] = p[i](j,j,j); /* 沒用到的塞 garbge */ /* log y[j] */ } 目前這作法試過 vc, gcc, 是沒什麼大問題, 只怕到時會出包, 所以也不敢建議有相同困擾之同好以此法解決。 不知各位版友對於是否也有類似的測試經驗可提出一起討論? ( 小弟也蠻好奇 c++ 那塊有沒有較特殊的作法 ) 謝謝各位細心閱讀,最後懇請不吝賜教。 -- No matter how gifted you are, alone, can not change the world. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.78.41
LPH66:int f1_alt(int a, int b, int c){return f1(a);} 這樣如何? 12/02 00:19
tropical72:L大方法有想過,卡在若是測速度的話會拉慢.還有要架構出 12/02 00:23
tropical72:f1_alt~fn_alt 出來 (這應倒還是其次,不會佔太多時間). 12/02 00:23
yan12125:感覺有點危險,多出來的參數不知道會蓋到什麼東西 12/02 00:30
loveme00835:3-As pattern, 還有不同的測試像 ECP BVA 都了解一下 12/02 02:20
loveme00835:如果三個函式可以被綁在一起測, 那他們就是同一個函式 12/02 02:20
loveme00835:這個數值當然不應該儲存起來然後用人眼去比對, 那樣就 12/02 02:21
loveme00835:不叫測試了 12/02 02:21
先謝謝提供 keyword, 但 3-As pattern 指的是 ? 指的是先將 n 個 function 引數模式為 m 類,再寫 m 份測試 pattern 嗎? 我該舉個例子,這和大多之 ECP, BVA 舉的 username / password 不同, 假設寫了一份 C(m,n),和另一份 fastC(m,n,eps), 這目的應都屬相同,參數不同,引數、精準度也不同, (在一些場合裡根本用不到那麼高精準度,只需要速度), 在測試時我想是可被綁在一起測的,以正確性而言,只是裡面要紀錄的是 max_err_x / max_err_y,原文裡全都用 log y[j] 確實不合適。 ※ 編輯: tropical72 來自: 180.177.78.41 (12/02 03:01)
loveme00835:至於L大說的那個方法, gcc -fipa-sra 不知道可否達成 12/02 03:00
loveme00835:加速的需求, 對於 unused parameters 12/02 03:00
loveme00835:以 functor 作為引數應該不會太難 12/02 03:04
x000032001:可不可以用int func(int a, int b=0 ,int c=0)這樣呢 12/02 08:48
LPH66:樓上這樣就和原文改原來的 function 一樣了... 12/02 17:44
tropical72:L 大方法配 gcc 參數可行,謝謝提供 :) 12/02 18:56