0

问题部分解决:请阅读底部

有问题的可变参数函数,最简单的是:

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);

提前致谢。

4

2 回答 2

2

编辑:我没有看到评论中已经提到了这一点。

如果重新启动解决了问题,那将向我表明问题并没有真正解决,只是碰巧没有引起症状。

如果第一个问题真的解决了,第二个函数中的以下行可能会导致第二个问题:

va_start (app, in_variable->arrayaccess->num_dimensions);

那应该是

va_start (app, in_variable);

当然。

根据您的评论,我怀疑当第一种情况不起作用时,您实际上是将局部变量作为第二个参数传递给va_start而不是函数参数。

于 2012-05-02T11:40:25.127 回答
0

尝试删除内联并使其成为正常功能。

于 2012-05-02T11:07:04.927 回答