Problem bei Abbildung einer Java-Klasse auf eine C-Struktur



  • Hallo!

    Ich muß ein Java-Programm zu C transferieren, da es in einem
    Mikroprozessor laufen muß.

    Mit der Umwandlung hatte ich bisher auch keine Schwierigkeiten,
    aber bei diesem Problem verlassen mich meine C-Kenntnisse 😞

    Wie kann ich die folgende Struktur

    class Deltas {
      static class Delta {
        int monat;
        int delta;
    
        public Delta(int monat, int delta) {
          this.monat = monat;
          this.delta = delta;
        }
      }
      static final Deltas Europa = new Deltas2(
        new Delta[] {new Delta( 1, -2), new Delta( 4, -3),new Delta( 8, -4), new Delta(12, -2)},
        new Delta[] {new Delta( 1, +6)},
        new Delta[] {new Delta( 1, +3), new Delta( 4, +4)},
        new Delta[] {new Delta( 1, +5), new Delta( 6, +6),new Delta( 8, +7), new Delta(11, +6),new Delta(12, +5)});
    
      static final Deltas Türkei = new Deltas2(
        new Delta[] {new Delta( 1, -6)},
        new Delta[] {new Delta( 1, +6)},
        new Delta[] {new Delta( 1, +3), new Delta( 4, +4)},
        new Delta[] {new Delta( 1, +5), new Delta( 6, +6),new Delta( 7, +8), new Delta(11, +6),new Delta(12, +5)});
    
      Delta[] shuruq;
      Delta[] duhr;
      Delta[] asr;
      Delta[] maghrib;
    
      public Deltas2(Delta[] shuruq, Delta[] duhr, Delta[] asr, Delta[] maghrib) {
        this.shuruq = shuruq;
        this.duhr = duhr;
        this.asr = asr;
        this.maghrib = maghrib;
      }
    }
    

    von Java nach C (kein C++) abbilden.

    Mein Problem ist, das die die einzelnen Elemente (duhr, asr, ...) verschieden lange
    Arrays beinhalten können und das C ja bekanntlich die Länge eines Array nirgendwo
    speichert. (Genaugenommen gibt es in C ja nur auf Compiler-Ebene Arrays; die dann
    zu Pointer umgewandelt werden).

    Ich muß es so umwandeln, daß ich später einer Methode einer der beiden
    statischen Variablen (Europa, Türkei) übergebe und diese Methode dann die
    einzelnen Arrays durchläuft. Aber die Länge der Arrays ist eben verschieden.

    Ich wende mich an euch, da mir keine Lösung einfällt und hoffe,
    daß mir einer helfen kann.



  • Uuupss!

    Der Konstruktor

    public Deltas2
    

    sollte natürlich

    public Deltas
    

    heißen. 😕



  • Hat keiner eine Idee oder einen Vorschlag? 😞



  • Du kannst in C auch dynamischen Speicher per malloc() anfordern (die Anzahl mußt du dann selber notieren, wenn du sie später nochmal brauchst):

    typedef struct
    {
      int monat;
      int delta;
    } Delta;
    
    void init_delta(Delta* tgt, int mn,int dl)
    {
      tgt->monat=mn;
      tgt->delta=dl;
    }
    
    typedef struct
    {
      Delta* shuruq;int shuruq_size;
      ...
    } Deltas;
    
    Deltas Europa,Tuerkei;
    
    void init_global_deltas()
    {
      Delta es[]={{1,-2},{4,-1},{8,-4},{12,-2}};
      Europa.shuruq=malloc(sizeof(es));
      memcpy(Europa.shuruq,es);
      Europa.shuruq_size=sizeof(es)/sizeof(es[0]);
      ...
    }
    


  • Danke!

    Ich habe es mittlerweile doch zu Fuß gelöst:

    typedef struct md {
    	short m;
    	short d;
    }	smd;
    
    const smd DES[] = {{ 1, -2}, { 4, -3}, { 8, -4}, {12, -2}};
    const smd DED[] = {{ 1,  6}};
    const smd DEA[] = {{ 1,  3}, { 4,  4}};
    const smd DEM[] = {{ 1,  5}, { 6,  6}, { 8,  7}, {11,  6}, {12,  5}};
    
    const short sDES = sizeof(DES) / sizeof(smd);
    const short sDED = sizeof(DED) / sizeof(smd);
    const short sDEA = sizeof(DEA) / sizeof(smd);
    const short sDEM = sizeof(DEM) / sizeof(smd);
    

    Allerdings nicht so elegant wie es in Java (C++) möglich ist 😞


Anmelden zum Antworten