2015-02-23 14 views
7

Będę przepisać kod C na Javę. Rdzeniem oryginalnego kodu C jest opakowanie HW. W C używaliśmy wiele związków dla każdego HW zarejestrować np:jak napisać wiele małych związków z C na 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; 

następnie użyliśmy go jak

regABC r; 
r.reg=0 
r.bits.bit0_abc=1; 
call(r.reg) 

wyobrazić, istnieje wiele z tych rejestrów. Powiedzmy 40. Jak zaimplementować go w java, nie mając 40 plików klasy? Myślałam, aby utworzyć jedną klasę jak

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; 
    } 
} 

następnie jeden plik może zawiera wiele stałe teksty jak:

public static enum RegTst{ 
     b1_abc(0x01), 
     b2_xyz(0x02), 
     b3_klm(0x04); 
     public byte v; 
     RegTst(int val){ 
      v = (byte)val; 
     } 
    } 

następnie chciałbym używać go lubię:

univerasl_reg<RegTst> rt1; 
rt1.set(RegTst.b2_xyz,1) 
call(rt1.b) 

Ale to nie działa ponieważ wydaje się, że nie mogę użyć zmiennej enum .v w univerasl_reg. Daje "Java canot find symbol v". Wiesz dlaczego? Czy wiesz jak kod rejestrów w celu uzyskania
- najlepiej jeden plik
- Rodzaj sterowania pomiędzy różnymi rejestrami (np

new univerasl_reg<RegTst>.set(RegTst_OTHER.b2_xyz,1)
prowadzi do błędów, jak nie używam RegTst ale RegTst_OTHER)
- i dla Mnemonic bity (np. RegTst.b1_abc)

+0

Czy Rozważmy 'HashMap '? – vikingsteve

+0

wygląda interesująco, ale niestety styl Java nie ma magii. ogólny w Javie, powinienem powiedzieć, to jest do bani. zasadniczo wszystkie typy generyczne spowodują ostatecznie "Object". może nie rozumiem twojego problemu wystarczająco dobrze, ale posiadanie 40 plików klas może być najlepszym rozwiązaniem, jeśli masz 40 odpowiadających 'struct' w c. – HuStmpHrrr

+0

@HuStmpHrr: opcja 40 klas jest opcją. Myślę jednak, że bardziej odpowiednie są wyliczanki, a rozwiązanie Marko Topolink pozwala mi wykorzystać wartość enum. –

Odpowiedz

2

Java Generics są cechą systemu typu statycznego. Po zaakceptowaniu dowolnego parametru T dla statycznego typu system nie ma podstaw, aby stwierdzić, że ten typ ma zmienną instancji v. Twój wybór wyrażeń komplikuje sprawę, ponieważ wyliczenia nie mogą mieć arbitralnej nadklasy.

Proponuję następujące:

  1. polegać na polimorfizm i ukryć v za metody;
  2. zadeklaruj interfejs za pomocą tej metody;
  3. dokonać wszystkich wyliczeń zaimplementować interfejs;
  4. użyj interfejsu jako górnej granicy na T.

w postaci kodu:

public interface Mask { 
    byte v(); 
} 

public class UniversalReg<T extends Mask> { 
    public byte b; 
    public byte set(T mask, boolean val) { 
    if (val) b |= mask.v(); 
    else b &= ~mask.v(); 
    } 
} 

public enum RegTst implements Mask { 
    b1_abc(0x01), 
    b2_xyz(0x02), 
    b3_klm(0x04); 

    private final byte v; 
    private RegTst(int val) { 
     v = (byte)val; 
    } 

    @Override public byte v() { return v; } 
} 
+0

Dziękujemy! Działa jak urok.Uratowałeś mi dużo czasu jako początkujący, którego nie znałem . Już wcześniej próbowałem super-klasy, ale jak sugerowałeś, nie skompilowałeś się dla mnie. –