問題 部分的に解決: 下部をお読みください
問題の可変個引数関数は、最も単純なものまで取り除かれています。
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);
前もって感謝します。