Autor |
Beitrag |
Coder
      
Beiträge: 1383
Erhaltene Danke: 1
WinXP
D2005 PE
|
Verfasst: Fr 05.01.07 00:25
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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 05.01.07 00: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 
      
Beiträge: 1383
Erhaltene Danke: 1
WinXP
D2005 PE
|
Verfasst: Fr 05.01.07 01: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:
Delphi-Quelltext 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
      
Beiträge: 196
Windows Vista
Delphi 7 Prof.
|
Verfasst: Fr 05.01.07 02: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
Delphi-Quelltext
Zahlen im Bereich von 0 bis 5 erstellt. Dazu (müss) noch der Zufallsgenerator mit
Delphi-Quelltext
aktiviert werden.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 05.01.07 02:32
|
|
Coder 
      
Beiträge: 1383
Erhaltene Danke: 1
WinXP
D2005 PE
|
Verfasst: Fr 05.01.07 03: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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 05.01.07 03:32
|
|
Coder 
      
Beiträge: 1383
Erhaltene Danke: 1
WinXP
D2005 PE
|
Verfasst: Fr 05.01.07 03:35
Besten Dank!
Auch wenn ichs mir überhaupt nicht erklären kann.
MfG
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 05.01.07 03: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 
      
Beiträge: 1383
Erhaltene Danke: 1
WinXP
D2005 PE
|
Verfasst: Fr 05.01.07 04: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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 05.01.07 04: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 
      
Beiträge: 1383
Erhaltene Danke: 1
WinXP
D2005 PE
|
Verfasst: Fr 05.01.07 15:08
Danke!
Ich werd mal den Ersteller von dem Quellcode kontaktieren.
MfG
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 05.01.07 15: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?
|
|
Coder 
      
Beiträge: 1383
Erhaltene Danke: 1
WinXP
D2005 PE
|
Verfasst: Fr 05.01.07 15:19
Es handelt sich um einen Sudoku-Generator/Solver
moritz.faui2k3.org/en/yasss
MfG
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 05.01.07 15: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 
      
Beiträge: 1383
Erhaltene Danke: 1
WinXP
D2005 PE
|
Verfasst: Fr 05.01.07 22: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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 05.01.07 23: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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 05.01.07 23: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.
_________________ Na denn, dann. Bis dann, denn.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 08.01.07 12:35
|
|