AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Access Violation und kein Ende in Sicht

Ein Thema von HackZu · begonnen am 24. Sep 2008 · letzter Beitrag vom 26. Sep 2008
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#11

Re: Access Violation und kein Ende in Sicht

  Alt 24. Sep 2008, 21:27
es muss so aussehen:
Delphi-Quellcode:
//declaration
public
  variable: KlassenTyp;
[...]
variable := KlassenTyp.ConstructorAufruf(eventuelleParameter);
Oben bei der Declaration haben Funktionsaufrufe und Constructoraufrufe nichts zu suchen. Diese musst du unten im Teil wo der Quelltext plaziert wird plazieren.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#12

Re: Access Violation und kein Ende in Sicht

  Alt 24. Sep 2008, 21:44
hab dir mal zwei fehler im constructor und destructor korrigiert:

Delphi-Quellcode:
UNIT mBruch;

INTERFACE

USES Math;

TYPE
  TBruch = CLASS
  strict 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 TBruch.init;
BEGIN
  inherited create; //nicht vergessen
  zZaehler := 0;
  zNenner := 1;
END;

PROCEDURE TBruch.setzeZaehler(pZaehler: integer);
BEGIN
  IF zNenner <> 0 THEN
  BEGIN
    zZaehler := pZaehler;
  END;
END;

PROCEDURE TBruch.setzeNenner(pNenner: integer);
BEGIN
  IF zZaehler <> 0 THEN
  BEGIN
    zNenner := pNenner;
  END;
END;

FUNCTION TBruch.gibZaehler;
BEGIN
  Result := zZaehler;
END;

FUNCTION TBruch.gibNenner;
BEGIN
  Result := zNenner;
END;

FUNCTION TBruch.GibDezimalzahl;
BEGIN
  Result := zZaehler / zNenner;
END;

PROCEDURE TBruch.ErweitereUm(pFaktor: integer);
BEGIN
  IF pFaktor <> 0 THEN
  BEGIN
    zZaehler := zZaehler * pFaktor;
    zNenner := zNenner * pFaktor;
  END;
END;

PROCEDURE TBruch.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 TBruch.ggt(zZaehler, zNenner: integer): integer;
BEGIN
  IF zZaehler = zNenner THEN
    Result := zZaehler
  ELSE
    Result := ggt(min(zNenner, zZaehler), abs(zZaehler - zNenner));
END;

PROCEDURE TBruch.KuerzeVoll;
BEGIN
  self.KuerzeUm(ggT(zZaehler, zNenner));
END;

DESTRUCTOR TBruch.gibFrei;
BEGIN
  free; //nicht vergessen
END;


END.
du solltest nicht vergessen die gerbten methoden für die initalisierung und freigabe aufzurufen, sonst wirst noch experte mit dem debugger . rekursionen habt ihr ja schon integriert.

ausserdem, sollten klassen resp. typen mit "T" beginnen, damit man weiss was man anfasst.
  Mit Zitat antworten Zitat
HackZu

Registriert seit: 27. Aug 2008
15 Beiträge
 
#13

Re: Access Violation und kein Ende in Sicht

  Alt 24. Sep 2008, 21:48
Zitat von grenzgaenger:
hab dir mal zwei fehler im constructor und destructor korrigiert:
[...]

du solltest nicht vergessen die gerbten methoden für die initalisierung und freigabe aufzurufen, sonst wirst noch experte mit dem debugger . rekursionen habt ihr ja schon integriert.

ausserdem, sollten klassen resp. typen mit "T" beginnen, damit man weiss was man anfasst.
Danke sehr, das Problem ist, dass wir strikt die Vorgaben umsetzen müssen, die die Lehrerin uns gibt. Werde es mal als Verbesserungsvorschlag einbringen.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#14

Re: Access Violation und kein Ende in Sicht

  Alt 24. Sep 2008, 21:50
bitte erstelle für eine neue Frage ein neues Thema damit es hier nicht ein reisen Durcheinander wird wenn sich jemand zur ursprünglichen Frage äußert dann wieder jemand zur nächsten etc. Zudem passt dann der Titel zum Beitrag und man findet das Thema auch besser über die Suche
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
HackZu

Registriert seit: 27. Aug 2008
15 Beiträge
 
#15

Re: Access Violation und kein Ende in Sicht

  Alt 24. Sep 2008, 21:52
Zitat von SirThornberry:
bitte erstelle für eine neue Frage ein neues Thema damit es hier nicht ein reisen Durcheinander wird wenn sich jemand zur ursprünglichen Frage äußert dann wieder jemand zur nächsten etc. Zudem passt dann der Titel zum Beitrag und man findet das Thema auch besser über die Suche
Okay, kein Problem, kannst du den Beitrag dann löschen, nachdem ich das neue Thema erstellt habe?
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#16

Re: Access Violation und kein Ende in Sicht

  Alt 24. Sep 2008, 22:09
das hat nix mit benennung zu tun, sondern, da du über die deklaration type xy = class (...) von einer bestehenden klasse ableitest. das heisst, damit diese ordungsgemäss funktionieren sollte auch immer die geerbte methode ausgeführt werden. i.a.r. mit inherited. da du jedoch andere bezeichnungen verwendetst für den constructor/desctructor geht das über das schlüsselwort nicht mehr...
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#17

Re: Access Violation und kein Ende in Sicht

  Alt 24. Sep 2008, 22:12
Das hier funktioniert zwar ist aber nicht ganz richtig:
Delphi-Quellcode:
DESTRUCTOR TBruch.gibFrei;
BEGIN
  free; //nicht vergessen
END;
besser so:
Delphi-Quellcode:
DESTRUCTOR TBruch.gibFrei;
BEGIN
  inherited Destroy();
END;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#18

Re: Access Violation und kein Ende in Sicht

  Alt 25. Sep 2008, 06:37
Und verwende besser den Standart-Destruktor Destroy
Markus Kinzler
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#19

Re: Access Violation und kein Ende in Sicht

  Alt 26. Sep 2008, 14:29
Der Destructor "Destroy" ist virtuell.
Objekte werden über den Aufruf von "Free" freigegeben.
"Free" ruft intern den Destructor "Destroy" auf.
Deshalb sollten Klassen die einen eigenen Destructor benötigen, immer "Destroy" mit override überschreiben.

Hab noch einen Fehler gefunden:

Delphi-Quellcode:
procedure TTestBruchrechner.BAdditionClick(Sender: TObject);
begin
  self.setzeEingabe;
  hatBruchrechner.Addition(hatBruch1, hatBruch2);
  LZaehlerErgebnis.Caption:=IntToStr(hatErgebnisbruch.gibZaehler);
  LNennerErgebnis.Caption:=IntToStr(hatErgebnisbruch.gibNenner);
end;
richtiger z.B. so:

Delphi-Quellcode:
procedure TTestBruchrechner.BAdditionClick(Sender: TObject);
begin
  setzeEingabe;
  {der alte hatErgebnisbruch wird freigegeben}
  hatErgebnisbruch.Free;
  {eine neue Instanz von Bruch wird erzeugt und hatErgebnisbruch zugewiesen}
  hatErgebnisbruch := hatBruchrechner.Addition(hatBruch1, hatBruch2);
  LZaehlerErgebnis.Caption:=IntToStr(hatErgebnisbruch.gibZaehler);
  LNennerErgebnis.Caption:=IntToStr(hatErgebnisbruch.gibNenner);
end;
  Mit Zitat antworten Zitat
HackZu

Registriert seit: 27. Aug 2008
15 Beiträge
 
#20

Re: Access Violation und kein Ende in Sicht

  Alt 26. Sep 2008, 18:39
Danke, habe es mal geändert, funktioniert einwandfrei.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 12:29 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