2017-04-07 5 views
0

Cスタイルのユニオンを作る方法がわかりません。 documentationの例では、Cスタイルのユニオンを作る方法

(define a-union-type 
(_union (_list-struct _int _int) 
     (_list-struct _double _double))) 
(define a-union-val 
    (cast (list 3.14 2.71) 
      (_list-struct _double _double) 
      a-union-type)) 

すべてが動作します。しかし、キャストは_intに変更された場合:

(define a-union-val 
    (cast (list 3 2) 
      (_list-struct _int _int) 
      a-union-type)) 

を私はエラーを以下の取得:

何とか理にかなっているが、問題は、この組合を作成する方法、である
cast: representation sizes of from and to types differ 
    size of from type: 8 
    size of to size: 16 

私はmake-union-typeと_unionの違いについても教えてください。それは私にはドキュメントから不明です。

ありがとうございます。

+0

3.14と2.71は 'int'sではありません –

+0

真ですが、これはここでは問題ありません...編集されました。 – Ondrej

答えて

1

キャストは、(ctype-sizeof from-type)(ctype-sizeof to-type)に等しい場合にのみ機能します。そのため、最大のユニオンバリアントのみが許可されます。代わりに、手動割り当てとunion-set!を使用してみてください:union-set!の2番目のパラメータは、あなたがしたいバリアントの指標である

(define a-union-val (ptr-ref (malloc a-union-type) a-union-type)) 
(union-set! a-union-val 0 (list 3 2)) 

+0

そのメモリを手で解放する必要がありますか? – Ondrej

+1

@Ondrejここで書いたようにmallocを使用していない場合。しかし、あなたがやっていることに応じて、別のmallocモードを使う必要があり、あるモードでは答えはyesです。 mallocのドキュメントを参照して、 'cpointer-gcable?(' cpointer-gcable?(union-ptr a-union-val)) 'のように' cpointer-gcable? 'を使ってメモリがGCdになるかどうかを調べる。 –

関連する問題