K.Maebashi's BBS 投稿フォーム
ハンドル名
件名
Link
>早速のお返事ありがとうございます。 >なるほど、crowbarスタックの構造を勘違いしてました。 >Stack構造体のstackメンバがCRB_Value*型だということは、"CRB_Value*"の集合ではなく、"CRB_Value"そのものの集合だということですね。 >自分で作成中のものが、スタックを"アドレスの集合"にしているので、それと同じだと思い込んでいました。 >参考になりました。 >これからも、「プログラミング言語を作る」を参考にオリジナル言語の作成を続けたいと思います。 > > > >>こんにちは。ご意見ありがとうございます。 >> >>>「プログラミング言語を作る」を大いに参考にさせて頂いています。 >>>というより、かなりまねをさせてもらってます。 >> >>そういっていただけると私も嬉しいです。 >> >>>関数の初頭で、resultというCRB_Value型の変数を宣言していますね。 >>>式の評価結果をそれに詰め、最終的にcrowbarスタックにそのアドレスをpushしていると思います。 >>>しかし、resultはローカル変数なので、関数を抜けるとその領域は既に使えないのではないか?という心配です。 >> >>・resultはローカル変数なので、関数を抜けるとその領域は使えません。 >>・最終的にcrowbarスタックにresultをpush()する際は、以下のような処理を >> 行っています。 >> push_value(inter, &result); >>・resultのポインタをpush_value()に渡したって、resultの領域は >> すぐに開放されてしまうのだから役に立たないのではないか? というのが >> ご懸念されていることだと思います。 >> >>しかし、push_value()の中では、最終的には以下のようにして値をcrowbarスタックに >>格納しています。 >> >>static void >>push_value(CRB_Interpreter *inter, CRB_Value *value) >>{ >>(中略) >> inter->stack.stack[inter->stack.stack_pointer] = *value; >> >>渡されたCRB_Valueは確かにポインタですが、*演算子により >>「ポインタの指す先の値」をコピーしてスタックに格納していますので、 >>この後でresultが開放されても問題ありません。 >> >>なお、push_value()の引数として、CRB_Value*ではなくCRB_Valueを受け取るように >>することはもちろん可能です。 >>現状の実装でなぜポインタを渡しているのかというと…… 構造体は大きいかも >>しれないので値渡しをすると効率上の問題が出るかも、という懸念があったのかと >>思います。実際問題としては、CRB_Value程度のサイズの型なら値渡しにするという >>選択肢は十分考えられると思うのですけれども。
spamよけのため、ここに「ほげぴよ」と入力してください。
削除パスワード :
クリック!