Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » Umwandlung von C in Java-Programm - was bei Beispielen zu beachten
Autor
Kein bestimmter Bereich Umwandlung von C in Java-Programm - was bei Beispielen zu beachten
Delastelle
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 17.11.2006
Mitteilungen: 1740
  Themenstart: 2021-07-24

Hallo Leute! Ich möchte jetzt doch ein C-Programm in ein Java-Programm umwandeln. Was muss ich dabei beachten (Beispiele von mir)? Wie kann ich die C-Befehle in Java-Befehle umsetzen? Das ist aus der Rubrik "verschüttgegangenes Wissen". Ich hatte vor langer Zeit schon mal etwas mit C/C++ und mehr mit Java gearbeitet. \sourceon C (a) machine *schedule; (b) jobstep **jobhead; // was ist der Unterschied zwischen (a) und (b)? (c) int num_of_jobs; // sollte auch in Java so sein(?) (d) typedef struct bnbnode { int value; edgelist *branchlist; struct bnbnode *next; } bnbnode; // kann ich die Struktur so in Java übernehmen? (e) bnblist = bnblist->next; (f) if (munchit(&bestv1, &bestv2, &bestj1, &bestj2, &edges)) { // ich habe vergessen was die "&" bedeuten... \sourceoff Viele Grüße Ronald


   Profil
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 2964
  Beitrag No.1, eingetragen 2021-07-24

\quoteon(2021-07-24 04:18 - Delastelle im Themenstart) \sourceon C (a) machine *schedule; // Pointer auf schedule vom Typ machine (b) jobstep **jobhead; /* Pointer auf Pointer; U.a. verwendet wenn *jobhead Kopf eines dynamischen Arrays ist. */ (c) int num_of_jobs; // Namenskonvention in Java ist CamelCase. Ansonsten passt das. (d) typedef struct bnbnode { int value; edgelist *branchlist; struct bnbnode *next; } bnbnode; // struct entspricht in Java einer sehr einfachen Klasse // struct könnte auch durch eine Map simuliert werden (e) bnblist = bnblist->next; // In Java wird immer der Punkt-Operator verwendet. // bnblist = bnblist.next; (f) if (munchit(&bestv1, &bestv2, &bestj1, &bestj2, &edges)) { // Die Amperesand sind Adressoperatoren. // &bestv1 bspw. gibt den Pointer auf bestv1 zurück. // In Java gibt es keine // rohen Pointer, sondern nur Referenzen. \sourceoff Viele Grüße Ronald \quoteoff Es gibt zwar Tools zum Konvertieren; falls die Programme nicht zu umfangreich sind, würde ich sie jedoch neu implementieren, um menschenlesbaren und natürlich wirkenden Code zu erhalten.


   Profil
AlphaSigma
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 23.11.2012
Mitteilungen: 280
  Beitrag No.2, eingetragen 2021-07-24

Hallo Delastelle, wenn das C-Programm nur einige Hundert Zeilen hat, kann man versuchen es manuell nach Java zu portieren. Bei größeren Programmen würde ich davon abraten. Ist Dir der Unterschied zwischen C und C++ bekannt. C und Java sind komplett unterschiedliche Sprachem mit unterschiedlichen Paradigmen. In C++ kann man auf sehr unterschiedliche Arten programmieren u.a. objektorientiert. Ein C++ Programm, welches objektorientiert programmiert ist, hat am ehesten Gemeinsamkeiten mit Java. In C++, und noch mehr in C, ist aber viel mehr erlaubt als in Java. Pointer, wesentlich in C (und C++), kann man in Java nicht direkt verwenden. Dein Beispiel Code enthält Pointer. \sourceon C int *num; // num ist ein Pointer auf die Integer-Variable *num int nim; // nim ist Integer, &nim liefert die Adresse von nim num = &nim // weist dem Pointer num die Adresse von nim zu \sourceoff


   Profil
Delastelle
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 17.11.2006
Mitteilungen: 1740
  Beitrag No.3, vom Themenstarter, eingetragen 2021-07-24

Hallo, erst mal Danke. Zum Nachdenken bringt mich Pointer von Pointer. Naja. Mal Sehen. Viele Grüße Ronald


   Profil
AlphaSigma
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 23.11.2012
Mitteilungen: 280
  Beitrag No.4, eingetragen 2021-07-25

\quoteon(2021-07-24 23:55 - Delastelle in Beitrag No. 3) Hallo, erst mal Danke. Zum Nachdenken bringt mich Pointer von Pointer. Naja. Mal Sehen. Viele Grüße Ronald \quoteoff Chapter 22: Pointers to Pointers


   Profil
tactac
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 15.10.2014
Mitteilungen: 2145
  Beitrag No.5, eingetragen 2021-07-25

Java hat auch nativ keine Referenzen auf lokale Variablen oder so. Wenn einem nichts besseres einfällt, kann man sowas aber auch mit dem Holzhammer fast nachbasteln. Kern wären Interfaces wie diese: \sourceon Java interface Ref {T get(); void put(T x);} interface IntRef {int get(); void put(int x);} \sourceoff , die man als Typen für die "Zeiger" verwenden kann, auch verschachtelt, also Ref> pppi ist natürlich möglich. An Stellen, wo C-Code "Adressen" ermittelt (mittels &), müsste der entsprechende Java-Code so ein Referenz-Objekt erzeugen. Und je nachdem, ob über einen Zeiger gelesen oder geschrieben werden soll, ist get oder put zu verwenden. \sourceon C void foo(int* pi) { int x = *pi; *pi = 7; int *y = &x; } \sourceoff \sourceon Java void foo(IntRef pi) { int x = pi.get(); pi.put(7); IntRef y = new IntRef { int get() {return x;} void put(int v) { x = v; } // :( } } \sourceoff Das "einzige" Problem ist nur, dass die mit :( markierte Stelle nicht geht, da Closures nur auf "effectively final" lokale Variablen Zugriff haben. Ein Workaround ist da die Verwendung von einelementigen Arrays.


   Profil
Delastelle
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 17.11.2006
Mitteilungen: 1740
  Beitrag No.6, vom Themenstarter, eingetragen 2021-07-25

Hallo, Es sind 9 kleinere Files mit etwa 2500 Zeilen. Wobei sich vieles wiederholt oder mir bekannt ist. Z.B. Variable++ \sourceon C (g) while (bnblist) { ... edges = bnbnext->branchlist; (void) doedge(edges); free_bnbnode (bnbnext); if (munchit(&bestv1, &bestv2, &bestj1, &bestj2, &edges)) { printf (" split into %d %d\n",bestv1,bestv2); splitit(&bnblist, bestv1, bestv2, bestj1, bestj2, edges); } else { printf ("%d (%d) killed\n",bnbeval,holdval); fflush (stdout); } (void) undoedge(edges); } \sourceoff Wie sind die beiden void-Befehle zu verstehen? Der Rest dürfte für mich umsetzbar sein. Sind dies neue Prozeduren oder nur Aufrufe von Prozeduren? Viele Grüße Ronald Edit: zu Beitrag 5. Es soll ja etwas berechnet werden (Optimierungsproblem mit vielen Teilproblemen). Ich hoffe nur man kann das gut in Java umsetzen. Wenn der Programmierer freundlicherweise mit Fortran gearbeitet hätte, wäre es für mich einfacher! [Die Antwort wurde nach Beitrag No.4 begonnen.]


   Profil
tactac
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 15.10.2014
Mitteilungen: 2145
  Beitrag No.7, eingetragen 2021-07-25

Die (void) bla machen zur Laufzeit semantisch dasselbe wie bla. Es werden damit höchstens Warnmeldungen von statischen Analyzern (wie u.a. dem Compiler) à la "Achtung: du wirfst da den Rückgabewert weg!" unterdrückt.


   Profil
Delastelle
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 17.11.2006
Mitteilungen: 1740
  Beitrag No.8, vom Themenstarter, eingetragen 2021-07-25

Danke schön. Und noch eine Frage zur Nacht: es sind im Programm viele ähnliche Teilprobleme zu lösen. Kann Java(welche Version) da 2 oder mehr Prozessoren verwenden (Befehle)?


   Profil
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 2964
  Beitrag No.9, eingetragen 2021-07-25

Java beherrscht natürlich Multithreading. Für parallelisierbare Schleifen etc. gibt es fertige Lösungen.


   Profil
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 2575
  Beitrag No.10, eingetragen 2021-07-25

\quoteon(2021-07-25 03:03 - Delastelle in Beitrag No. 8) Kann Java(welche Version) da 2 oder mehr Prozessoren verwenden (Befehle)? \quoteoff Java unterstützt seit Version 1.0 die Verwendung von Threads. Dafür, dass dein Programm von dieser Möglichkeit Gebrauch macht, musst du allerdings selbst sorgen. Java kann ein rein sequentielles Programm nicht "automatisch" parallelisieren. --zippy [Die Antwort wurde nach Beitrag No.8 begonnen.]


   Profil
Delastelle
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 17.11.2006
Mitteilungen: 1740
  Beitrag No.11, vom Themenstarter, eingetragen 2021-07-25

Ok. Ich habe bisher mehrmals mit Java gearbeitet, aber nie mehrere Prozessoren ausgenutzt. Was spricht eigentlich dafür, nur eine Klasse in Java im Programm zu verwenden. Und was spricht für mehrere Java-Klassen? Falls ich es hinbekomme, reicht vielleicht eine Klasse. Das C-Programm besteht aus mehreren Teilen - dies spricht eher für mehrere Klassen in Java.


   Profil
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 2575
  Beitrag No.12, eingetragen 2021-07-25

\quoteon(2021-07-25 11:34 - Delastelle in Beitrag No. 11) Was spricht eigentlich dafür, nur eine Klasse in Java im Programm zu verwenden. Und was spricht für mehrere Java-Klassen? \quoteoff Bei einer solchen Frage würde ich empfehlen, irgendeinen einführenden Text zu Objektorientierung zu konsultieren. Hier im Rahmen eines Beitrags eine wirklich weiterhelfende Antwort zu geben, halte ich für schwierig.


   Profil
AlphaSigma
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 23.11.2012
Mitteilungen: 280
  Beitrag No.13, eingetragen 2021-07-25

Hallo Delastelle, wenn Du es unbedingt nach Java portieren möchtest, dann würde ich an Deiner Stelle auf abstrakter Ebene, d.h. ohne Bezug auf die Syntax von C, analysieren was das Programm macht. D.h. die Daten und den Algorithmus unabhängig von einer speziellen Programmiersprache aufschreiben. Auf der Basis würde ich dann ohne Bezug auf den C-Quelltext das Programm neu in Java implementieren. Auf Rosetta_Code gibt es für viele kleine Programmbeispiele und Algorithmen die Umsetzung in sehr viele unterschiedliche Programmiersprachen. Im Menue unter "Explore -> Tasks" gibt es eine Auflistung aller vorhandenen Programmieraufgaben. Programming_Tasks Auf den Seiten zu den Programmieraufgaben sind die Quelltexte in den unterschiedlichen Programmiersprachen in alphabetischer Reihenfolge beschrieben. Hier z.B. für QR_decomposition. Wenn Du da bei möglichst vielen Beispielen den C mit dem Java Code vergleichst, hilft das evtl. den Unterschied zwischen C und Java zu verstehen. Der Hinweis auf Rosetta_Code ist aber keine Empfehlung den Code Zeile für Zeile, Eins zu Eins nach Java zu konvertieren.


   Profil
Delastelle
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 17.11.2006
Mitteilungen: 1740
  Beitrag No.14, vom Themenstarter, eingetragen 2021-08-02

Hallo AlphaSigma! Mein Problem ist auch, dass ich weder den C-Quelltext noch den mathematischen Hintergrund voll überblicke. Aber ein Java Quelltext läßt mich einfacher verschiedene Dinge probieren. Dort könnte ich ein einfaches Testbeispiel einfacher Untersuchen. Es gibt Testprobleme für den Algorithmus, die nur 10 Fälle haben statt Millionen Fälle bei großen Beispielen. Was ich momentan z.B. nicht verstehe, ob das Programm wirklich immer mehr Speicherplatz braucht oder ob das schlecht programmiert ist! Viele Grüße Ronald


   Profil
Delastelle hat die Antworten auf ihre/seine Frage gesehen.

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2021 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]