Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Compiler Fehler??


HenryHux - So 07.11.10 20:06
Titel: Compiler Fehler??
Hi, ich bin seit nen paar Tagen in meinem Programm am Fehler suchen, habe aber nie was gefunden.
Arbeite teilweise mit GoTo(unvermeidbar imo) und brauchte deswegen ne unerfüllbare Bedingung.
Deshalb habe ich if 1+1=1 then genommen.
Alles schön und gut, Compiler hat kein Problem, also noch am Programm viele andere Änderungen gemacht.
Wie gesagt, ab dann kamen im Betrieb Fehler, ich suche wie ein Idiot, bis ich die Zeile änder.
Nun klappt es.
Lag es daran? Wieso hat der Compiler nichts von sich gegeben? Sollte man sowas generell vermeiden?

Lg

Henry


bummi - So 07.11.10 20:20

Ich habe den Sinn nicht verstanden und auch wenn im Maschinencode letztlich wieder goto (jmp) vorkommt gehört diese Relikt nicht mehr in wartbaren/lesbaren Code.


HenryHux - So 07.11.10 20:30

Es geht hier wirklich nicht ohne GoTo, zumindest wüsste ich nicht wie, hatte das Thema hier schonmal angesprochen.
Der Sinn war, dass mich interessiert, ob man sowas benutzen kann (if 1+1=1) und ob der Compiler solche Sachen übersetzt, obwohl der Computer es nicht "versteht".


platzwart - So 07.11.10 20:32

Es geht ohne Goto, ganz sicher!

Und was die nicht erfüllbare Klausel angeht, wie wäre es mit: If(false)then... (und was soll der Computer daran nicht verstehen?!?)


Tranx - So 07.11.10 20:42

Mal eine kleine Frage:

if 1+1=1 then ....

ist doch eigentlich unsinnig, oder, denn der Code hinter if wird doch nie ausgeführt, denn 1+1 ist eben nicht 1, also false. Also gilt übersetzt

if false then ....

das macht dann Sinn und zeigt, dass der Code nach if eben nie ausgeführt wird. Also kann er gleich gelöscht werden!


platzwart - So 07.11.10 20:51

Ja und? Warum sollte "der Computer das nicht verstehen"? Du hast da eine Bedingung hingeschrieben, die nicht erfüllt ist, also wird das, was hinter dem 'then' steht auch nie ausgeführt. Wenn die Optimierung des Compilers eingeschaltet ist, so wird er diesen Fall 'wegoptimieren'. Was aber hat das mit Goto zu tun?!?


HenryHux - So 07.11.10 21:04

Ok, hat sich geklärt denke.
Mein Problem war, dass der Compiler bei if 2*1=1 then nen internen Fehler angezeigt hat. Aber nicht bei if 1+1=1.
Deswegen dachte ich, dass es klappen würde, was aber nicht so war.
Tranx hat meine Frage praktisch geklärt, sorry wenn ich mich schlecht ausgedrückt hatte.

Lg

henry


FinnO - So 07.11.10 21:40

user profile iconplatzwart hat folgendes geschrieben Zum zitierten Posting springen:
Was aber hat das mit Goto zu tun?!?


Ich hab da ne ganz üble befürchtung:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
if (false) then
begin
  label Sprungmarke: 
  {dosth}
end
else
  {dosthelse}
  goto Sprungmarke;
end;


(keine gewähr für richtigen goto-code, hab das nie gemacht...


BenBE - Mo 08.11.10 07:15

@FinnO: Syntax ist zwar falsch, aber damit hier keiner auf die Idee kommt, schreib ich die Korrektur hier auch nicht.

Aber deine Vermutung teile ich und Tranx hat auch schon schön den Grund erklärt, warum es da kracht. Warum aber der Compiler bei 2*1=1 nen internen Fehler, und bei 1+1=1 nix (nicht mal die übliche Short Circuit Warnung) bringt, wundert mich etwas.

Wie das aber immer so mit ohne Source ist: Man kann viel rätseln.

BTW1: Je Goto = einmal in flüssigem Metal baden gehen. Die Anzahl der Label bestimmt die Anzahl Nullen in der Temperatur ;-)

BTW2: Ich hab schon aus der typischen ZLib-Schleife Gotos entfernt oder andere Verquere Strukturen so umgebaut, dass sie ohne Goto gingen. Man muss nur wollen ... Und dadurch ist bisher ALLES übersichtlicher geworden. Die einzigen erlaubten Sprünge sind mit Break, Continue, Exit oder Raise. Alles andere fällt unter BTW1.


jfheins - Mo 08.11.10 14:00

user defined image

:mrgreen:


hansa - Mo 08.11.10 14:09

Insgesamt gesehen : was Du da zusammenbraust ist entsetzlich. :mrgreen: Da muss es irgendwo krachen. :lol:


Tranx - Mo 08.11.10 18:58

Das mit dem Dino finde ich echt zum Schreien!! :lol:

Goto Dino!!!