我有一個簽名爲double func(double,...)
的函數,我確定我傳遞給func的所有參數都是double類型的。所有參數都存儲在一個名爲arguments的向量中,我只是想知道是否有辦法編寫一個通用代碼來將argumentVector中指定的任意數量的參數傳遞給func?C++:調用與數組中存儲的各種參數的函數?
類似:
for (int i=0;i<agumentVector.size();i++)
pushstack(argumentVector[i]);
res = call(func);
到目前爲止,我已經試過這個代碼,但它似乎有問題:
double* param = &argumentVector[0];
for(int i=0;i<argumentVector.size();i++)
{
_asm sub esp,8;
_asm fld param;
_asm fstp qword ptr [esp];
param++;
}
_asm call func;
_asm add esp,10h;
_asm fstp qword ptr res;
--just一個瘋狂的結果我得到!此代碼運行沒有任何問題:
double x[2] = {5,6};
double *param = x;
double res;
_asm sub esp,8;
_asm fld x;
_asm fstp qword ptr [esp];
_asm sub esp,8;
_asm fld x+8;
_asm fstp qword ptr [esp];
param++;
_asm call p;
_asm add esp,10h;
_asm fstp qword ptr res;
cout << res << "\n";
而在這一個參數不能正確傳遞!
double x[2] = {5,6};
double *param = x;
double res;
_asm sub esp,8;
_asm fld param;
_asm fstp qword ptr [esp];
_asm sub esp,8;
_asm fld param+8;
_asm fstp qword ptr [esp];
param++;
_asm call p;
_asm add esp,10h;
_asm fstp qword ptr res;
cout << res << "\n";
你知道爲什麼嗎?我雖然x和param都是簡單的數組!
--edit2--
這裏是完整的彙編代碼到目前爲止VC產生
double x[2] = {5,6};
010E1A05 fld qword ptr [[email protected] (10EB928h)]
010E1A0B fstp qword ptr [ebp-48h]
010E1A0E fld qword ptr [[email protected] (10EB878h)]
010E1A14 fstp qword ptr [ebp-40h]
double *param = x;
010E1A17 lea eax,[ebp-48h]
010E1A1A mov dword ptr [ebp-54h],eax
double res;
p(param[0],param[1]);
010E1A1D mov esi,esp
010E1A1F mov eax,dword ptr [ebp-54h]
010E1A22 sub esp,8
010E1A25 fld qword ptr [eax+8]
010E1A28 fstp qword ptr [esp]
010E1A2B mov ecx,dword ptr [ebp-54h]
010E1A2E sub esp,8
010E1A31 fld qword ptr [ecx]
010E1A33 fstp qword ptr [esp]
010E1A36 call dword ptr [ebp-14h]
010E1A39 fstp st(0)
010E1A3B add esp,10h
010E1A3E cmp esi,esp
010E1A40 call @ILT+795(__RTC_CheckEsp) (10E1320h)
{
_asm sub esp,8;
010E1A45 sub esp,8
_asm fld param+8;
010E1A48 fld dword ptr [ebp-4Ch]
_asm fstp qword ptr [esp];
010E1A4B fstp qword ptr [esp]
_asm sub esp,8;
010E1A4E sub esp,8
_asm fld param;
010E1A51 fld dword ptr [ebp-54h]
_asm fstp qword ptr [esp];
010E1A54 fstp qword ptr [esp]
}
_asm call p;
010E1A57 call dword ptr [ebp-14h]
_asm add esp,10h;
010E1A5A add esp,10h
_asm fstp qword ptr res;
010E1A5D fstp qword ptr [ebp-64h]
cout << res << "\n";
010E1A60 push offset string "\n" (10EB834h)
010E1A65 mov esi,esp
010E1A67 sub esp,8
010E1A6A fld qword ptr [ebp-64h]
010E1A6D fstp qword ptr [esp]
010E1A70 mov ecx,dword ptr [__imp_std::cout (10EF3A8h)]
010E1A76 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (10EF3ACh)]
010E1A7C cmp esi,esp
010E1A7E call @ILT+795(__RTC_CheckEsp) (10E1320h)
010E1A83 push eax
010E1A84 call std::operator<<<std::char_traits<char> > (10E1294h)
010E1A89 add esp,8
return 0;
你可以修改'func()'還是你堅持不得不在主叫方做所有事情? – 2011-12-26 20:12:42
我可以創建一個測試函數(正如我已經做的那樣),但最終我試圖與一些庫一起工作,所以我被困在客戶端! – Ali1S232 2011-12-26 20:16:46
如果您有權訪問可變參數模板,則可以在參數包中使用遞歸和參數準備來執行此操作。只是一個想法,因爲我現在沒有時間把它寫成一個完整的答案。 – Xeo 2011-12-26 20:39:41