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-KenntnisseWie 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