Autor Beitrag
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 08.05.17 16:25 
Hallo Programmierfreunde!

Zur Zeit quäle ich mich wieder durch einen C(++)-Quelltext, um diesen nach Pascal zu portieren.

Konkret geht es um die Zeile:

ausblenden Quelltext
1:
cbuf = havebuf ? lblock : nkeys;					


(alle vier Variablen sind vom Typ "int").

Bisher war das für mich eine Kurzschreibweise für:

ausblenden Quelltext
1:
2:
3:
if (havebuf)
then cbuf = lblock;
else cbuf = nkeys;


doch so einfach scheint es nicht zu sein.

Die (beispielhaften, im Programmverlauf ggf. auch andere) Werte betragen vor der Ausführung:
cbuf: 0
havebuf: 1
lblocks: 256
nkeys: 79

bei if (havebuf) wird diese Integervariable als boolean interpretiert. Egal, irgeneinen der beiden Werte - den von lblocks oder den von nkeys - muß (müßte) cbuf doch nach der Ausführung haben?! Tatsächlich sind jedoch alle Variablenwerte nach der Ausführung dieses Bedingungsoperators gleich(geblieben).

Wie ist das zu erklären, bzw. wie lautet die "lange Schreibweise" korrekt oder gar Pascal-Übersetzung (die bekomme ich natürlich selbst noch hin)?

Vielen Dank und Gruß

Delphi-Laie
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Mo 08.05.17 16:59 
Hey,

ausblenden Delphi-Quelltext
1:
2:
3:
if (havebuf)
then cbuf = lblock;
else cbuf = nkeys;


Da würde ich jetzt eigentlich einen Syntax Error erwarten. Vor dem else darf kein ; stehen.

MfG Bergmann

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 08.05.17 17:08 
user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
Hey,

ausblenden Delphi-Quelltext
1:
2:
3:
if (havebuf)
then cbuf = lblock;
else cbuf = nkeys;


Da würde ich jetzt eigentlich einen Syntax Error erwarten. Vor dem else darf kein ; stehen.


Meinetwegen, ich übersetzte das ad hoc in die ausführliche Schreibweise, fügte diese jedoch nicht in den Quelltext ein.

Das hat aber mit meiner eigentlichen Fragestellung nichts zu tun.

Die Werte bleiben unverändert. Das kann ich, wenn es jemand nicht glaubt, auch mit Bildschirmkopien demonstrieren.
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 429
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: Mo 08.05.17 17:12 
Kann es sein daß bei Dir infolge Optimierung gar kein Code für Dein Beispiel erzeugt wird?
doublecross
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 149
Erhaltene Danke: 27

Windows 7
C#; Visual Studio 2015
BeitragVerfasst: Mo 08.05.17 17:12 
Hi,

mich wundert das der Compiler das überhaupt durchgehen lässt. Die Delphi Versionen mit denen ich gearbeitet habe würden einen Boolean in der if-Bedingung erwarten, aber die sind zugegeben auch etwas älter.

Wenn ich es richtig in Erinnerung habe ist in C 0 == false und alles andere == true. Daher würde ich die Sache so formulieren:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
if (havebuf <> 0)then 
  cbuf := lblock
else 
  cbuf := nkeys;


Gruß


Zuletzt bearbeitet von doublecross am Mo 08.05.17 18:23, insgesamt 1-mal bearbeitet
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 08.05.17 17:18 
Danke für Eure Wortmeldungen!

Wegen allgemeiner (schon geahnter) Skepsis hier die beiden Bilschirmkopien (eigentlich Fensterkopien), einmal im Zustand vor und einmal im Zustand nach der Ausführung, als Anhang.

Ergänzung: Der Compiler ist der des Visualstudios 2008.
Einloggen, um Attachments anzusehen!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 08.05.17 21:36 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Mo 08.05.17 21:44 
Sicher das dein Code zum Binary passt? Wenn das in den Bilden wirklich ein Einzelschritt war, dann würde ich eigentlich erwartet, dass er auf dem if stehen bleibt und nicht im if-Block.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 08.05.17 22:29 
user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
Sicher das dein Code zum Binary passt?


Mit dieser Frage kann ich leider kaum etwas anfangen. Ich habe Quelltext(e), zu einem compilierbaren Programm geformt. Man / ich kann mit oder ohne Debugging starten. Das Programm wird daraufhin ausgeführt. Wie sollte das Binary nicht zu diesem Quellcode "passen"? :?:

user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
Wenn das in den Bilden wirklich ein Einzelschritt war, dann würde ich eigentlich erwartet, dass er auf dem if stehen bleibt und nicht im if-Block.


Die Tücken dieses Compilers sind mir unbekannt. Soeben setzte ich noch einmal explizit einen Haltepunkt auf die if-Anweisung - es läßt sich dort einer setzen - doch das Programm weigert sich, an dieser Stelle die Ausführung zu unterbrechen, es geht danach an bekannter Stelle weiter. Offensichtlich ist die if-Bedingung aber erfüllt.

Wenn ich mir allerdings die Downloadzahl meiner Archivdatei mit den beiden Fensterkopien anschaue und die bisher allgemeine Ratlosigkeit, die das auslöste - kein Vorwurf, im Gegensatz, ich bin über jedes Hilfsbemühen dankbar! - so stelle ich fest, daß ich wohl doch die richtige Programmiersprache / Umgebung noch in den Frühzeiten des PCs wählte. An C & Co. gefällt mir zwar einiges, so die Möglichkeit, Code stärker zu komprimieren und auch die größere Flexibilität, dennoch ist mir dieses mysteriöse Rumgemache damit, das manchmal sogar unlösbare Rätsel hat und unüberwindliche Hürden aufstellt, bis heute suspekt bis antipathisch. Ich kann jeden Informatiker verstehen, der Algorithmen entweder im Pseudocode oder doch in einer daran angelehnten Programiersprache (Algol oder Wirth'sche Sprachen) veröffentlicht, nicht jedoch mit diesem C.


Zuletzt bearbeitet von Delphi-Laie am Mo 08.05.17 22:37, insgesamt 1-mal bearbeitet
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 08.05.17 22:32 
Bergmann98s Frage zielte wohl darauf ab, ob Du den Quelltext mal editiert aber dann nicht neu kompiliert / gebaut hast. Dann würdest Du eine Anwendung ausführen (und debuggen), die nicht mehr zum Quelltext passt.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".

Für diesen Beitrag haben gedankt: Delphi-Laie, doublecross
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 08.05.17 22:35 
user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Bergmann98s Frage zielte wohl darauf ab, ob Du den Quelltext mal editiert aber dann nicht neu kompiliert / gebaut hast. Dann würdest Du eine Anwendung ausführen (und debuggen), die nicht mehr zum Quelltext passt.


Nein, das tat ich natürlich mitnichten!
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Mo 08.05.17 22:37 
Hallo,

versuche doch mal

ausblenden Quelltext
1:
cbuf (havbuf==0) ? ....					


Andere Idee: Vielleicht optimiert der Compiler ja was weg und der Debugger sieht das nicht. Leg doch mal cbuf global an, so dass cbuf auf jeden Fall beschrieben werden muss. Zur Sicherheit würde ich an anderer Stelle im Programm noch irgendeine belanglose Sache mit cbuf machen.

Noch eine Idee: Ich hatte letztens in C in einer Schleife (bool x):
ausblenden Quelltext
1:
2:
3:
x = !x;
if (x) macheA();
else macheB();


Eine Weile wurde immer abwechselnd macheA und macheB aufgerufen, wie geplant. Plötzlich bei jedem Durchlauf die gleiche Routine (weiß nicht mehr ob A oder B). Ursache: Ich hatte versehentlich x einmalig (!!) mit einem Zahlenwert überschrieben. Daher die Idee obern mit der robustren Abfrage havbuf==0.

Bin gespannt auf die Lösung,
Gruß
GuaAck

Für diesen Beitrag haben gedankt: Delphi-Laie
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 08.05.17 22:41 
user profile iconGuaAck hat folgendes geschrieben Zum zitierten Posting springen:
Andere Idee: Vielleicht optimiert der Compiler ja was weg


Das ist eine gute Idee. Mit derlei Tricks hatte ich auch schon mit diversen Delphi-Compilern meine liebe Not. So etwas kann einen, der das nicht weiß, fast zur Verzweiflung treiben, denn die Auskunftsfreude darob ist doch ziemlich defizitär.

user profile iconGuaAck hat folgendes geschrieben Zum zitierten Posting springen:
und der Debugger sieht das nicht.


Dann stimmt die Kommunikation zwischen beiden nicht. In Delphi werden solche Zeilen dann wenigstens ignoriert - und, wie gesagt, wenn man den Grund dafür nicht weiß, sucht man sich nach der Ursache einen Wolf.

user profile iconGuaAck hat folgendes geschrieben Zum zitierten Posting springen:
Bin gespannt auf die Lösung.


Ich im Prinzip auch, aber praktisch kaum, da es wahrscheinlich keine geben wird. Ich bin da pragmatisch: Was mich ärgert und seine Existenzberechtigung nicht nachweisen kann, wird weggeputzt. Sofern der (Sortier-)Algorithmus auch ohne fehlerfrei funktioniert - und hier scheint die Anweisung schon im Original keine erkennbaren Auswirkungen zu haben - sind derlei Codebstandteile faktisch / praktisch Redundanz und erleiden dann ihr verdientes Schicksal. Ewige Ursachenforschung ist hierbei nicht "mein Ding".
Gammatester
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: Mo 08.05.17 22:46 
Es könnte auch sein, daß der Compiler die Zuweisumg an der Operator-Zeile wegoptimiert und erst bei den Aufrufen einsetzt. Gibt den Wert von cbuf doch mal in beiden Zweigen aus (dann müßte die Zuweisung vorher ausgeführt werden).

Für diesen Beitrag haben gedankt: Delphi-Laie
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 429
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: Mo 08.05.17 23:04 
Wenn Du die Möglichkeit hast, beim Debuggen auch den erzeugten Maschinencode einzusehen mach davon ein Bild und setze es hier ein.
Dann läßt sich sehr wahrscheinlich mehr sagen.
Wie man es bei Deiner C-Umgebung macht kann ich Dir aber nicht sagen, vielleicht aber jemand anderes hier.´oder Du findest es auf die Schnelle.
Bei Delphi sagt man einfach nachdem ein Haltepunkt erreicht wurde "CPU-Fenster zeigen".

Für diesen Beitrag haben gedankt: Delphi-Laie
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 08.05.17 23:17 
user profile iconGammatester hat folgendes geschrieben Zum zitierten Posting springen:
Es könnte auch sein, daß der Compiler die Zuweisumg an der Operator-Zeile wegoptimiert und erst bei den Aufrufen einsetzt. Gibt den Wert von cbuf doch mal in beiden Zweigen aus (dann müßte die Zuweisung vorher ausgeführt werden).


Guter Spürsinn, danke!

Yo, nun wird es richtig lustig. Nachdem ich die Bildschirmausgabe des int-Datentyps endlich hinbekam, zeigen sich zwei unterschiedliche Werte: Der im Debugger ist 0, ausgegeben wird jedoch der vermutlich korrekte Wert 256. Ich hoffe, daß es an der Bildschirmkopie (Anhang) erkennbar ist.
Einloggen, um Attachments anzusehen!
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 08.05.17 23:29 
user profile iconmandras hat folgendes geschrieben Zum zitierten Posting springen:
Wenn Du die Möglichkeit hast, beim Debuggen auch den erzeugten Maschinencode einzusehen mach davon ein Bild und setze es hier ein.


So gut kenne ich mich mit dem Visual Studio (2008) nicht aus. Debuggen -> Fenster -> Disassambly scheint passend zu sein, es zeigt jedenfalls Maschinencode bzw. Mnemonics, auch mit gelbem Haltepfeil. Doch ist das nicht etwas zuviel des Guten? Na gut, auf Wunsche eines einzelnen Forumsmitgliedes gern, siehe Anhang.

Man kann sich auf den Debuger im Visual Studio nicht verlassen, jedenfalls nicht im gleichen Maße wie auf den in Delphi. Das hat mir gammatesters Anregung, die ich umsetzte, eindeutig gezeigt. Werde ich demnächst zur Sicherheit eben den "händischen" Weg (bzw. den "zu Fuß") über Bildschirmausgaben wählen (müssen). Kein berauschendes Debuggingniveau.
Einloggen, um Attachments anzusehen!
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 429
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: Di 09.05.17 00:04 
> Doch ist das nicht etwas zuviel des Guten?

Jein. Es ging mir darum zu sehen ob der Fehler daran liegt, daß die Werte in Registern gehalten werden.
Dann hätte ich geraten, die Optimierungsstufe zu reduzieren.

Mit VS / C habe ich zu lange keine Erfahrungen mehr, ich kenne solche Fehler bei Delphi gerne bei folgender Situation:
Optimierung an, Debugging im Einzelschritt, Variablen werden aber nach der aktuellen Position gar nicht mehr verwendet -
da kommt der Debugger (ich weiß es sicher von D6 und D7) durcheinander. Ich sollte mal nachsehen ob die aktuellen
Versionen auch noch dieses Verhalten aufweisen.

Für diesen Beitrag haben gedankt: Delphi-Laie
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Di 09.05.17 09:07 
Ah, der Compiler hat das IF weg optimiert, wenn havebuf ungleich 0 ist. Siehe Assembly Offset 0x0145. Da springt er direkt nach 0x0150 anstatt zu 0x014D (wo das IF steht). Aber um deine eigentliche Frage zu beantworten. Der äquivalente Pascal Code wäre (wie du schon gesagt hast)
ausblenden Delphi-Quelltext
1:
2:
3:
if (havebuf <> 0)
  then cbuf := lblock
  else cbuf := nkeys;

Warum der Debugger da im VS jetzt so verrückt spielt sei ja erstmal dahin gestellt...

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^

Für diesen Beitrag haben gedankt: Delphi-Laie
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Di 09.05.17 14:33 
user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
Warum der Debugger da im VS jetzt so verrückt spielt sei ja erstmal dahin gestellt...


Nun, das weiß ich natürlich erst recht nicht, und es interessiert mich auch nicht sonderlich, maximal dafür, das wegzubekommen. Aber dafür reichen meine Kenntnisse in und meine Experimentierlaune mit Visual Studio bei weitem nicht. Ich bin jedesmal froh, möglichst bald von C & Co. wieder wegzukommen, also ist meine Verweildauer in dessen Entwicklungsumgebungen nicht mehr als nötig.

Dank gammatester bin ich nun aber doch auf der richtigen Fährte. Hätte ich im Prinzip auch darauf kommen können, wenn mir denn in den Sinn gekommen wäre, es mit der "alternativen" Ausgabemöglichkeit zu versuchen. Diese benutze ich auch heute noch gelegentlich bei Delphi - kleine Showmessages oder Pieptöne wechselnder Frequenz zwischendrin - oder noch viel eher bei Lazarus / Freepascal, weil dessen Debugger doch noch nicht an Delphi heranreicht.

Nochmals Dank an alle!