2016-12-19 4 views
1

現在、Valaのチュートリアルhttps://wiki.gnome.org/Projects/Vala/Tutorialで作業中です。今私はいくつかのさらなる説明が必要なセクションを見つけました。最後にオブジェクトプロパティの部分で、チュートリアルでは構造体のプロパティを紹介しています。Vala:クラス内の構造体プロパティの理解

struct Color 
{ 
    public uint32 argb; 

    public Color() { argb = 0x12345678; } 
} 

class Shape: GLib.Object 
{ 
    public Color c { get; set; default = Color(); } 
} 

int main() 
{ 
    Color? c = null; 
    Shape s = new Shape(); 
    s.get("c", out c); 
} 

チュートリアルの状態:「この方法で、cではなく、スタック上の色のインスタンスの参照です何がs.get()に渡されることはColor **の代わりである。例としては、一つには、そのようなプロパティを取得する方法を示している与えられ、 Color *. "

私の質問は上記の文章です。まず、「s.get()に渡された内容は、の代わりにColor **です」という意味のものを詳しく説明してください。また、これはs.cに次の

int main() 
{ 
    Shape s = new Shape(); 
    Color c = s.c; 
} 

結果がcに割り当てられていることを暗示していますか?

編集:上記の例をで実行しました。 main方法の関連C当量は

gint _vala_main (void) { 
    gint result = 0; 
    Color* c = NULL; 
    Shape* s = NULL; 
    Shape* _tmp0_ = NULL; 
    c = NULL; 
    _tmp0_ = shape_new(); 
    s = _tmp0_; 
    g_object_get ((GObject*) s, "c", &c, NULL); 
    result = 0; 
    _g_object_unref0 (s); 
    _color_free0 (c); 
    return result; 
} 

答えて

1

valacターゲットフォーマットにCコンパイラ(通常GCC)でコンパイルされたCコードにValaのコード(例えば、オブジェクトファイル、ライブラリ、または実行可能ファイルをコンパイルしています)。

Color**と言ったときのチュートリアルでは、生成されたCコードがpointer to a pointer to a Color struct(生成されたCコードのgobject_get)に渡されるということです。

構造体はCおよびVala *の値の型です。これは、すべてのメモリが割り当て時にコピーされることを意味します。 C.

でValaの中 Color?nullable ColorColor*pointer to Color)と同等です

ヴァラは、同様にCでのポインタへのrefoutパラメータを変換し、そのoutを呼び出すときに、ダブルポインタ(pointer to a pointer)を取得ヌル可能な構造変数を持つパラメータref

CはValaよりも強く型付けされていないので、多くのVala構造体がCでポインタになります。Cはポインタを使用してオプションのもの、参照、参照渡しのパラメータ、配列/文字列、リンク(関数ポインタやジェネリックスのような)あまり知られていないものがあります。

2番目の質問:構造変数に直接代入するとコピーが*作成されます。

* See this question with a great answer by AlThomasこれは、コピーがValaおよびCレベルでいつ行われるかを説明します。

+0

この精巧な回答と、提供した参考書をありがとうございます。それは私の質問にコンパイルされたCの出力を追加した価値があるもののために; 'g_object_get((GObject *)s、" c "、&c、NULL);' –

+0

これは、コンパイラが私が最初に考えたよりももっと巧妙であるようです。とにかくこのようなものを探すときは、 '-C'を使うのが良い考えです。 –

関連する問題