Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Von Delphi nach C++, kann das mal einer prüfen bitte

PaoloP / 12 Antworten / Baumansicht Nickles

Ich habe einen kurzen demo-quelltext im internet gefunden. jedoch ist er in delphi und darin bin ich absoluter analphabet. ich habe den text sozugen manuell nach c++ portiert, bin mir aber nicht sicher ober stimmt. kann mir jemand sagen ob das so stimmt bzw. wenn nicht was falsch ist?

Delphi:
Function ggTerw(a,b: integer; var u,v: integer):integer;
var u0, v0:integer;
begin
if b = 0 then Begin
result := a;
u := 1;
v := 0;
End else Begin
result := ggTerw(b, a mod b, u0, v0);//rekursiv
u := v0;
v := u0 - (a div b)*v0;
End;
end;

C++:
int ggTerw( int a, int b, int u, int v)
{
int u0= 0; int v0=0;

if(b==0)
{
u = 1; v = 0;
return a;
}
else
{
u = v0;
div_t v = div(a,b); v = u0 - v.quot*v0;
return ggTerw(b, a % b, u0, v0); //rekursiv
}
}

Ich bedanke mich schon mal im vorraus ausserordentlich bei jedem helfenden, werde es aber sicher hinterher nochmal tun.
Vielen Dank
Mike

Jedes mal wenn jemand "Cloud" sagt, verliert ein Engel seine Flügel.
bei Antwort benachrichtigen
Borlander PaoloP „Von Delphi nach C++, kann das mal einer prüfen bitte“
Optionen

zum Else-Zweig:
Das Ändern der BefehlsReihenfolge wird vermutlich Probleme verursachen, da die geänderten Variablen mit an die Funktion übergeben werden...

var u,v: integer
var bedeutet das die Variablen selbst innerhalb der Funktion geändert wird und nicht eine lokale Kopie mit dem Übergebenem Wert verwendet wird. Denke da solltest Du mit Zeigern arbeiten...


CU Borlander

bei Antwort benachrichtigen
mr.escape Borlander „zum Else-Zweig: Das Ändern der BefehlsReihenfolge wird vermutlich Probleme...“
Optionen
var bedeutet das die Variablen selbst innerhalb der Funktion geändert wird und nicht eine lokale Kopie mit dem Übergebenem Wert verwendet wird. Denke da solltest Du mit Zeigern arbeiten...
Bzw. in c++ mit referenzen, denn die entsprechen der var variante, d.h.:
int ggTerw( int a, int b, int &u, int &v){
...
}

mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
PaoloP Nachtrag zu: „Von Delphi nach C++, kann das mal einer prüfen bitte“
Optionen

Hallo

Zuerst einmal vielen Dank an Borlander und Mr. Escape.
Wenn ich richtig verstehe werden die Parametervariablen als Referenz
und nicht als Kopie übergeben was ich mir schon beinahe gedacht habe, weil sonst einiges in der Funktion schlichtweg umsonst bzw. ohne Effekt wäre.

Nochmals Danke und ich hoffe das ich euch noch das ein oder andere Mal mit dieserlei Problemen belasten kann.
Digitale Grüsse
Mike


Jedes mal wenn jemand "Cloud" sagt, verliert ein Engel seine Flügel.
bei Antwort benachrichtigen
mr.escape PaoloP „Von Delphi nach C++, kann das mal einer prüfen bitte“
Optionen

Eine noch genauere umsetzung wäre wohl:
int ggTerw( int a, int b, int &u, int &v){
int u0, v0, result;
if(b==0){
result = a;
u = 1;
v = 0;
} else {
result = ggTerw(b, a % b, u0, v0);//rekursiv
u = v0;
v = u0 - (a / b) * v0;
}
return result;
}

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
PaoloP mr.escape „Von Delphi nach C++, kann das mal einer prüfen bitte“
Optionen

Hi Mr.Escape

Ja , mein vorläufiges amtliches Endergebniss sieht auch so ähnlich aus. Nämlich so:

int ggTerw( int &a, int &b, int &u, int &v)
{
int u0= 0; int v0=0;
int new_b=0;

if(b==0)
{
u = 1;
v = 0;
return a;
}
else
{
u = v0;
div_t dv = div(a, b);
v = u0 - dv.quot * v0;
new_b = a%b;
return ggTerw(b, new_b, u0, v0); //rekursiv
}
}
..........
Falls es jemanden interessiert, ich bastele eine Klasse für RSA also Public Key Verschlüsselung und wenn die fertig können die an meinen Problemchen anteilnehmenden Personen sich die Klasse gerne zuschicken lassen.

Viele Grüsse und nochmals Danke
Mike

Jedes mal wenn jemand "Cloud" sagt, verliert ein Engel seine Flügel.
bei Antwort benachrichtigen
mr.escape PaoloP „Von Delphi nach C++, kann das mal einer prüfen bitte“
Optionen

Warum
int ggTerw( int &a, int &b, int &u, int &v)
und nicht
int ggTerw( int a, int b, int &u, int &v)

warum
int u0= 0; int v0=0;
und nicht
int u0, v0;

warum
div_t dv = div(a, b);
v = u0 - dv.quot * v0;
und nicht
v = u0 - (a / b) * v0;

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
PaoloP mr.escape „Von Delphi nach C++, kann das mal einer prüfen bitte“
Optionen

Hallo, vielen Dank für Deine Mühe. Ich finde das echt super :-)

Ja die beiden ersten Parameter als Referenz zu übergeben scheint nicht notendig , da hast du recht. Ich werde das vergleichend debuggen wenn mein Download der Trial-Version von Delphi endlich fertig ist(174 MB mit analog-verbindung )
---
warum
int u0= 0; int v0=0;
und nicht
int u0, v0

Naja irgendwer hat mir mal eingeprügelt Variablen immer mit einem Startwert zu initialisieren in C++. Siehst Du hier etwa einen Fehler den ich nicht sehe?
----------
warum
div_t dv = div(a, b);
v = u0 - dv.quot * v0;
und nicht
v = u0 - (a / b) * v0;

Also ich bin davon ausgegangen das div in Delphi das Gegenstück zu Modulo ist also den "Rest" einer Modulo-Rechnung ausgibt. Stimmt das etwa nicht und es ist doch nur Division pur?

Vielen Dank und Grüsse (wohin auch immer..)
Mike

Jedes mal wenn jemand "Cloud" sagt, verliert ein Engel seine Flügel.
bei Antwort benachrichtigen
mr.escape PaoloP „Von Delphi nach C++, kann das mal einer prüfen bitte“
Optionen

Grundsätzlich sehe ich eine möglichst genaue umsetzung als primäres ziel, daher meine anmerkungen.

Ja die beiden ersten Parameter als Referenz zu übergeben scheint nicht notendig ...
Laut originalcode sind die ersten zwei parameter "by value", die andere zwei "by reference".

Naja irgendwer hat mir mal eingeprügelt Variablen immer mit einem Startwert zu initialisieren in C++. Siehst Du hier etwa einen Fehler den ich nicht sehe?
Das ist zwar grundsätzlich nicht falsch, aber initialwerte sollten eine bedeutung haben, ansonsten sind sie fast genau so gut wie zufällige (ehemalige stack-) werte. Bei so kurzem quellcode bleibt hingegen die übersicht erhalten und man sieht gleich wie die variablen benutzt werden (ein guter compiler sollte bei verwendung nicht initialisierter werte warnen, das kann sogar semantische fehler aufzeigen).

Also ich bin davon ausgegangen das div in Delphi das Gegenstück zu Modulo ist also den "Rest" einer Modulo-Rechnung ausgibt. Stimmt das etwa nicht und es ist doch nur Division pur?
Auch wenn ich nicht darauf schwören wurde, aber div sollte in delphi eine integer division sein, rest egal und mod eben nur der rest der division. Das ist (bei int werten) mit "/" und "%" in c(++) erreicht. Umständlich konstrukte mit
div_t div(a,b)
sind darum nicht erforderlich.

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
PaoloP mr.escape „Von Delphi nach C++, kann das mal einer prüfen bitte“
Optionen

Hallo mr. esc(alt+f4 geht auch?)

Zuerst: div ist einfach nur Ganzzahldivision und nicht mehr. Da hat mir so ein Möchtegernexperte Mist erzählt. Deswegen kam bei meinen Berechnungen nach dem Private-Key d, n auch immer 0 raus.
Naja schwamm drüber. Aufrgrund deine Empfehlung werde ich die Werte nun mit -1 initialisieren. Wie meinst du das mit zufälligen ehemaligen Stack-Werten ?

Jedes mal wenn jemand "Cloud" sagt, verliert ein Engel seine Flügel.
bei Antwort benachrichtigen
Alt-F4 PaoloP „Von Delphi nach C++, kann das mal einer prüfen bitte“
Optionen
Hallo mr. esc(alt+f4 geht auch?)
Nee, dann doch lieber "Alt-F4"

Alt-F4
bei Antwort benachrichtigen
PaoloP Alt-F4 „Von Delphi nach C++, kann das mal einer prüfen bitte“
Optionen

Huuuuch

Da will man einmal im Leben lustig sein und dann tritt man gleich jemandem unbeabsichtigt auf die Füssse. Sorry

Jedes mal wenn jemand "Cloud" sagt, verliert ein Engel seine Flügel.
bei Antwort benachrichtigen
mr.escape PaoloP „Von Delphi nach C++, kann das mal einer prüfen bitte“
Optionen
Hallo mr. esc(alt+f4 geht auch?)
Der nickname mr.escape stammt tatsächlich von einer escape taste, verliehen durch ein programm, wo die benutzung der escape taste verpönt war.

Wie meinst du das mit zufälligen ehemaligen Stack-Werten ?
Das sind die werte, die in nicht initialisierten, nicht statischen und nicht explizit allokierten und damit eben automatischen (stack)variablen drin stehen. Z.b. in :

void foo(){
int i;
}

ist der inhalt von i nicht definiert. Irgend etwas steht aber drin und da der speicherort auf dem stack ist, ist es ein alter stack wert (ehemalige parameter, rücksprungadresse, gesicherte registerinhalte etc.)

mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen