3

問題:

出力パラメーターの宣言に関して、Vala/Tutorial サイトで宣伝されている一見優れた機能を実際に利用するのに問題があります。

ここからの引用: https://live.gnome.org/Vala/Tutorial#Parameter_Directions

method_1() を実装する方法の例を次に示します。

void method_1(int a, out int b, ref int c) {
    b = a + c;
    c = 3; }

値を out 引数 "b" に設定すると、Vala は "b" が null でないことを確認します。したがって、この値に関心がない場合は、method_1() の 2 番目の引数として null を安全に渡すことができます。

生成された C コードを見ると、上記の主張に反して、割り当て前にチェックを行う代わりに、可能性のある NULL ポインターが喜んで逆参照されていることが明らかです。

void method_1 (gint a, gint* b, gint* c) {
    *b = a + (*c);
    *c = 3;
}

私が予想していたコードは、代わりに次の形式をとっていたはずです。

void method_1 (gint a, gint* b, gint* c) {
    if (b != NULL)
      *b = a + (*c);
    *c = 3;
}

これまでに見つけた唯一の回避策は、out パラメーター宣言全体を破棄し、代わりにポインターを直接使用することです。

void method_1 (gint a, int* b, ref int c) {
    if (b != null)
      *b = a + c;
    c = 3;
}

審美的な理由については、上記の引用で言及されたアイデアがかなり気に入ったので、次のように尋ねたいと思います

質問:

  • 上記の引用の説明を誤解し、宣言された値型パラメーターは null ポインターを自動的にチェックできませんか?

  • それとも、これはおそらくvalaコンパイラのバグで、後のバージョンで修正されていますか? valac --versionこれVala 0.8.1が私が使用しているバージョンです。

  • まだ不足している言語要素によって、宣言された値型パラメーターのチェックを手動で実行する機会はおそらく他にありますか?

4

1 に答える 1

5

Vala 0.8.1 が問題です。Vala 0.16 生産

void method_1 (gint a, gint* b, gint* c) {
  gint _vala_b = 0;
  gint _tmp0_;
  gint _tmp1_;
  _tmp0_ = a;
  _tmp1_ = *c;
  _vala_b = _tmp0_ + _tmp1_;
  *c = 3;
  if (b) {
    *b = _vala_b;
  }
}
于 2013-02-14T01:31:17.170 に答える