Hi,
> ----Messaggio originale----
> Da: [email protected]
>
Data: 18-lug-2012 20.19
> A: <[email protected]>
> 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
[email protected]
https://mail.gnome.org/mailman/listinfo/vala-list
_______________________________________________
vala-list mailing list
[email protected]
https://mail.gnome.org/mailman/listinfo/vala-list