Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - C++ nach Delphi Übersetzen
Coder - Do 04.01.07 23:25
Titel: C++ nach Delphi Übersetzen
Hi
Ich versuche gerade C++ Code nach Delphi zu übersetzen und hab dabei ein paar Probleme.
Zum Beispiel steht in meinem C++ Code Random() wie schreib ich das in Delphi?
Den mathematischen Operator % hab ich mit mod übersetzt und / mit div.
Stimmt das?
MfG
jaenicke - Do 04.01.07 23:37
Random gibts auch in Delphi (in der Unit System, die ja sowieso im Projekt ist). Die Frage ist nur, welche Funktion, denn es gibt in Delphi die, die einen Integer in einem bestimmten Bereich zurückgibt und eine, die einen Fließkommawert zwischen 0 und 1 zurückliefert. Ich nehme an, dass es letztere ist. Dann brauchst du wie in C keinen Parameter.
Was % angeht, da ist mod richtig, aber div ist eine Integerdivision, das heißt es kommt der ganzzahlige Anteil des Ergebnisses der Division heraus. / ist genauso in Delphi.
Coder - Fr 05.01.07 00:32
So stehts im C++ Quelltext:
Delphi-Quelltext
1:
| int i = random() % 81; |
% und mod kann man aber nur mit ganzen Zahlen benutzen, also brauch ich einen Parameter.
Das ist die nächste Zeile:
Es kann sein das ich mit / eine Kommazahl rauskriege, darf aber nicht sein da y ein Integer ist.
Genauso hier:
Delphi-Quelltext
1:
| int y = yb + (int) i/3; |
MfG
Dragonclaw - Fr 05.01.07 01:13
Hallo,
mit trunc() kannst du eine Kommazahl, ohne die Nachkomma stellen in einen Integer schreiben.
Bei Random musst du noch die Range mit angeben wobei
Zahlen im Bereich von 0 bis 5 erstellt. Dazu (müss) noch der Zufallsgenerator mit
aktiviert werden.
jaenicke - Fr 05.01.07 01:32
Coder hat folgendes geschrieben: |
Das ist die nächste Zeile:
Es kann sein das ich mit / eine Kommazahl rauskriege, darf aber nicht sein da y ein Integer ist. |
Ja, dann ist div natürlich richtig. / wird hier von C++ automatisch wie div in Delphi verwendet. Aber allgemein ist / eben genauso in Delphi. Dass hier ein Integer herauskommen soll, wusste ich ja nicht.
Coder - Fr 05.01.07 02:15
Danke.
Das Problem ist das im C++ Quellcode auch keine Parameter angegeben sind.
Gibt es bei C++ einen Standard wenn man keinen Parameter angibt?
MfG
jaenicke - Fr 05.01.07 02:32
Quelltext
1:
| int i = random() % 81; |
entspricht
;-)
Coder - Fr 05.01.07 02:35
Besten Dank! :)
Auch wenn ichs mir überhaupt nicht erklären kann.
MfG
jaenicke - Fr 05.01.07 02:50
Das ist relativ einfach zu erklären...
random liefert beliebige ganzzahlige Zufallszahlen, z.B. die Zahl 30000 oder so. Du willst aber nur Zahlen zwischen 0 und 80, also nimmst du die große Zufallszahl modulo 81. Was dabei herauskommt, also der Rest der Division, ist dann eine Zahl zwischen 0 und 80 ;-).
Will man eine Zahl zwischen 10 und 90 würde man zu dem Ergebnis der Modulo-Operation noch 10 hinzuzählen.
Auf diese Weise kann man Zahlen in einem beliebigen Bereich erzeugen. Allerdings kann man random() bzw. rand() auch als Parameter eine Obergrenze angeben.
Warum das Modulo dennoch oft verwendet wird kann ich dir nicht sagen, dazu habe ich zu wenig mit C++ zu tun, aber zumindest erklären, wie es funktioniert, konnte ich...
Coder - Fr 05.01.07 03:06
Aha Danke!
Erzeugt
Random(10) Zahlen von 1 bis 9 oder von 1 bis 10?
Ich bin nun auch noch über ein paar komische Stellen gestolpert:
C#-Quelltext
1:
| for (int x = 0; x < x; y++){... |
Innerhalb dieser for-Schleife gibt es keinen Abbruchbefehl.
Ist das nicht eine Unendlichschleife?
Das hat mich auch verwundert. Die Namen hab ich verändert:
C#-Quelltext
1: 2:
| if (Bedingun){ BoolFunktion() || Boolean; |
Das Ergebnis der zweiten Zeile wird nicht zu etwas zugewiesen.
In Delphi kann man das garnicht schreiben.
Außerdem hab ich zwei verschachtelte for-Schleifen gefunden die beide die Zählervariable k haben.
Sowas darf doch eigentlich auch nicht sein, oder?
Wie kann man in Visual C++ 2005 Express eigentlich kompilieren oder debuggen?
MfG
jaenicke - Fr 05.01.07 03:22
Coder hat folgendes geschrieben: |
Aha Danke!
Erzeugt Random(10) Zahlen von 1 bis 9 oder von 1 bis 10? |
Von 1 bis 9... Genau wie wenn du modulo 10 nimmst, dann gehts auch bis 9 "weil ja die 10 sonst noch reinpassen würde und 0 rauskäme".
Coder hat folgendes geschrieben: |
Ich bin nun auch noch über ein paar komische Stellen gestolpert:
C#-Quelltext 1:
| for (int x = 0; x < x; y++){... | Innerhalb dieser for-Schleife gibt es keinen Abbruchbefehl.
Ist das nicht eine Unendlichschleife? |
Bist du sicher, dass das genau so dadrin steht? Mit "x < x"? Dann läuft die Schleife nicht unendlich sondern gar nicht, weil x nie kleiner als x ist...
Jedenfalls könnte in einer Endlosschleife ein break; oder return; stehen, wodurch die Schleife bzw. die Methode beendet würde.
Coder hat folgendes geschrieben: |
Das hat mich auch verwundert. Die Namen hab ich verändert:
C#-Quelltext 1: 2:
| if (Bedingun){ BoolFunktion() || Boolean; | Das Ergebnis der zweiten Zeile wird nicht zu etwas zugewiesen.
In Delphi kann man das garnicht schreiben. |
In C++ sieht das auch komisch aus... Das heißt in C++ nix, denn das ist da normal ;-), aber so würde ich es für nicht kompilierbar halten.
Boolean soll ja wohl eine boolsche Variable sein?
"BoolFunktion() || Boolean;" würde dann zu einem boolschen Wert ausgewertet. Das ist aber keine Anweisung und soweit ich weiß geht sowas weder in C++ noch in Delphi. Aber ich lasse mich in diesem Punkt auch eines besseren belehren...
// EDIT: Ach so: "||" ist "oder"... ;-)
Coder hat folgendes geschrieben: |
Außerdem hab ich zwei verschachtelte for-Schleifen gefunden die beide die Zählervariable k haben.
Sowas darf doch eigentlich auch nicht sein, oder? |
In Delphi geht das nicht... In C++ kann man sowas rein von der Sprache her schon machen. Ob es sinnvoll ist hängt vom Anwendungsfall ab, aber ich könnte mir da durchaus sinnvolle Anwendungen vorstellen.
Coder hat folgendes geschrieben: |
| Wie kann man in Visual C++ 2005 Express eigentlich kompilieren oder debuggen? |
Also ich habe Visual Studio 2005 Professional, aber das wird in der Express Edition vermutlich ähnlich sein. Bei mir geht das praktisch wie in Delphi. Klicken links neben der Zeile erzeugt einen Haltepunkt (oder F9), F11 ist Einzelschritt, F10 Prozedurschritt und die Ausführung bzw. das Debuggen starten geht mit F5. Aber diese Befehle sind auch alle im Debug Menü (wo sonst? ;-)).
Coder - Fr 05.01.07 14:08
Danke! :)
Ich werd mal den Ersteller von dem Quellcode kontaktieren.
MfG
jaenicke - Fr 05.01.07 14:17
Du hättest ja auch mal den Code im Original posten können, also ich meine den Teil, wo die von die geposteten Stücke drin sind. Im Zusammenhang erkennt man den Sinn eines Quelltextes besser.
Oder handelt es sich um Source, den du nicht weitergeben darfst?
jaenicke - Fr 05.01.07 14:41
Hmm, ok, also da sehe ich auch im Zusammenhang keinen Sinn. Die Schleife läuft in der Tat stets nur einmal und die Veroderung bringt auch nix.
Aber kompilieren lässt es sich offensichtlich so, auch wenn mich das bei dem oder wundert.
Wenn du Antwort bekommst, würde mich das wirklich interessieren, ob das nur Fehler sind oder ob das wirklich was bringt...
Coder - Fr 05.01.07 21:39
So hab die Antwort bekommen.
| Moritz Lenz hat folgendes geschrieben: |
> Die Schleife in Zeile 450 läuft nicht wegen x < x.
Richtig, das sollte x < 9 heissen.
> Das || in Zeile 234 ergibt keinen Sinn.
Das sollte eine Zuweisung sein, also
flag = simple_solve3() || flag;
> In Zeile 377 und 385 sind zwei verschachtelte for-Schleifen, die beide
> die Zählervariable k haben.
Stimmt, macht aber nichts (ist aber unschön).
In C++ kann man in verschachtelten Blöcken Variablen deklarieren, die
die äußeren "maskieren":
int x = 0;
{
int x = 1;
// hier ist x == 1
}
// hier ist wieder x == 0
Wenn man es nicht weiß ziemlich verwirrend ;-)
Wenn ich es nicht mit for (int k...) initialisieren würde sondern nur
for (k...) schreiben würde wäre es tatsächlich ein Fehler.
> Die Kommentare in Zeile 355 und 371 gehören wahrscheinlich vertauscht.
stimmt.
> int n = random() % 9; in Zeile 560 erzeugt Zahlen von 1 bis 8.
Nein, von 0 bis 8 (Modulo n liefert immer Zahlen von 0 bis n-1).
> set_item(n + 1, x, y); dort wird n um eins erhöht.
> Dadurch werden aber nur Zahlen von 2 bis 9 zufällig ausgewählt.
s.o., passt dann auch.
|
Er wird die Fehler möglichst bald verbessern.
MfG
jaenicke - Fr 05.01.07 22:05
Puh, ich kann also doch C++, genau so hatte ich es ja überall gedacht ;-). Ich dachte schon ich hätte da was in C++ verpasst...
Auch das mit den beiden k-Schleifen habe ich mir gedacht, dass es wohl so sein wird (es wird ja immer die nächste Deklaration benutzt, auch in Delphi), hätte es aber nie selbst so gemacht. (Weil ich es nicht wusste, dass es so geht, und es nicht gerade übersichtlich finde...)
alzaimar - Fr 05.01.07 22:46
jaenicke hat folgendes geschrieben: |
Coder hat folgendes geschrieben: | Aha Danke!
Erzeugt Random(10) Zahlen von 1 bis 9 oder von 1 bis 10? |
Von 1 bis 9... Genau wie wenn du modulo 10 nimmst, dann gehts auch bis 9 "weil ja die 10 sonst noch reinpassen würde und 0 rauskäme".
|
Nope, von
0..9.
jaenicke - Mo 08.01.07 11:35
alzaimar hat folgendes geschrieben: |
jaenicke hat folgendes geschrieben: | Coder hat folgendes geschrieben: | Aha Danke!
Erzeugt Random(10) Zahlen von 1 bis 9 oder von 1 bis 10? |
Von 1 bis 9... Genau wie wenn du modulo 10 nimmst, dann gehts auch bis 9 "weil ja die 10 sonst noch reinpassen würde und 0 rauskäme".
|
Nope, von 0..9. |
:autsch: Vorher hatte ich es ja richtig geschrieben, aber als da stand "von 1 bis 9 oder von 1 bis 10" hab ich nur auf die 9 oder 10 geachtet. :oops:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!