1

私は答えを見つけて、これをしばらくの間機能させようとしてきたので、ここで確認することにしました。long へのポインタを参照渡ししようとしています。私が使用している構文は次のとおりです。

int Hex2Loong(long*& bytebuff, int& len, const std::string Hexbuff);

関数を宣言しようとすると、エラーが表示されます。定義自体は驚くほど問題ないようです。int*&fcn で aとまったく同じ構文を使用していますHex2Intが、問題はありません。私が台無しにしているアイデアはありますか?

エラー: エラー: Hex2Loong(long int*&,int &,const std::string); の引数 1 を渡す

関連するメモとして、私が持っている場合、unsigned long *それをキャストする方法がないので、それをHex2Loong関数に渡すことができますか? long * それらにキャストされた 一時変数を作成して渡す必要がありますか?

どんな答えでもTy、Drf

編集:うーん、いくつかのコメントに答えてください。この関数はおそらく非常に長い 16 進文字列を long の配列に変換するため、参照を渡します。(つまり、2^1000 程度の数値を 16 進文字列として記述したと考えてください)、その数値を long の配列として返す必要があります (キャストしないと面倒なので、おそらく unsigned long に書き直すことになります)。

HexString は const であると想定されているため、const として宣言されています (読み取りのみを変更するべきではありません)。

そして最後に、エラーは宣言とは関係なく、使用法とはまったく関係がありませんでした。(long *) num1num1 がどこにあるかを渡そうとしたという事実は、unsigned long *すべてを台無しにしていました。間違ったパラメーターで実際に関数を呼び出していた場所だけでなく、ヘッダーファイルにエラーが表示された理由はまだわかりません。

Edit2: おっと、 を渡すことの意味がわかりましたconst std::string&。もちろん、その通りです。それも変えます。それは私がJavaで書きすぎたために得たものです。文字列が実際にコピーされることに気づきませんでした。

4

1 に答える 1

2

次のようなもので、その関数をうまく呼び出すことができるはずです。

long lvar;
long *plvar = &lvar;
int rc = Hex2Loong (plvar, some_int, some_string);

実際の参照が必要なため、できないことは long のアドレスを渡すことです言い換えれば、試してはいけません:

long lvar;
int rc = Hex2Loong (&lvar, some_int, some_string);

次のサンプル コードを参照してください。

void Fn (long * &p1) {}

int main (void) {
    long lvar;
    long *plvar = &lvar;
    Fn (plvar);
    //Fn (&lvar);
    return 0;
}

これは正常にコンパイルされますが、&lvar行のコメントを外すと文句を言います。


2番目の質問に関しては、いいえ、参照として渡すことができる実際の変数が必要です。これは、関数が変数を変更しようとする可能性があるためです。そのため、一時的なコピーをどこかに作成する必要があります。

ただし、渡す変数の値を実際に変更する必要がない限り(そのような変更が呼び出し元のコードに反映されるようにするため)、参照を渡す必要はないことに注意してください。値で渡すだけで、関数内で値を使用できます。

そうする場合 (つまり、変更する必要がない場合)は、関数呼び出しで&lvarまたはのような一時変数を使用できます。(long*)(unsigned_long_ptr_variable)

于 2013-01-29T06:01:20.187 に答える