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

編集:これがコメントですでに言及されているのを見ませんでした。

再起動によって問題が解決した場合、それは問題が実際には解決されていないことを示し、症状を引き起こさないだけです。

最初の問題が実際に解決された場合、2番目の関数の次の行が2番目の問題を引き起こしている可能性があります。

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

それは

va_start (app, in_variable);

もちろん。

あなたのコメントに基づいて、最初のケースが機能していなかったとき、実際にva_startは関数の引数の代わりに2番目のパラメーターとしてローカル変数を渡していたと思います。

于 2012-05-02T11:40:25.127 に答える
0

インラインを削除して、通常の関数にしてください。

于 2012-05-02T11:07:04.927 に答える