2017-04-07 2 views
0

Ich kann nicht herausfinden, wie man C-Stil Union machen. Im Beispiel in documentation gegeben:Wie C-style Union machen

(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)) 

alles funktioniert. Aber wenn gegossen wird geändert _INT:

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

bekomme ich folgende Fehlermeldung:

cast: representation sizes of from and to types differ 
    size of from type: 8 
    size of to size: 16 

die irgendwie Sinn macht, aber Frage ist, wie diese Vereinigung zu schaffen?

Könnten Sie mir bitte einen Unterschied zwischen make-union-type und _union erklären? Wie es mir aus den Unterlagen unklar ist.

Vielen Dank.

+0

3.14 und 2.71 sind nicht 'int's –

+0

Richtig, aber das ist nicht das Problem hier ... Bearbeitet. – Ondrej

Antwort

1

Cast funktioniert nur, wenn (ctype-sizeof from-type) gleich (ctype-sizeof to-type) ist, also nur die größte (n) Unionsvariante (n) erlaubt sind. Versuchen Sie es mit manuelle Zuordnung und union-set! statt:

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

Wo der zweite Parameter von union-set! ist der Index der Variante, die Sie wollen.

+0

Muss ich diesen Speicher manuell freigeben? – Ondrej

+1

@Ondrej Nicht bei Verwendung von malloc wie hier beschrieben. Je nach dem, was Sie tun, müssen Sie möglicherweise einen anderen malloc-Modus verwenden, und für einige Modi ist die Antwort ja. Konsultieren Sie die Malloc-Dokumentation, und verwenden Sie 'cpointer-gcable?', Um herauszufinden, ob der Speicher GCd ist, z. B. '(cpointer-gcable? (Union-ptr a-union-val))'. –