On Wed, Jul 18, 2012 at 08:19:29PM +0200, Nadir Sampaoli wrote:
> 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, and pointers are missing too.
> 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 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.

How about defining the union in C and making it available in Vala
with a vapi file?

== reg.h ==
#include <stdint.h>

typedef struct {
    uint8_t lo;
    uint8_t hi;
} WORD;

typedef union {
    uint16_t reg16;
    WORD reg8;
} REG;

== reg.vapi ==
[CCode (cheader_filename = "reg.h")]
public struct WORD {
    uint8 lo;
    uint8 hi;
}

[CCode (cheader_filename = "reg.h")]
public struct REG {
    uint16 reg16;
    WORD reg8;
}

== test.vala ==
public static int main(string[] args) {
    REG register = REG();
    register.reg16 = 0;
    register.reg8.lo = 0x23;
    register.reg8.hi = 0x42;
    stdout.printf("%04x\n", register.reg16);
    return 0;
}

== demo ==
$ valac test.vala reg.vapi
$ ./test
4223

-- Sebastian

Attachment: signature.asc
Description: Digital signature

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

Reply via email to