【发布时间】:2012-05-02 10:54:10
【问题描述】:
问题已部分解决:请阅读底部
所讨论的可变参数函数,最简单的是:
inline Variant::Variant(int type, int dims, ...)
{
va_list ap;
va_start (ap, dims);
//Removed Variant handling code here
int i=0;
for(;i<dims;i++){
int size = va_arg (ap, int);
}
//Likewise, Removed Variant handling code here
va_end (ap);
}
如您所见,有问题的函数是我的 Variant 类的重载构造函数。这个特定的构造函数在声明数组时会考虑维度的大小和数量。
所以这条线在我的 main() 中运行:
Variant(ARRAY_ARRAYTYPE, 3, 800, 22, 22);
当我在
之后立即断点int size = va_arg (ap, int);
在函数中,我得到如下结果:
size holds the value of 800 (correct)
size holds the value of -43587879... (WTF)
size holds the value of 4387643543 (WTF)
然后程序段错误,因为显然这些是完全无效的值。
有什么想法吗?提前致谢。
问题已部分解决:重新启动以某种方式解决了该问题,但现在又出现了一个新问题...
我之后调用的 OTHER 可变参数函数似乎获取了任何参数 被传递给 Variant() 构造函数而不是它自己的构造函数。有什么想法吗?
Variant* ArAcc(Variant* in_variable, ...)
{
va_list app;
int index=0;
int i, j;
int mult;
va_start (app, in_variable->arrayaccess->num_dimensions);
for(i=0;i<in_variable->arrayaccess->num_dimensions;i++){
mult = 1;
for(j=i+1;j<in_variable->arrayaccess->num_dimensions;j++){
mult = mult * in_variable->arrayaccess->dim_sizes[j];
}
int size = va_arg (app, int);
mult = mult * size;
index += mult;
}
va_end (app);
return &((*in_variable)[index]);
}
与...
ArAcc(&SomeVariant, 7, 9);
提前致谢。
【问题讨论】:
-
你试过添加__cdecl修饰符吗?
-
是的,没有任何变化,同样的问题。
-
我用 g++ 4.6.2 试了一下(在循环中打印大小):它有效。
-
这真的很奇怪。好吧,我在 Windows 上同时使用 VC++2008 和 minGW 进行编译,它们都有这个问题。我会尝试重新启动。
-
linux.about.com/library/cmd/blcmdl3_va_start.htm 声明 va_start 应该有函数的最后一个已知参数,所以它应该是 "va_start(app, in_variable);",而不是 "va_start (app, in_variable->arrayaccess-> num_dimensions);",这很奇怪,因为你说这个版本可以工作......
标签: c++ function parameters variadic