AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Problem mit Delphi-Taschenrechner...AccessViolation
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Delphi-Taschenrechner...AccessViolation

Ein Thema von sepperl · begonnen am 18. Aug 2005 · letzter Beitrag vom 18. Aug 2005
Antwort Antwort
Seite 1 von 2  1 2      
sepperl

Registriert seit: 18. Aug 2005
5 Beiträge
 
#1

Problem mit Delphi-Taschenrechner...AccessViolation

  Alt 18. Aug 2005, 22:06
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
  Mit Zitat antworten Zitat
Daniel G
(Gast)

n/a Beiträge
 
#2

Re: Problem mit Delphi-Taschenrechner...AccessViolation

  Alt 18. Aug 2005, 22:18
Tu uns bitte einen gefallen, und lade das Project als Anhang hoch. Das würde die Fehlersuche vereinfachen.

Achso:

Willkommen in der DP!

  Mit Zitat antworten Zitat
sepperl

Registriert seit: 18. Aug 2005
5 Beiträge
 
#3

Re: Problem mit Delphi-Taschenrechner...AccessViolation

  Alt 18. Aug 2005, 22:29
Ok, hier mal die Projektdatei, das müßte reichen, oder?
danke schonmal...
Angehängte Dateien
Dateityp: dpr project1_748.dpr (206 Bytes, 5x aufgerufen)
  Mit Zitat antworten Zitat
Daniel G
(Gast)

n/a Beiträge
 
#4

Re: Problem mit Delphi-Taschenrechner...AccessViolation

  Alt 18. Aug 2005, 22:35
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.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#5

Re: Problem mit Delphi-Taschenrechner...AccessViolation

  Alt 18. Aug 2005, 22:47
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) ?
  Mit Zitat antworten Zitat
sepperl

Registriert seit: 18. Aug 2005
5 Beiträge
 
#6

Re: Problem mit Delphi-Taschenrechner...AccessViolation

  Alt 18. Aug 2005, 22:49
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...
Angehängte Dateien
Dateityp: zip taschenrechner_245.zip (198,3 KB, 5x aufgerufen)
  Mit Zitat antworten Zitat
Daniel G
(Gast)

n/a Beiträge
 
#7

Re: Problem mit Delphi-Taschenrechner...AccessViolation

  Alt 18. Aug 2005, 22:59
Ach sch****! Aber der Weg war der richtige!

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

zahlen[index-1] := strBuff; /Zeile 131 wenn du mit
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:
SetLength(zahlen, index+1); Oder nicht? Aber da liegt der Fehler.
  Mit Zitat antworten Zitat
sepperl

Registriert seit: 18. Aug 2005
5 Beiträge
 
#8

Re: Problem mit Delphi-Taschenrechner...AccessViolation

  Alt 18. Aug 2005, 23:01
hier der ganze krempel kommentiert, falls es damit leichter fällt den code nachzuvollziehen...
Angehängte Dateien
Dateityp: zip taschenrechner2_176.zip (200,8 KB, 20x aufgerufen)
  Mit Zitat antworten Zitat
Daniel G
(Gast)

n/a Beiträge
 
#9

Re: Problem mit Delphi-Taschenrechner...AccessViolation

  Alt 18. Aug 2005, 23:03
Das ist die Lösung. Dann geht es:

Delphi-Quellcode:
SetLength(zahlen, index+1);
SetLength(ops, index+1);
  Mit Zitat antworten Zitat
sepperl

Registriert seit: 18. Aug 2005
5 Beiträge
 
#10

Re: Problem mit Delphi-Taschenrechner...AccessViolation

  Alt 18. Aug 2005, 23:04
@Daniel G:
PERFEKT, Danke dir....das wars, jetzt läufts! und ich such mich halb tot.

Vielen Dank nochmal Daniel!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:16 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