Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit Delphi-Taschenrechner...AccessViolation (https://www.delphipraxis.net/51789-problem-mit-delphi-taschenrechner-accessviolation.html)

sepperl 18. Aug 2005 21:06


Problem mit Delphi-Taschenrechner...AccessViolation
 
Hallo,
ich bin neu hier und auch noch ein Delphi-Anfänger. Ich habe einen kleinen Taschenrechner in Delphi programmiert, leider gibt es bei der Berechnung ein Problem. Ich habe schon mein Buch gewälzt, gegooglet usw. aber keine Lösung gefunden. Vielleicht kann ich euch einfach mal meinen Quelltext hier reinkopieren und ihr könnt mir ein paar Tips geben worans liegen könnte?

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    ZahlButton1: TButton;
    ZahlButton2: TButton;
    ZahlButton3: TButton;
    ZahlButton4: TButton;
    ZahlButton5: TButton;
    ZahlButton6: TButton;
    ZahlButton7: TButton;
    ZahlButton8: TButton;
    ZahlButton9: TButton;
    ZahlButton10: TButton;
    ZahlButton11: TButton;
    OpButton12: TButton;
    OpButton13: TButton;
    OpButton14: TButton;
    OpButton15: TButton;
    Button16: TButton;
    Button17: TButton;
    Button18: TButton;
    procedure ZahlButtonClick(Sender: TObject);
    procedure Button16Click(Sender: TObject);
    procedure OpButtonClick(Sender: TObject);
    procedure Button18Click(Sender: TObject);
    procedure Button17Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  zahl, op: Char;
  index: Integer = 1;
  zahlen, ops: array of String;
  ausgabe, strBuff: String;

implementation

{$R *.dfm}


procedure TForm1.ZahlButtonClick(Sender: TObject);
var i: Integer;
begin
        if Sender = ZahlButton1 then zahl := '1'; if Sender = ZahlButton2 then zahl := '2';
        if Sender = ZahlButton3 then zahl := '3'; if Sender = ZahlButton4 then zahl := '4';
        if Sender = ZahlButton5 then zahl := '5'; if Sender = ZahlButton6 then zahl := '6';
        if Sender = ZahlButton7 then zahl := '7'; if Sender = ZahlButton8 then zahl := '8';
        if Sender = ZahlButton9 then zahl := '9'; if Sender = ZahlButton10 then zahl := '0';
        if Sender = ZahlButton11 then zahl := '.' ;

        strBuff := strBuff + zahl;
        if index = 1 then Edit1.Text := strBuff
        else
        begin
                if index <= 2 then
                ausgabe := zahlen[0] + ops[0]
                else
                begin
                        ausgabe := zahlen[0] + ops[0];
                        for i := 2 to index-1 do
                        begin
                        ausgabe := ausgabe + zahlen[i-1] + ops[i-1];
                        end;
                end;
                Edit1.Text := Concat(ausgabe, strBuff);
        end;

end;
procedure TForm1.Button16Click(Sender: TObject);
begin
        zahlen := nil; ops := nil; index := 1; ausgabe := ''; strBuff := '';
        Edit1.Text := '';
end;

procedure TForm1.OpButtonClick(Sender: TObject);
begin
        if Sender = OpButton12 then op := '+'; if Sender = OpButton13 then op := '-';
        if Sender = OpButton14 then op := '*'; if Sender = OpButton15 then op := '/';


        Edit1.Text := Edit1.Text + op;
        SetLength(zahlen, index);
        SetLength(ops, index);
        zahlen[index-1] := strBuff;
        ops[index-1] := op;
        inc(index);
        strBuff := '';
end;

procedure TForm1.Button18Click(Sender: TObject);
begin
        Form1.Close;
end;

procedure TForm1.Button17Click(Sender: TObject);
var erg, a, b: Double;
    code, i: Integer;
    s: String;
begin
        zahlen[index-1] := strBuff;
        if index > 2 then
        begin
                Val(zahlen[0], a, code);
                erg := a;
                for i := 1 to index-1 do
                begin
                        Val(zahlen[i], b, code);
                        if ops[i-1] = '+' then erg := erg + b;
                        if ops[i-1] = '-' then erg := erg - b;
                        if ops[i-1] = '*' then erg := erg * b;
                        if ops[i-1] = '/' then erg := erg / b;

                end;
                Str(erg:10:2, s);
                Edit1.Text := s;
        end
        else
        begin
                Val(zahlen[0], a, code);
                Val(zahlen[1], b, code);
                erg := a;
                if ops[0] = '+' then erg := erg + b;
                if ops[0] = '-' then erg := erg - b;
                if ops[0] = '*' then erg := erg * b;
                if ops[0] = '/' then erg := erg / b;
                Str(erg:10:2, s);
                Edit1.Text := s;
        end;
end;

end.
Soweit funktioniert der Taschenrechner, nur wenn ich auf das = Zeichen drücke um die Berechnung durchzuführen gibt er mir eine Fehlermeldung aus und zwar eine AccessViolation, der Compiler verweist auf den untersten Bereich mit:

Edit1.Text := s;

Wobei ich nicht glaube, dass der Fehler daran liegt. Wohl eher bei irgendeinem Zugriff auf ein Array...aber wo???
Würde mich sehr freuen, wenn ihr mir weiterhelfen könntet...

Schöne Grüße
Sepperl

Daniel G 18. Aug 2005 21:18

Re: Problem mit Delphi-Taschenrechner...AccessViolation
 
Tu uns bitte einen gefallen, und lade das Project als Anhang hoch. Das würde die Fehlersuche vereinfachen.

Achso:

Willkommen in der DP! :zwinker:

:dp:

sepperl 18. Aug 2005 21:29

Re: Problem mit Delphi-Taschenrechner...AccessViolation
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ok, hier mal die Projektdatei, das müßte reichen, oder?
danke schonmal... :)

Daniel G 18. Aug 2005 21:35

Re: Problem mit Delphi-Taschenrechner...AccessViolation
 
Das Problem fängt schon hier an:

Delphi-Quellcode:
var
zahlen, ops: array of String;
das Problem ist, dass du nirgendwo definiert hast, wie groß das Array ist. Daher geht der Zugriff ins Leere. Daher auch die AV.



Lösung:

Wenn die Länge feststeht (z.B. "10", also 10 Felder), dann kannst du es so machen:

Delphi-Quellcode:
var
zahlen, ops: array[0..9] of String;
Wenn nicht, muss du dem Array mit Delphi-Referenz durchsuchenSetLength() zur Laufzeit eine Länge zuweisen.

//Edit:

Zitat:

Ok, hier mal die Projektdatei, das müßte reichen, oder?
Nein, tut es nicht:

Wir brauchen alle *.pas,*.dpr und *.dfm Dateien, die sich im Projektordner befinden. Am Besten mit einem ZIP - Programm packen.

jfheins 18. Aug 2005 21:47

Re: Problem mit Delphi-Taschenrechner...AccessViolation
 
Zitat:

Zitat von Daniel G
Das Problem fängt schon hier an:

Delphi-Quellcode:
var
zahlen, ops: array of String;
das Problem ist, dass du nirgendwo definiert hast, wie groß das Array ist. Daher geht der Zugriff ins Leere. Daher auch die AV.

[...]

Wenn nicht, muss du dem Array mit Delphi-Referenz durchsuchenSetLength() zur Laufzeit eine Länge zuweisen.

Ich mag mich irren, aber tut er das nicht in Zeile 94 in OpBtnClick (oder so) ?

sepperl 18. Aug 2005 21:49

Re: Problem mit Delphi-Taschenrechner...AccessViolation
 
Liste der Anhänge anzeigen (Anzahl: 1)
also SetLength habe ich gemacht, die Größe beider Arrays wird jedesmal erhöht, wenn eine Operatortaste (+, -, * usw.) gedrückt wird, weil dann anschließend die neu eingegebene Zahl in dem Array gespeichert wird. und die Größe des Arrays steht vorher nicht fest, da ich ja nicht weiß, wieviele Zahlen eingetippt werden.
Aber hier noch die Zip-Datei...

Daniel G 18. Aug 2005 21:59

Re: Problem mit Delphi-Taschenrechner...AccessViolation
 
Ach sch****! Aber der Weg war der richtige!

Delphi-Quellcode:
inc(index); //Zeile 117
klicke ich dann auf eine Zahl und dann auf '=', dann:

Delphi-Quellcode:
zahlen[index-1] := strBuff; /Zeile 131
wenn du mit
Delphi-Quellcode:
SetLength(zahlen, index);
die Größe des Array auf 1 (also zahlen[0..0]) setzt, dann bekommst du in Zeile 131 eine AV, da du index inzwischen um 1 erhöht hast.

Lösung:
Delphi-Quellcode:
SetLength(zahlen, index+1);
Oder nicht? Aber da liegt der Fehler.

sepperl 18. Aug 2005 22:01

Re: Problem mit Delphi-Taschenrechner...AccessViolation
 
Liste der Anhänge anzeigen (Anzahl: 1)
hier der ganze krempel kommentiert, falls es damit leichter fällt den code nachzuvollziehen...

Daniel G 18. Aug 2005 22:03

Re: Problem mit Delphi-Taschenrechner...AccessViolation
 
Das ist die Lösung. Dann geht es:

Delphi-Quellcode:
SetLength(zahlen, index+1);
SetLength(ops, index+1);

sepperl 18. Aug 2005 22:04

Re: Problem mit Delphi-Taschenrechner...AccessViolation
 
@Daniel G:
PERFEKT, Danke dir....das wars, jetzt läufts! und ich such mich halb tot.
:spin2: :spin2: :spin2:
Vielen Dank nochmal Daniel!


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:52 Uhr.
Seite 1 von 2  1 2      

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