Re: [問題] 不定參數的函式可以放指標嗎?

看板C_and_CPP (C/C++)作者 (永遠睡不著 @@)時間12年前 (2014/01/16 20:03), 編輯推噓2(207)
留言9則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《Lepton (輕子)》之銘言: : 問題是這樣的,我參考 <stdarg.h> 發現可以實作不定參數的函式 : 我現在想寫一個一般化函式幫我處理記憶體配置 : template<class T, int Nx>void HostMallocTest(int arg, n_pointer...) : { : //malloc all pointer : Malloc( (void **) &kx, sizeof(T) * Nx); : .... : .... : } : 程式碼的示意圖大概是這樣, : 我讀 stdarg.h 的感覺是沒辦法回傳資料,所以沒辦法處理指標 : 搜尋過版上、google沒有找到解,想請問各位有辦法實作這件事情嗎? : 謝謝! 應該有什麼地方有誤解. 你要改變的是指標所儲存的位址, 所以應該要傳指標本身的位址或指標本身的參考進入 HostMallocTest 因為你用的是 va_list, 我想應該是無法傳參考. 要傳該指標本身的位址進入 HostMallocTest #include <cstdarg> template<class T, int Nx> void HostMallocTest(int argc, ...) { va_list argv; va_start(argv, argc); for (int i = 0; i < argc; ++i) { T **val = va_arg(argv, T**); *val = new T[Nx]; // 原本的 Malloc 用意不明, 這裡用比較合理的 new } va_end(argv); } int main() { int *a, *b, *c; HostMallocTest<int, 10>(3, &a, &b, &c); return 0; } 此外 C++ 11 應該可以用 template 的方式在編譯期取代: template<int Nx> void HostMallocTest() {} template<int Nx, class T, class...Targs> void HostMallocTest(T **arg, Targs... args) { *arg = new T[Nx]; HostMallocTest<Nx>(args...); } int main() { int *a, *b, *c; HostMallocTest<10>(&a, &b, &c); return 0; } -- [編輯補充] 或者在 C++11 用 initializer_list 替代 va_list 的功能: #include <initializer_list> template<int Nx, class T> void HostMallocTest(std::initializer_list<T **> l) { for (auto p : l) { *p = new T[Nx]; } } int main() { int *a, *b, *c; HostMallocTest<10>({&a, &b, &c}); return 0; } -- 很多小地方要改, 但是概念上這樣應該沒錯? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.29.148 ※ 編輯: Feis 來自: 140.112.29.148 (01/16 20:13)

01/16 21:05, , 1F
可以請教一下T **val = va_arg(argv, T**);這句嗎?
01/16 21:05, 1F

01/16 21:07, , 2F
為什麼是放T**呢?至於沒用new是因為這不是純C++不支援
01/16 21:07, 2F

01/16 21:09, , 3F
配置記憶體的API->cudaMalloc(void ** devPtr,size_t s)
01/16 21:09, 3F

01/16 21:10, , 4F
cudaHostAlloc也是一樣只是要多放一個flag
01/16 21:10, 4F

01/16 21:11, , 5F
C++11的看起來比較好懂,我會再試試看,謝謝!
01/16 21:11, 5F

01/16 22:01, , 6F
我比較好奇的是,此例在C++11用 initialize list 沒較好嗎
01/16 22:01, 6F

01/16 22:07, , 7F
那我補充一下~ 我個人是覺得他這需求就別用了
01/16 22:07, 7F
※ 編輯: Feis 來自: 140.112.29.148 (01/16 22:18)

01/16 22:20, , 8F
@Lepton: 那你發現 cudaMalloc 是 void ** 當參數嗎~
01/16 22:20, 8F

01/20 09:26, , 9F
是,但是我一直沒弄懂直接用而已...
01/20 09:26, 9F
文章代碼(AID): #1Irygc5I (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Irygc5I (C_and_CPP)