Autor |
Beitrag |
Delphi-Laie
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: 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:
Quelltext 1:
| cbuf = havebuf ? lblock : nkeys; |
(alle vier Variablen sind vom Typ "int").
Bisher war das für mich eine Kurzschreibweise für:
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
      
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)
|
Verfasst: Mo 08.05.17 16:59
Hey,
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 
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Mo 08.05.17 17:08
Bergmann89 hat folgendes geschrieben : | Hey,
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
      
Beiträge: 431
Erhaltene Danke: 107
Win 10
Delphi 6 Prof, Delphi 10.4 Prof
|
Verfasst: Mo 08.05.17 17:12
Kann es sein daß bei Dir infolge Optimierung gar kein Code für Dein Beispiel erzeugt wird?
|
|
doublecross
      
Beiträge: 149
Erhaltene Danke: 27
Windows 7
C#; Visual Studio 2015
|
Verfasst: 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:
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 
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: 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
|
Verfasst: Mo 08.05.17 21:36
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Bergmann89
      
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)
|
Verfasst: 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 
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Mo 08.05.17 22:29
Bergmann89 hat folgendes geschrieben : | 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"?
Bergmann89 hat folgendes geschrieben : | 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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 
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Mo 08.05.17 22:35
Christian S. hat folgendes geschrieben : | 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
      
Beiträge: 378
Erhaltene Danke: 32
Windows 8.1
Delphi 10.4 Comm. Edition
|
Verfasst: Mo 08.05.17 22:37
Hallo,
versuche doch mal
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):
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 
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Mo 08.05.17 22:41
|
|
Gammatester
      
Beiträge: 328
Erhaltene Danke: 101
|
Verfasst: 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
      
Beiträge: 431
Erhaltene Danke: 107
Win 10
Delphi 6 Prof, Delphi 10.4 Prof
|
Verfasst: 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 
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Mo 08.05.17 23:17
Gammatester hat folgendes geschrieben : | 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 
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Mo 08.05.17 23:29
mandras hat folgendes geschrieben : | 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
      
Beiträge: 431
Erhaltene Danke: 107
Win 10
Delphi 6 Prof, Delphi 10.4 Prof
|
Verfasst: 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
      
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)
|
Verfasst: 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)
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 
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Di 09.05.17 14:33
Bergmann89 hat folgendes geschrieben : | 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!
|
|