Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi EInvalidOp bei Gleitkomma-Operation (https://www.delphipraxis.net/63068-einvalidop-bei-gleitkomma-operation.html)

Calle 13. Feb 2006 17:05


EInvalidOp bei Gleitkomma-Operation
 
Ich benutze ja nur äußerst selten um probleme beim Programmieren zu lösen aber das verwirrt mich doch ZU sehr...

bei folgendem Code tritt ein EInvalidOp auf... wobei mich wundert was er an normaler Division nicht kennt... ich hab nun schon alle werte wo es möglich war durch round() in Integer Werte umgeformt aber es will nicht funktionieren...
vorher hatte ich die quersum-Prozedur noch mit parameterübergabe...aber als es nicht funktionierte hab ich das dann auch geändert aber es half alles nichts...

zum verständinss was das prog überhaupt macht: es soll diejenigen Zahlen ausgeben wo die summe der Quersummen zweier Zahlen gleich der Quersumme der Summe zweier zaheln ist... fragt nicht warum ich das tue...fand ich einfach nur interessant ^^

Delphi-Quellcode:
type
  TForm2 = class(TForm)
    QA_Ausgabe: TLabel;
    AQ_Ausgabe: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    Gauge1: TGauge;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;
  zahl,quer1:real;
  x,y,z,AQ_summe,QA_Summe:integer;

implementation

{$R *.dfm}

Procedure quersum;
Var j,laenge:integer;
    ziff1,ziffer1: array [0..100] of real;
    strzahl:string;
Begin
  strzahl:=FloatToStr(zahl);
  laenge:=length(strzahl);
  for j:=1 to laenge do
    begin                          //aufspalten der Zahl in einzelne Ziffern
      zahl:=zahl/10;
      ziffer1[j]:=frac(zahl);
      zahl:=trunc(zahl);
      ziff1[j]:=ziffer1[j]*10;
    end;
  quer1:=0;
  while j<>0 do
  begin
    quer1:=ziff1[j]+quer1;
    j:=j-1;
  end;
End;

Procedure QuersummenAddition;
Var x_quer,y_quer:real;
Begin
  zahl:=x;
  quersum;
  x_quer:=quer1;
  zahl:=y;
  quersum;
  y_quer:=quer1;
  QA_Summe:=round(x_quer)+round(y_quer);
end;

Procedure AdditionDerQuersumme;
Begin
  zahl:=x+y;
  quersum;
  AQ_Summe:=round(quer1);
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  z:=round(StrToInt(edit1.Text));
  y:=10;
  x:=10;
  repeat
    begin
    y:=y+1;
    x:=10;
    Gauge1.Progress:=round((y div z)*100);
    repeat
      begin
      x:=x+1;
      QuersummenAddition;
      AdditionDerQuersumme;
      if round(QA_Summe)=round(AQ_Summe) then      
        begin
          QA_Ausgabe.Caption:= FloatToStr(QA_Summe);
          AQ_Ausgabe.Caption:= FloatToStr(AQ_Summe);
        end;
      end;
    until x=z;
    end;
   until y=z;

end;

end.
nebenbei ewähnt bin ich in delphi noch anfänger als seit nicht zu hart ;)

shmia 13. Feb 2006 18:12

Re: EInvalidOp bei Gleitkomma-Operation
 
Du brauchst als Erstes mal eine Funktion, die ganz sauber und adrett die Quersumme einer
Zahl berechnet:
Delphi-Quellcode:
{*
 * Berechne die Quersumme aus einer Zahl x
 * z.B.: Quersumme von 1234 ist 10
 *}
function QuerSumme(x:Longint):integer;
begin
  Result := 0;
  while x > 0 do
  begin
    Result := Result + (x mod 10);
    x := x div 10;
  end;
end;
Quersummen kann man nur von ganzzahligen Zahlen errechnen.
Und nun eine Funktion, die überprüft, ob Quersumme(A)+Quersumme(B)=Quersumme(A+B) ist:
Delphi-Quellcode:
function QuersummenCheck(A, B: Longint):boolean;
begin
   Result := (QuerSumme(A)+QuerSumme(B) = QuerSumme(A+B));
end;

Calle 13. Feb 2006 21:14

Re: EInvalidOp bei Gleitkomma-Operation
 
das ist natürlich ne sehr schöne funktion :)
und um so viel simpler...und umgeht das problem mit dem Gleitkommazahlen...
funktioniert jetzt auch..

trotzdem würde ich gern wissen warum er bei einer für gleitkomma geeigneten Operation diese EInvalidOp error erzeugt...

Christian Seehase 13. Feb 2006 21:39

Re: EInvalidOp bei Gleitkomma-Operation
 
Moin Calle,

an welcher Stelle tritt denn der Fehler auf?
(ggf. mal mit Single-Step ermitteln, F7)

Calle 14. Feb 2006 15:22

Re: EInvalidOp bei Gleitkomma-Operation
 
sorry..hatte ich vergessen zu erwähnen...

beim standard-Compilieren mit F9 gibt er mir nur die Fehlermeldung raus und fertig...eigentlich sollte er mir ja die Stelle anzeigen wo das aufgetreten ist aber macht er nich..

dann hab ich jetzt mal mit F7 die einzelnen Routinen durchgehen lassen aber entweder bin ich zu doof oder da stimmt grundsätzlich was nich..
erst markiert er mir das begin im Program
Delphi-Quellcode:
begin // hier markiert er
  Application.Initialize; // hier nochmal später,siehe unten
  Application.CreateForm(TForm2, Form2); // und das noch ein wenig später...
  Application.Run;
end.
dann drück ich nochmal F7 und er sagt dass er eine Quelldatei namens gauge.pas nicht gefunden hat (OK, ich hab nen Gauge drin aber deswegen brauch ich ja noch keine Quelldatei..)
nach drücken von Ignorieren und nach weiterem F7 drücken markiert er mir das "end." am ende der Unit...
weitere F7's später markiert er mir
Application.Initialize;
und
Application.CreateForm(TForm2, Form2);

und danach geht er nur noch die einzelnen Routinen im CPU-Fenster durch...

alles in allem wenig hilfreich...


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:23 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