Access Violation und kein Ende in Sicht
Hallo, wir programmieren in der Schule zur Zeit einen Bruchrechner und dort erhalten meine Mitschüler und ich immer wieder denselben Fehler, die Lehrerin darauf angesprochen, doch sie weiß anscheinend auch keine Lösung und sagt nur "Da ist irgendwo ein Fehler" Nun gut, da wäre ich auch selbst drauf gekommen. :mrgreen: Ich hoffe, dass mir hier vielleicht geholfen werden kann, das Projekt ist zwar jetzt beendet, nur es läuft halt nicht. :(
Das Formular:
Delphi-Quellcode:
Die Unit mBruch:
unit fmBruchrechner;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, mBruch, StdCtrls, mBruchrechner; type TTestBruchrechner = class(TForm) Label1: TLabel; Label2: TLabel; LZaehlerErgebnis: TLabel; LNennerErgebnis: TLabel; EZaehler1: TEdit; ENenner1: TEdit; EZaehler2: TEdit; ENenner2: TEdit; BAddition: TButton; BMultiplikation: TButton; BSubtraktion: TButton; BDivision: TButton; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; BEnde: TButton; BClear: TButton; BDezimalzahl: TButton; LDezimalzahl: TLabel; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure BEndeClick(Sender: TObject); procedure BClearClick(Sender: TObject); procedure setzeEingabe; procedure BAdditionClick(Sender: TObject); private { Private declarations } public hatBruch1:Bruch; hatBruch2:Bruch; hatErgebnisbruch:Bruch; hatBruchrechner:Bruchrechner; end; var TestBruchrechner: TTestBruchrechner; implementation {$R *.dfm} procedure TTestBruchrechner.FormCreate(Sender: TObject); begin hatBruch1.init; hatBruch2.init; hatErgebnisbruch.init; hatBruchrechner.init; end; procedure TTestBruchrechner.FormDestroy(Sender: TObject); begin hatBruch1.gibFrei; hatBruch2.gibFrei; hatErgebnisbruch.gibFrei; hatBruchrechner.gibFrei; end; procedure TTestBruchrechner.BEndeClick(Sender: TObject); begin close; end; procedure TTestBruchrechner.BClearClick(Sender: TObject); begin EZaehler1.Text:=''; ENenner1.Text:=''; EZaehler2.Text:=''; ENenner2.Text:=''; LZaehlerErgebnis.Caption:=''; LNennerErgebnis.Caption:=''; LDezimalzahl.Caption:=''; end; procedure TTestBruchrechner.setzeEingabe; begin hatBruch1.setzeZaehler(StrToInt(EZaehler1.Text)); hatBruch1.setzeNenner(StrToInt(ENenner1.Text)); hatBruch2.setzeZaehler(StrToInt(EZaehler2.Text)); hatBruch2.setzeNenner(StrToInt(ENenner2.Text)); end; procedure TTestBruchrechner.BAdditionClick(Sender: TObject); begin self.setzeEingabe; hatBruchrechner.Addition(hatBruch1, hatBruch2); LZaehlerErgebnis.Caption:=IntToStr(hatErgebnisbruch.gibZaehler); LNennerErgebnis.Caption:=IntToStr(hatErgebnisbruch.gibNenner); end; end.
Delphi-Quellcode:
und die Unit mBruchrechner
unit mBruch;
interface uses Math; type Bruch=class private zZaehler : integer; zNenner : integer; protected public constructor init; procedure setzeZaehler (pZaehler : integer); procedure setzeNenner (pNenner : integer); function gibZaehler : integer; function gibNenner : integer; function gibDezimalzahl : Extended; function ggt(zZaehler,zNenner:integer): integer; procedure ErweitereUm(pFaktor : integer); procedure KuerzeUm(pFaktor : integer); procedure KuerzeVoll; //procedure KehreUm ; destructor gibFrei ; published end; implementation {Bruch} constructor Bruch.init; begin zZaehler:=0; zNenner:=1; end; procedure Bruch.setzeZaehler(pZaehler:integer); begin if zNenner <> 0 then begin zZaehler:=pZaehler; end; end; procedure Bruch.setzeNenner(pNenner:integer); begin if zZaehler <> 0 then begin zNenner:=pNenner; end; end; function Bruch.gibZaehler; begin result:=zZaehler; end; function Bruch.gibNenner; begin result:=zNenner; end; function Bruch.GibDezimalzahl; begin result:= zZaehler/zNenner; end; procedure Bruch.ErweitereUm(pFaktor: integer); begin if pFaktor <> 0 then begin zZaehler:=zZaehler*pFaktor; zNenner:=zNenner*pFaktor; end; end; procedure Bruch.KuerzeUm(pFaktor: integer); begin if (zZaehler mod pFaktor = 0) and (zNenner mod pFaktor = 0) then zZaehler := zZaehler div pFaktor; zNenner := zNenner div pFaktor; end; function Bruch.ggt(zZaehler,zNenner:integer): integer; begin if zZaehler = zNenner then result := zZaehler else result := ggt(min(zNenner,zZaehler), abs(zZaehler-zNenner)); end; procedure Bruch.KuerzeVoll; begin self.KuerzeUm(ggT(zZaehler,zNenner)); end; destructor Bruch.gibFrei; begin end; end.
Delphi-Quellcode:
http://img3.imagebanana.com/img/qq0z...ruchAccess.JPG
unit mBruchrechner;
interface uses mBruch; type Bruchrechner=class private public constructor init; function Addition(pBruch1,pBruch2: Bruch): Bruch; function Subtraktion(pBruch1,pBruch2: Bruch): Bruch; function Multiplikation(pBruch1,pBruch2: Bruch): Bruch; function Division(pBruch1,pBruch2: Bruch): Bruch; destructor gibFrei; end; implementation {Bruch} constructor Bruchrechner.init; begin end; destructor Bruchrechner.gibFrei; begin end; function Bruchrechner.Addition(pBruch1,pBruch2: Bruch): Bruch; begin result:=Bruch.init; result.setzeNenner(pBruch2.gibNenner * pBruch1.gibZaehler); result.setzeZaehler(pBruch1.gibZaehler * pBruch2.gibNenner + pBruch2.gibZaehler * pBruch1.gibNenner); result.KuerzeVoll; end; function Bruchrechner.Subtraktion(pBruch1,pBruch2: Bruch): Bruch; begin result:=Bruch.init; result.setzeNenner(pBruch2.gibNenner * pBruch1.gibZaehler); result.setzeZaehler(pBruch1.gibZaehler * pBruch2.gibNenner - pBruch2.gibZaehler * pBruch1.gibNenner); result.KuerzeVoll; end; function Bruchrechner.Multiplikation(pBruch1,pBruch2: Bruch): Bruch; begin result:=Bruch.init; result.setzeZaehler(pBruch1.gibZaehler * pBruch2.gibZaehler); result.setzeNenner(pBruch1.gibNenner * pBruch2.gibNenner); result.KuerzeVoll; end; function Bruchrechner.Division(pBruch1,pBruch2: Bruch): Bruch; begin result:=Bruch.init; result.setzeZaehler(pBruch1.gibZaehler * pBruch2.gibNenner); result.setzeNenner(pBruch1.gibNenner * pBruch2.gibZaehler); result.KuerzeVoll; end; end. Eventuell hat ja jemand Lust und Zeit und findet den Fehler, die Units sind einem "Lösungs"zettel der Lehrerin entsprechend. Mit freundlichen und um kompetente Hilfe bittenden Grüßen |
Re: Access Violation und kein Ende in Sicht
Einen Constrcutor nennt man i.A. Create und nicht init. Das wäre aber noch egal.
Wichtig ist: Das Instanzieren eines Objektes aus einer Klasse erfolgt mit "myClass:=Tmyclass.create" Also: hatBruch1:=TBruch.init; |
Re: Access Violation und kein Ende in Sicht
Ich hab den Quelltext jetzt nicht angeschaut ober die Adresse (Read of address) deutet darauf hinn das du ein Object nicht erzeugt hast.
|
Re: Access Violation und kein Ende in Sicht
Soll das jetzt Delphi sein oder TurboPascal? :shock:
|
Re: Access Violation und kein Ende in Sicht
Zitat:
Zitat:
|
Re: Access Violation und kein Ende in Sicht
und solange du uns die weiteren Fehler verschweigst können wir auch nur schweigen und nicht helfen :glaskugel:
|
Re: Access Violation und kein Ende in Sicht
So habe ich das jetzt geändert:
Delphi-Quellcode:
Da kommen dann folgende Fehler:
unit fmBruchrechner;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, mBruch, mBruchrechner; type TTestBruchrechner = class(TForm) Label1: TLabel; Label2: TLabel; LZaehlerErgebnis: TLabel; LNennerErgebnis: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; LDezimalzahl: TLabel; EZaehler1: TEdit; ENenner1: TEdit; EZaehler2: TEdit; ENenner2: TEdit; BAddition: TButton; BMultiplikation: TButton; BSubtraktion: TButton; BDivision: TButton; BEnde: TButton; BClear: TButton; BDezimalzahl: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure BEndeClick(Sender: TObject); procedure BClearClick(Sender: TObject); procedure setzeEingabe; procedure BAdditionClick(Sender: TObject); private { Private declarations } public hatBruch1:TBruch.init; hatBruch2:TBruch.init; hatErgebnisbruch:TBruch.init; hatBruchrechner:TBruchrechner.init; end;
Delphi-Quellcode:
[Error] fmBruchrechner.pas(37): Undeclared identifier: 'TBruch'
[Error] fmBruchrechner.pas(37): ',' or ':' expected but ';' found [Error] fmBruchrechner.pas(38): ';' expected but '.' found [Error] fmBruchrechner.pas(39): ';' expected but '.' found [Error] fmBruchrechner.pas(40): Undeclared identifier: 'TBruchrechner' [Error] fmBruchrechner.pas(40): ';' expected but '.' found [Error] fmBruchrechner.pas(41): Type expected but 'END' found [Error] fmBruchrechner.pas(52): Missing operator or semicolon [Error] fmBruchrechner.pas(53): Missing operator or semicolon [Error] fmBruchrechner.pas(54): Missing operator or semicolon [Error] fmBruchrechner.pas(55): Missing operator or semicolon [Error] fmBruchrechner.pas(62): Missing operator or semicolon [Error] fmBruchrechner.pas(63): Missing operator or semicolon [Error] fmBruchrechner.pas(64): Missing operator or semicolon [Error] fmBruchrechner.pas(65): Missing operator or semicolon [Fatal Error] pBruchrechner.dpr(7): Could not compile used unit 'fmBruchrechner.pas' |
Re: Access Violation und kein Ende in Sicht
Du solltest auch etwas mitdenken. Wenn deine Klasse nicht TBruch heißt sondern anders kann er natürlich TBuch auch nicht finden. Der allgemein Syntax heißt einfach:
Delphi-Quellcode:
Klasseninstanz := TKlasse.DerConstructor(eventuelleParameter);
|
Re: Access Violation und kein Ende in Sicht
Zitat:
Delphi-Quellcode:
Fehler:
public
hatBruch1:Bruch.init; hatBruch2:Bruch.init; hatErgebnisbruch:Bruch.init; hatBruchrechner:Bruchrechner.init; end;
Delphi-Quellcode:
[Error] fmBruchrechner.pas(37): ';' expected but '.' found
[Error] fmBruchrechner.pas(38): ';' expected but '.' found [Error] fmBruchrechner.pas(39): ';' expected but '.' found [Error] fmBruchrechner.pas(40): ';' expected but '.' found [Error] fmBruchrechner.pas(41): Type expected but 'END' found [Fatal Error] pBruchrechner.dpr(7): Could not compile used unit 'fmBruchrechner.pas' Oder muss das unter type und nicht unter public? |
Re: Access Violation und kein Ende in Sicht
was dir SirThornBerry sagen will ist das:
Delphi-Quellcode:
public
hatBruch1:Bruch; hatBruch2:Bruch; hatErgebnisbruch:Bruch; hatBruchrechner:Bruchrechner; end; var TestBruchrechner: TTestBruchrechner; implementation {$R *.dfm} procedure TTestBruchrechner.FormCreate(Sender: TObject); begin //myClass := Tmyclass.create //.init = .create hatBruch1 := Bruch.init; hatBruch2 := Bruch.init; hatErgebnisbruch := Bruch.init; hatBruchrechner := Bruchrechner.init; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 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