Hi,

> ----Messaggio originale----
> Da: nadirsampa...@gmail.com
> 
Data: 18-lug-2012 20.19
> A: <vala-list@gnome.org>
> Ogg: [Vala] Unions 
in Vala

> I'm porting some code I wrote from procedural C to objective 
Vala and I'm
> looking for the Vala-way to implement a union. I'm using 
a union in C
> because I need a structure where one uin16_t and two 
uint8_t are aligned:
> 
> typedef struct {
>     uint8_t lo;
>     
uint8_t hi;
> } WORD;
> 
> typedef union {
>     uint16_t reg16;
>     
WORD reg8;
> } REG;
> 
> This way if I change reg8.hi's (or .lo's, for 
what matters) value,
> reg16changes automatically.Now, in Vala, as far 
as I have been able to
> find in
> the documentation (I just started 
studying Vala, coming from a C#
> background) there's no union 
keyword, 

In Vala there's no way that I know, to emulate the union 
keyword without 
resorting to polymorphic classes or mixins.

> and 
pointers are missing too.

That isn't true see:

https://live.gnome.org/Vala/Tutorial#Pointers

> If there's no union-
like thing in Vala, is there at least some way to make
> a built-in 
type referenceable (something like .NET's Int vs int)?

I didn't 
understand this fully, but you can use  the & (address of) operator or 
define your
structure as compact classes.

> I have a last resort 
solution, but it's rather inefficient, so I'd like to
> know if I can 
reproduce the original C code behaviour.

Something along this code 
should also works (it's not required to derive from Reg16, anyway):


using GLib;

namespace NoUnion {
        public struct Reg16 {
                public uint16 
reg16;
        }
        
        public struct Word : Reg16 {
                public uint8 get_lo () { 
return (uint8) (reg16 & 0xFF); }
                public void set_lo (uint8 value) { 
reg16 = (reg16 & 0xFF00) | value; }
                
                public uint8 get_hi () { 
return (uint8) (reg16 >> 8); }
                public void set_hi (uint8 value) { 
reg16 = (reg16 & 0xFF) | (value << 8); }
        }
        
        public static int main
(string[] args) {
                Word word = Word();
                
                word.reg16 = 2;
                
                word.
set_lo (word.get_lo () + 1);
                word.set_hi (1);
                
                stdout.printf
("word.lo = %d | word.hi = %d | word.reg16 = %d | sizeof(Word) = %lu", 
word.get_lo (), word.get_hi (), word.reg16, sizeof(Word));
                return 0;
        
}
}


Ciao,
Andrea
_______________________________________________
vala-
list mailing list
vala-list@gnome.org
https://mail.gnome.org/mailman/listinfo/vala-list

 
_______________________________________________
vala-list mailing list
vala-list@gnome.org
https://mail.gnome.org/mailman/listinfo/vala-list

Reply via email to