2015-02-23 2 views
7

Ich werde C-Code in Java umschreiben. Der Kern des ursprünglichen C-Codes ist ein HW-Wrapper. In C waren wir mit vielen Gewerkschaften für jede HW registrieren zB:Wie schreibe ich viele kleine Gewerkschaften von C in 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; 

dann haben wir es wie

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

vorstellen, dass es viele dieser Register ist. Sagen wir 40. Wie implementiert man es in Java ohne 40 Klassendateien? Ich dachte, eine Klasse wie

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

dann eine Datei enthält mehrere Aufzählungen erstellen wie:

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

dann würde ich es verwenden möchte:

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

Aber es funktioniert nicht weil es scheint, ich kann enum Variable .v in univerasl_reg nicht verwenden. Es ergibt "Java canot find symbol v". Weißt du, warum? Wissen Sie, wie Register, um zu codieren
zu haben - vorzugsweise eine Datei
- Steuerungsart zwischen verschiedenen Registern (zB

new univerasl_reg<RegTst>.set(RegTst_OTHER.b2_xyz,1)
wird zu Fehler führen, wie ich bin mit RegTst aber RegTst_OTHER nicht)
- und mnemonic für Bits (z. B. RegTst.b1_abc)

+0

fanden Sie eine 'HashMap '? – vikingsteve

+0

es sieht interessant aus, aber leider hat der Stil von Java keine Magie. Generisch in Java, sollte ich sagen, es ist scheiße. Im Wesentlichen führen alle generischen Typen schließlich zu "Object". vielleicht verstehe ich dein problem nicht gut genug, aber 40 klassen-dateien können die beste lösung sein, wenn du 40 entsprechende "struct" in c hast. – HuStmpHrrr

+0

@HuStmpHrr: 40 Klassen ist eine Option. Aber ich denke, Enums sind besser geeignet und eine Lösung von Marko Topolink ermöglicht es mir, den Wert von enum zu nutzen. –

Antwort

2

Java Generics sind nur eine Funktion des statischen Systemtyps. Wenn Sie für den Typparameter T akzeptieren, kann das System des statischen Typs keine Schlussfolgerung treffen, dass dieser Typ eine Instanzvariable v hat. Ihre Wahl der Enums macht die Sache noch komplizierter, weil Enums keine willkürliche Oberklasse haben können.

Ich würde vorschlagen, die folgenden:

  1. auf Polymorphismus verlassen und verstecken v hinter einem Methode;
  2. deklarieren Sie eine Schnittstelle mit dieser Methode;
  3. alle Enums die Schnittstelle implementieren;
  4. verwenden Sie die Schnittstelle als Obergrenze für T.

In Code:

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

Vielen Dank! Funktioniert wie Charme.Du hast mir viel Zeit gespart, als Neuling, den ich nicht kannte . Ich habe schon die Super-Klasse ausprobiert, aber wie du vorgeschlagen hast, kompiliert es nicht für mich. –

Verwandte Themen