Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Welche Zahl ist größer 50, kleiner 60 und gerundet 0? (https://www.delphipraxis.net/73051-welche-zahl-ist-groesser-50-kleiner-60-und-gerundet-0-a.html)

Angel4585 11. Jul 2006 15:10


Welche Zahl ist größer 50, kleiner 60 und gerundet 0?
 
Hallo,

ich hab folgenden Codeabschnitt in meinem Quelltext:

Delphi-Quellcode:
function TForm1.Test : string;
var xtest : real;
begin
with MyZQuery do
  try
    sql.Text:='SELECT * FROM Tabelle';
    Active:=True;
    if (FieldByName(cfGesamtpreis).AsFloat>50.0)and(FieldByName(cfGesamtpreis).AsFloat <60.0) then
      xtest:=FieldByName(cfGesamtpreis).AsFloat;//in xtest wird hier dauernd 5,2598911262e-307 geschrieben
    Result:=FieldByName(cfID).AsString;
  finally          
    Active:=False;
    end;
end;
Also.. kann mir jemand sagen was da los ist? :wall:

Danke :)

:angel:

rwachtel 11. Jul 2006 15:26

Re: Welche Zahl ist größer 50, kleiner 60 und gerundet 0?
 
Woher weisst Du, wass in xtest geschrieben wird? So wie ich das sehe, wird xtest nicht weiter verwendet.

himitsu 11. Jul 2006 15:29

Re: Welche Zahl ist größer 50, kleiner 60 und gerundet 0?
 
die Variable wird vom Compiler wegoptimiert

Delphi-Quellcode:
function TForm1.Test : string;
var xtest : real;
begin
with MyZQuery do
  try
    sql.Text:='SELECT * FROM Tabelle';
    Active:=True;
    if (FieldByName(cfGesamtpreis).AsFloat>50.0)and(FieldByName(cfGesamtpreis).AsFloat <60.0) then
      xtest:=FieldByName(cfGesamtpreis).AsFloat;//in xtest wird hier dauernd 5,2598911262e-307 geschrieben
    Result:=FieldByName(cfID).AsString;
  finally          
    Active:=False;
    end;
if xtest = 0 then ; // damit sollte es gehn
end;

Jasocul 11. Jul 2006 15:39

Re: Welche Zahl ist größer 50, kleiner 60 und gerundet 0?
 
Selbst wenn xtest nicht wegoptimiiert würde, kann die Variable immer noch einen unbestimmten Inhalt haben. Es könnte ja durchaus passieren, dass die If-Bedingung nicht erfüllt ist.

Angel4585 11. Jul 2006 15:54

Re: Welche Zahl ist größer 50, kleiner 60 und gerundet 0?
 
ich hab da en Haltepunkt rein gemacht... auf die zuweisung..

Jasocul 11. Jul 2006 15:56

Re: Welche Zahl ist größer 50, kleiner 60 und gerundet 0?
 
Du musst dann aber auch noch einen Schritt weiter gehen. Ansonsten ist die Zuweisung noch nicht erfolgt und die Variable ist noch nicht gefüllt. Hat also ihren nicht-initialisierten Zustand.
Oder setze mal den Haltepunkt nach der Zuweisung. (Bei der Result-Zuweisung)

Angel4585 11. Jul 2006 16:07

Re: Welche Zahl ist größer 50, kleiner 60 und gerundet 0?
 
wenn ich ihn danach setze besteht die möglichkeit das er nich reingegangen ist. so schalu das ich en schritt weiter muss war ich auch.. ich schu morgen mal was passiert wenn ich die Variable danach nochmal verwende...

himitsu 11. Jul 2006 16:07

Re: Welche Zahl ist größer 50, kleiner 60 und gerundet 0?
 
mach also mal den Haltepunkt auf Result:=FieldByName(cfID).AsString; und normaler Weise sollte Delphi was sagen, wegen der nichtgenutzten Variable ... also versuch es auch mal mit urgendwas, was diese Variable hinterher noch verwendet (z.B. mein IF).

Angel4585 12. Jul 2006 07:25

Re: Welche Zahl ist größer 50, kleiner 60 und gerundet 0?
 
ok ich hab die Variable danach nochmal verwendet und jetzt funt es, scheint wirklich "nur" wegoptimiert geworden zu sein. Aber könnte man das nicht auch wenigstens dazuschreiben? Da steht zwar das der auf xtest zugewiesene Wert nie verwendet wird, aber adraus kann ich doch nicht darauf schliessen das der wegoptimiert wurde :roll:

Sidorion 12. Jul 2006 11:00

Re: Welche Zahl ist größer 50, kleiner 60 und gerundet 0?
 
Tja das ist genau der Grund, warum die Optimization grundsätzlich ausgeschaltet werden sollte. Der Compiler ist auch ohne Optimierung schnell genug und wenn sie an ist, macht er nur Blödsinn, wie z.B.: durchaus sinnvollen Code wegzuoptimieren oder Schindluder mit dem CallStack zu treiben.

rwachtel 12. Jul 2006 11:13

Re: Welche Zahl ist größer 50, kleiner 60 und gerundet 0?
 
Zitat:

Zitat von Sidorion
Tja das ist genau der Grund, warum die Optimization grundsätzlich ausgeschaltet werden sollte. Der Compiler ist auch ohne Optimierung schnell genug und wenn sie an ist, macht er nur Blödsinn, wie z.B.: durchaus sinnvollen Code wegzuoptimieren oder Schindluder mit dem CallStack zu treiben.

Hast Du Fakten, die diese Aussage belegen?

Michael Habbe 12. Jul 2006 11:18

Re: Welche Zahl ist größer 50, kleiner 60 und gerundet 0?
 
Zitat:

Zitat von Sidorion
Tja das ist genau der Grund, warum die Optimization grundsätzlich ausgeschaltet werden sollte. Der Compiler ist auch ohne Optimierung schnell genug und wenn sie an ist, macht er nur Blödsinn, wie z.B.: durchaus sinnvollen Code wegzuoptimieren oder Schindluder mit dem CallStack zu treiben.

Nein, der Optimierer muss nicht ausgeschaltet werden, es sollte nur vom Programmierer auf die Hinweise und Warnungen eingegangen werden, um diese dann zu entfernen.

Ich habe vor Jahren an einem Projekt gearbeitet, wo meine Mitarbeiter und die davor nie auf Warnungen und Hinweise geachtet haben. Als ich dazukam, waren es mittlerweile über 300 :!: , aber es nützt nix, diese zu entfernen, wenn da sonst niemand drauf achtet.

Und diese können böse Auswirkungen haben, zumindest kann man Stunden damit verbringen, Fehler zu suchen, die eigentlich nur in einem kleinen Hinweis verborgen sind. (Dieses Projekt bestand übrigens aus über 250 Formularen)


@angel
Ich sehe Deine Funktion folgendermaßen: Rückgabe eines Feldes, wenn ein bestimmter Wert zw. 50 und 60 liegt:
Zitat:

Zitat von Angel4585
Delphi-Quellcode:
function TForm1.Test : string;
begin
  Result:='';
  with MyZQuery do
  try
    sql.Text:='SELECT * FROM Tabelle';
    Active:=True;
    if (FieldByName(cfGesamtpreis).AsFloat>50.0)and
       (FieldByName(cfGesamtpreis).AsFloat <60.0) then
      Result:=FieldByName(cfID).AsString;
  finally          
    Active:=False;
  end;
end;

[Edit]kleine Korrekturen[/Edit]

Khabarakh 12. Jul 2006 11:26

Re: Welche Zahl ist größer 50, kleiner 60 und gerundet 0?
 
Zitat:

Zitat von Angel4585
Aber könnte man das nicht auch wenigstens dazuschreiben? Da steht zwar das der auf xtest zugewiesene Wert nie verwendet wird, aber adraus kann ich doch nicht darauf schliessen das der wegoptimiert wurde :roll:

Borland ist eben nicht auf die Idee gekommen, dass jemand wirklich versuchen könnte, mit Optimierungen zu debuggen. Im Releasebuild kannst du sie natürlich anschalten, aber beim Debuggen solltest du unbedingt auch entsprechende Projektoptionen einstellen.
Im Grunde genau das gleiche Problem wie hier: Schleife läuft rückwärts


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz