作者Feis (永遠睡不著 @@)
看板C_and_CPP
標題Re: [問題] 不定參數的函式可以放指標嗎?
時間Thu Jan 16 20:03:47 2014
※ 引述《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