Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Warum erscheint eine Fehlermeldung? (https://www.delphipraxis.net/179157-warum-erscheint-eine-fehlermeldung.html)

ThaiSon96 17. Feb 2014 18:48

Warum erscheint eine Fehlermeldung?
 
Hallo,
ich habe ein Programm erstellt, dass ein Datum einliest und auf Wunsch des Benutzers in amerikanischem oder europäischen Format ausgibt. Es funktioniert zwar, aber wenn das Programm geschlossen wird, erscheint eine Fehlermeldung.
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  tDatum = class
    tag, monat, jahr : integer;
    procedure drucke(pcheck:string);
    procedure setze(ptag, pmonat, pjahr: integer);
    procedure loeschen;
    //function xmascheck():boolean;
    function datumcheck():boolean;

    end; // of class

//Implementation-----------------------------------------------------

procedure tDatum.loeschen;
begin
  Tag := 0;
  Monat := 0;
  Jahr := 0;
end;

procedure tDatum.drucke(pcheck:string);
begin
  if datumcheck() then
  begin

    if pcheck = 'E' then
      writeln(tag,'.',monat,'.',jahr)

  else

    if pcheck = 'A' then
       writeln(monat,'/',tag,'/',jahr)

  end
  else writeln('ERROR');
end;

//function tDatum.xmascheck() : boolean;
//begin
  //if (tag = 24) AND (monat = 12) then
    //result := true
  //else
    //result := false;
//end;


Function tdatum.datumcheck(): boolean;
Begin
   If (tag in [1..31]) AND (monat in [1..12]) then
     Result := true
  else
    Result := false
End;


procedure tDatum.setze(ptag, pmonat, pjahr: integer);
begin
  if datumcheck() then
  begin
    tag := ptag;
    monat := pmonat;
    jahr := pjahr;
  end
end;


var
  heute: tDatum;
  check : string;

begin // Hauptprogramm -------


heute.loeschen;
write('Tag: '); readln(heute.tag);
write('Monat: '); readln(heute.monat);
write('Jahr: '); readln(heute.jahr);

heute.setze(heute.tag,heute.monat,heute.jahr);

writeln;
writeln('Amerikanisch (A) oder Europaeisch (E)?');
readln(check);
heute.drucke(check);
readln;
end.
Die Fehlermeldung: "In Projekt C:\<...> \Project1.exe trat ein folgendes Problem mit folgender Meldung auf: 'access violation at 0x7c93a3a2: read of adress 0x000007ea.'. Prozess angehalten. Mit Einzelne Anweisungen oder Start fortsetzen."

Es öffnet sich ein Fenster mit der Überschrift CPU und eine Zeile ist markiert:
7C93A9A2 8B02 mov eax,[edx]

Kann jemand den Grund erkennen?
Gruß

himitsu 17. Feb 2014 19:12

AW: Warum erscheint eine Fehlermeldung?
 
Weil du keine Instanz von deinem tDatum erstellt hast!

Ich wundere mich allerdings nur, daß es nicht gleich in "loeschen" knallt.
Welche Delphi/Lazarus-Version nutzt du denn?



PS: Dein datumcheck in setze "checkt" die falschen Werte.

Und der Code in drucke macht nicht das, was einem die Formatierung versucht einzureden.

Stevie 17. Feb 2014 19:44

AW: Warum erscheint eine Fehlermeldung?
 
Unter Delphi zumindest kann das Programm überhaupt nicht funktionieren.

Du erstellst nämlich an keiner Stelle eine Instanz von TDatum. Und da du eine globale Variable benutzt, welche auf nil initialisiert ist, bekommst du eine Zugriffverletzung in der ersten Zeile der Loeschen Methode. Das sollte der Compiler übrigens mit der Warnung "Variable nicht initialisiert" quittieren.

ThaiSon96 17. Feb 2014 19:48

AW: Warum erscheint eine Fehlermeldung?
 
Könnt ihr die Mängel bitte etwas genauer erläutern?
Wie oben bereits beschrieben wurde: Das Programm funktioniert.

Stevie 17. Feb 2014 19:51

AW: Warum erscheint eine Fehlermeldung?
 
Zitat:

Zitat von ThaiSon96 (Beitrag 1248273)
Könnt ihr die Mängel bitte etwas genauer erläutern?
Wie oben bereits beschrieben wurde: Das Programm funktioniert.

Objekte kann man nicht einfach benutzen, ohne eine Instanz davon zu erstellen, da sonst kein Speicher für die Felder allokiert wurde. Entweder knallt es direkt (wie es hier eigentlich sollte) oder du schreibst wild auf irgendnem Speicher rum - entweder merkst du es nicht, oder du bekommst irgendwann später die Quittung, wie scheinbar in deinem Fall, beim Beenden - ich würde das nicht "funktionieren" nennen :)

P.S. Du bist uns immer noch die benutzte Delphi Version schuldig - eventuell können wir uns dann das von unseren Erwartungen abweichende Verhalten erklären.

sx2008 17. Feb 2014 22:00

AW: Warum erscheint eine Fehlermeldung?
 
Eine Instanz erstellen bedeutet in Delphi dass man den Konstruktor, der fast immer
Delphi-Quellcode:
Create
heisst, explizit aufrufen muss:
Delphi-Quellcode:
var
  heute: tDatum;
  check : string;
begin // Hauptprogramm -------
  heute := tDatum.Create; // Konstruktor aufrufen, dieser liefert eine neue Instanz (ein Objekt) zurück
  heute.loeschen;
  ...
  // und ganz zum Schluss muß man das Objekt wieder freigeben
  heute.Free;
end;

Sir Rufo 17. Feb 2014 22:13

AW: Warum erscheint eine Fehlermeldung?
 
Zitat:

Zitat von sx2008 (Beitrag 1248283)
Eine Instanz erstellen bedeutet in Delphi dass man den Konstruktor, der fast immer
Delphi-Quellcode:
Create
heisst, explizit aufrufen muss:
Delphi-Quellcode:
var
  heute: tDatum;
  check : string;
begin // Hauptprogramm -------
  heute := tDatum.Create; // Konstruktor aufrufen, dieser liefert eine neue Instanz (ein Objekt) zurück
  heute.loeschen;
  ...
  // und ganz zum Schluss muß man das Objekt wieder freigeben
  heute.Free;
end;

Korrekterweise erstellt der Konstruktor eine Instanz und liefert eine Referenz zur Instanz (Zeiger auf den Speicherbereich der Instanz) zurück.

ThaiSon96 18. Feb 2014 18:23

AW: Warum erscheint eine Fehlermeldung?
 
Vielen Dank für die nachvollziehbaren Erklärungen!
Ich habe nochmal meinen Lehrer gefragt und er meinte, dass wir das noch nicht wissen können...
Benutze Delphi 7, aber es hat sich ja erledigt

himitsu 18. Feb 2014 18:43

AW: Warum erscheint eine Fehlermeldung?
 
Der bringt euch den Aufbau von Klassen bei, aber den wichtigstens Teil nicht als Erstes?

Deine Version kannst du auch direkt im Profil angeben, dann wird es nicht mehr vergessen und ist immer gleich erkenntlich.
(und in einigen Unterforen könnte man das nochmal zusätzlich im neuen Thema/Thread angeben ... für die mit mehreren Versionen)




Im D7 sollte das eigentlich "richtig" funktionieren und müsste gleich am Anfang einen Fehler werfen. :gruebel:

Helmi 18. Feb 2014 19:27

AW: Warum erscheint eine Fehlermeldung?
 
Zitat:

Zitat von himitsu (Beitrag 1248418)
Im D7 sollte das eigentlich "richtig" funktionieren und müsste gleich am Anfang einen Fehler werfen. :gruebel:

Ich hab in D7 den Code von oben mal getestet - eigenartigerweise geht das wirklich - nur knallte es bei mir einmal gleich nach der Frage:
Delphi-Quellcode:
writeln('Amerikanisch (A) oder Europaeisch (E)?');
und der darauf folgenden Eingabe A und einmal am Ende vom Programm

Unter XE2 knallt's gleich nach dem Start vom Programm: Computer sagt Nein

himitsu 18. Feb 2014 23:05

AW: Warum erscheint eine Fehlermeldung?
 
Der Debugger (oder ein Test ala
Delphi-Quellcode:
if Assigned(heute) then Beep;
oder
Delphi-Quellcode:
Assert(not Assigned(heute));
) meint aber dennoch, daß die Variable NIL ist, oder hat die doch irgendeinen Inhalt?


Beim ODER hängt es dann davon ab, ob und worauf "zufällig" der Wert zeigt,
also ob es überhaupt und wenn ja wann es knallt.

Helmi 19. Feb 2014 07:26

AW: Warum erscheint eine Fehlermeldung?
 
Bei
Delphi-Quellcode:
if Assigned(heute) then Beep;
pieps

und bei
Delphi-Quellcode:
Assert(not Assigned(heute));
) kommt folgende Fehlermeldung:

Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project2.exe ist eine Exception der Klasse EAssertionFailed aufgetreten. Meldung: 'Assertion fehlges (E:\Delphi 7\_TEST-PROJEKT_\Project2.dpr, Zeile 84)'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------

Stevie 19. Feb 2014 08:48

AW: Warum erscheint eine Fehlermeldung?
 
Autsch, dann wird bei D7 wohl die globale Variable nicht initialisiert, wie bei späteren Versionen.

DeddyH 19. Feb 2014 09:07

AW: Warum erscheint eine Fehlermeldung?
 
Sieht so aus. Nun weiß ich auch, wieso man sie früher ggf. direkt bei der Deklaration initialisiert hat.

Der schöne Günther 19. Feb 2014 10:13

AW: Warum erscheint eine Fehlermeldung?
 
Barry Kelly meint
Zitat:

You can depend on global variables being zero-initialized.
Dieser elende Schuft.

himitsu 19. Feb 2014 10:23

AW: Warum erscheint eine Fehlermeldung?
 
Tja, und ich dachte sei im Delphi schon immer so. :stupid:

Da kann der T.E. "froh sein, daß der Zeiger zufällig auf was zeigte.
Nur blöd, daß es was Wichtiges war, was da überschrieben wurde (fast wie ein BufferOverrun) und das dann am Ende kaputt war, als es freigegeben werden sollte.


Aber wer verwendet schon globale Variablen? Kein Wunder, wenn man das alte Verhalten nicht bemerkt. :roll:

Zitat:

Zitat von DeddyH (Beitrag 1248473)
Sieht so aus. Nun weiß ich auch, wieso man sie früher ggf. direkt bei der Deklaration initialisiert hat.

Stimmt ja, globale Variablen kann man ja, wie Konstanten, mit einem Initialwert vorbelegen. (hab ich mir für Lokale und Felder auch schonmal gewünscht :cry:)

Stevie 19. Feb 2014 15:49

AW: Warum erscheint eine Fehlermeldung?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1248484)
Barry Kelly meint
Zitat:

You can depend on global variables being zero-initialized.
Dieser elende Schuft.

Das hat er 2008 geschrieben, da war das vermutlich schon so. :)

Zitat:

Zitat von himitsu (Beitrag 1248490)
Tja, und ich dachte sei im Delphi schon immer so. :stupid:

Ich auch - und sollte auch so sein. Ich denke, das war ein Bug.
In "Delphi in a Nutshell" (von 2000 - also Delphi 5 Ära) heißt es auf Seite 395:
Zitat:

Without an initial value, a global variable is initialized to zero (empty string, nil pointer, etc.)
Witzigerweise gibt es trotzdem noch eine Warnung auf eine nicht initialisierte Variable, die ja eigentlich nicht kommen sollte, denn sie ist ja initialisiert :stupid:

p80286 20. Feb 2014 10:37

AW: Warum erscheint eine Fehlermeldung?
 
Zitat:

Zitat von DeddyH (Beitrag 1248473)
Sieht so aus. Nun weiß ich auch, wieso man sie früher ggf. direkt bei der Deklaration initialisiert hat.

Wenn man sich nicht darauf verlassen will, daß irgendjemand das erledigt, macht man es selbst!

Gruß
K-H

DeddyH 20. Feb 2014 10:40

AW: Warum erscheint eine Fehlermeldung?
 
Da ich schon länger keine globalen Variablen mehr verwende, ist mir das auch unter Delphi 7 nicht aufgefallen.

himitsu 20. Feb 2014 10:49

AW: Warum erscheint eine Fehlermeldung?
 
Zitat:

Zitat von DeddyH (Beitrag 1248729)
ist mir das auch unter Delphi 7 nicht aufgefallen.

Gäbe es TDE noch, wäre das Problem bestimmt schon weg. :roll:

p80286 20. Feb 2014 10:52

AW: Warum erscheint eine Fehlermeldung?
 
Ich meinte alle nicht nur globale Variablen.

Gruß
K-H


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