Riscrivo il codice C in Java. Il nucleo del codice C originale è un wrapper HW. In C stavamo usando un sacco di unioni per ogni HW registrarsi ad esempio:come scrivere un sacco di piccoli unioni da C a Java
typedef union RegIntStatus
{
u8 reg;
struct
{
u8 bit0_abc:1;
u8 bit1_cde:1;
u8 bit2_xyz:1;
u8 bit3_7_rsvd:5;
} bits;
} regABC;
allora l'abbiamo utilizzato come
regABC r;
r.reg=0
r.bits.bit0_abc=1;
call(r.reg)
immaginare v'è abbondanza di questi registri. Diciamo 40. Come implementarlo in java non avendo 40 file di classe? Stavo pensando di creare una classe come
univerasl_reg<T> { // where T will be some "enum"
public byte b;
public byte set(T bit_mask,bool val) {
// here is compile error it does not know variable bit_mask.v
if(val) {b |= bit_mask.v}
else b &= bit_mask.v^0xFF;
}
}
quindi un file può contenere più enumerazioni come:
public static enum RegTst{
b1_abc(0x01),
b2_xyz(0x02),
b3_klm(0x04);
public byte v;
RegTst(int val){
v = (byte)val;
}
}
quindi vorrei utilizzarlo come:
univerasl_reg<RegTst> rt1;
rt1.set(RegTst.b2_xyz,1)
call(rt1.b)
Ma non funziona perché sembra che non possa usare enum variable .v in univerasl_reg. Produce "Java canot trovare simbolo v". Sai perché? Sai come codice registri in modo da avere
- preferibilmente un file
- controllo di tipo tra i diversi registri (ad esempio
new univerasl_reg<RegTst>.set(RegTst_OTHER.b2_xyz,1)deve portare ad errori come io non sto usando RegTst ma RegTst_OTHER)
- e mnemonico per bit (ad esempio RegTst.b1_abc)
Avete considerato un 'HashMap'? –
vikingsteve
sembra interessante ma sfortunatamente, lo stile di java non sta avendo magia. generico in java, dovrei dire, fa schifo. in sostanza, tutti i tipi in generics risulteranno in 'Object' alla fine. forse non capisco il tuo problema abbastanza bene, ma avere 40 file di classe può essere la soluzione più appropriata se hai 40 struct 'in c. – HuStmpHrrr
@HuStmpHrr: avere 40 classi è un'opzione. Ma penso che le enumerazioni siano più adatte e la soluzione di Marko Topolink mi consente di usare il valore di enum. –