AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein CPP Routine (Schleifen) Übersetzung nach Delphi gesucht
Thema durchsuchen
Ansicht
Themen-Optionen

CPP Routine (Schleifen) Übersetzung nach Delphi gesucht

Ein Thema von Möbius · begonnen am 3. Okt 2022 · letzter Beitrag vom 5. Okt 2022
Antwort Antwort
Möbius

Registriert seit: 19. Sep 2021
Ort: Schwarzwald
17 Beiträge
 
Delphi 10.4 Sydney
 
#1

CPP Routine (Schleifen) Übersetzung nach Delphi gesucht

  Alt 3. Okt 2022, 13:03
Hallo zusammen

Ich habe hier eine Programmvorlage in CPP.
Bei einem Codeteil will mir die Übersetzung nach Delphi nicht so recht gelingen.
Irgendwie verstehe ich wohl die CPP Schleifenkonstrukte nicht so recht.
Kann mir bitte jemand helfen dies nach Delphi zu übersetzen.
In den folgenden Kommentarzeilen ist der CPP-Source.
Dann mein Stand der Dinge:

Besten Dank für Eure Hilfe
Delphi-Quellcode:
// CPP Code
// for (int i = 0, j = 1; j < n - 1; j++) {
// for (int k = n >> 1; k > (i ^= k); k >>= 1);
// if (j < i) {
// const int32_t x0r = ar[j];
// const int32_t x0i = ai[j];
// ar[j] = ar[i];
// ai[j] = ai[i];
// ar[i] = x0r;
// ai[i] = x0i;
// }
// }

// Delphi Code
  j := 1;
  while j < (n - 1) do
  begin
    i := 0;
    k := n shr 1;
     while k > (i xor k) do
    begin
      i := i xor k;
      DebugPrint(IntToStr(i));
      if j < i then
      begin
        x0r := OutR[j];
        x0i := OutI[j];
        OutR[j] := OutR[i];
        OutI[j] := OutI[i];
        OutR[i] := x0r;
        OutI[i] := x0i;
      end;
      k := k shr 1;
    end;
    inc(j);
  end;
Reto Crameri
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: CPP Routine (Schleifen) Übersetzung nach Delphi gesucht

  Alt 3. Okt 2022, 17:11
Die Initialiaisierung "ErstesStatement;" gehört vor die Schleife, also nicht nur j := 1; , sondern auch das i := 0; .
Dann die Bedingung für das While und zum Schluß die Fortschrittsberechnung am Ende der Schleife.

Aber Beachte auch das ; , bzw. die fehlende { , am Ende der zweiten Schleife.
Diese liegt nicht um das IF drumrum, sondern nur alleine vor dem IF.
$2B or not $2B

Geändert von himitsu ( 3. Okt 2022 um 17:19 Uhr)
  Mit Zitat antworten Zitat
Möbius

Registriert seit: 19. Sep 2021
Ort: Schwarzwald
17 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: CPP Routine (Schleifen) Übersetzung nach Delphi gesucht

  Alt 3. Okt 2022, 17:32
Danke für die Antwort himitsu

Also ich jetzt das i = 0 vor die erste Schelife gestellt.
Unter Berücksichtigung des ; bei der zweiten Schleife läuft diese also "leer".

Folgende Änderung habe ich vorgenommen:
Delphi-Quellcode:
  j := 1;
  I := 0;
  while j < (n - 1) do
  begin
    k := n shr 1;
    while k > (I xor k) do
    begin
      I := I xor k;
      k := k shr 1;
    end;
    if j < I then
    begin
      x0r := OutR[j];
      x0i := OutI[j];
      OutR[j] := OutR[I];
      OutI[j] := OutI[I];
      OutR[I] := x0r;
      OutI[I] := x0i;
    end;
    inc(j);
  end;
Das läuft immer noch nicht.
Besonders das while k > (I xor k) do Statement scheint mir sinnlos.
Wenn I = 0 dann ist das Statement immer falsch da k xor 0 = k ist. Und das ist gleich gross wie k aber nicht kleiner.

Wäre froh um weitere Unterstützung.
Reto Crameri
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#4

AW: CPP Routine (Schleifen) Übersetzung nach Delphi gesucht

  Alt 4. Okt 2022, 01:44
habe den C-Code mal etwas "vereinfacht"... das kannst du nun 1:1 in Delphi umsetzen

int i = 0;
int j = 1;

while(j < (n - 1))
{
int k = n >> 1;

i ^= k;
while(k > i)
{
i ^= k;
k >>= 1;
}
if(j < i)
{
const int32_t x0r = ar[j];
const int32_t x0i = ai[j];

ar[j] = ar[i];
ai[j] = ai[i];
ar[i] = x0r;
ai[i] = x0i;
}
j++;
}
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: CPP Routine (Schleifen) Übersetzung nach Delphi gesucht

  Alt 4. Okt 2022, 02:19
mit i ^= k; habe ich noch ein Problem, was sich so nicht 1:1 nach Delphi übersetzen lässt.

Es wird bereits in der WHILE-Bedingung ausgeführt also auch dann, wenn es FALSE liefert.

vermutlich müsste man das entweder in eine Funktion mit VAR-Parameter auslagern
oder einmal im While, für den Vergleich, und einmal in der Schleife mit := und auch nochmal nach der Schleife
oder vor der Schleife und nochmal in der Schleife
oder man löst das mit einem Repeat, bzw while True do und drinnen die Abbruchbedingung mit IF und BREAK.
$2B or not $2B

Geändert von himitsu ( 4. Okt 2022 um 17:57 Uhr)
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#6

AW: CPP Routine (Schleifen) Übersetzung nach Delphi gesucht

  Alt 4. Okt 2022, 14:52
..."mit i ^= k; habe ich noch ein Problem, was sich so nicht 1:1 nach Delphi übersetzen lässt."...

i := i xor k; (man beachte, das die Zuweisung im org. C-Code Bestandteil des Vergleichsterms war... das bedeutet das geht so in Delphi nicht direkt, deshalb muss die Zuweisung das erste Mal vor der "KopfWhile" gemacht werden, und dann noch jedesmal mit am Ende pro Durchlauf! )

Geändert von mensch72 ( 4. Okt 2022 um 14:57 Uhr)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#7

AW: CPP Routine (Schleifen) Übersetzung nach Delphi gesucht

  Alt 5. Okt 2022, 10:17
Für die Berechnung von I ist scheint mir eine Funktion mit VAR-Parameter dem Orginal am ähnlichsten.
Delphi-Quellcode:
function CalcI(var i: Integer; k: Integer): Integer; inline;
begin
  i := i xor k;
  result := i;
end;

while k > CalcI(i, k) do
begin
  k := k shr 1;
end;
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz