看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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)
Lepton:可以請教一下T **val = va_arg(argv, T**);這句嗎? 01/16 21:05
Lepton:為什麼是放T**呢?至於沒用new是因為這不是純C++不支援 01/16 21:07
Lepton:配置記憶體的API->cudaMalloc(void ** devPtr,size_t s) 01/16 21:09
Lepton:cudaHostAlloc也是一樣只是要多放一個flag 01/16 21:10
Lepton:C++11的看起來比較好懂,我會再試試看,謝謝! 01/16 21:11
EdisonX:我比較好奇的是,此例在C++11用 initialize list 沒較好嗎 01/16 22:01
Feis:那我補充一下~ 我個人是覺得他這需求就別用了 01/16 22:07
※ 編輯: Feis 來自: 140.112.29.148 (01/16 22:18)
Feis:@Lepton: 那你發現 cudaMalloc 是 void ** 當參數嗎~ 01/16 22:20
Lepton:是,但是我一直沒弄懂直接用而已... 01/20 09:26