AGB  ·  Datenschutz  ·  Impressum  







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

Warum erscheint eine Fehlermeldung?

Ein Thema von ThaiSon96 · begonnen am 17. Feb 2014 · letzter Beitrag vom 20. Feb 2014
Antwort Antwort
Seite 1 von 3  1 23      
ThaiSon96

Registriert seit: 7. Mai 2013
11 Beiträge
 
Delphi 7 Personal
 
#1

Warum erscheint eine Fehlermeldung?

  Alt 17. Feb 2014, 19:48
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 = 'Ethen
      writeln(tag,'.',monat,'.',jahr)

  else

    if pcheck = 'Athen
       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ß
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#2

AW: Warum erscheint eine Fehlermeldung?

  Alt 17. Feb 2014, 20:12
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (17. Feb 2014 um 20:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

AW: Warum erscheint eine Fehlermeldung?

  Alt 17. Feb 2014, 20:44
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (17. Feb 2014 um 20:48 Uhr)
  Mit Zitat antworten Zitat
ThaiSon96

Registriert seit: 7. Mai 2013
11 Beiträge
 
Delphi 7 Personal
 
#4

AW: Warum erscheint eine Fehlermeldung?

  Alt 17. Feb 2014, 20:48
Könnt ihr die Mängel bitte etwas genauer erläutern?
Wie oben bereits beschrieben wurde: Das Programm funktioniert.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: Warum erscheint eine Fehlermeldung?

  Alt 17. Feb 2014, 20:51
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Warum erscheint eine Fehlermeldung?

  Alt 17. Feb 2014, 23:00
Eine Instanz erstellen bedeutet in Delphi dass man den Konstruktor, der fast immer 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;
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Warum erscheint eine Fehlermeldung?

  Alt 17. Feb 2014, 23:13
Eine Instanz erstellen bedeutet in Delphi dass man den Konstruktor, der fast immer 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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
ThaiSon96

Registriert seit: 7. Mai 2013
11 Beiträge
 
Delphi 7 Personal
 
#8

AW: Warum erscheint eine Fehlermeldung?

  Alt 18. Feb 2014, 19:23
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#9

AW: Warum erscheint eine Fehlermeldung?

  Alt 18. Feb 2014, 19:43
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#10

AW: Warum erscheint eine Fehlermeldung?

  Alt 18. Feb 2014, 20:27
Im D7 sollte das eigentlich "richtig" funktionieren und müsste gleich am Anfang einen Fehler werfen.
Ich hab in D7 den Code von oben mal getestet - eigenartigerweise geht das wirklich - nur knallte es bei mir einmal gleich nach der Frage:
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
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<

Geändert von Helmi (18. Feb 2014 um 20:33 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 02:53 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