Warum funktioniert OBJECT und CLASS nicht?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Cybermonkey342
Beiträge: 109
Registriert: Sa 1. Mär 2008, 15:19
OS, Lazarus, FPC: openSUSE Leap 15.6 (FPC 3.2.2) / Windows 11 Pro (FPC 3.2.2)
CPU-Target: x64
Kontaktdaten:

Warum funktioniert OBJECT und CLASS nicht?

Beitrag von Cybermonkey342 »

Hallo allerseits,

bin neu hier im Forum und möchte gleich ein Problem loswerden. (Konnte leider nirgendwo was darüber finden ...) Habe eigentlich ein GUI-Programm geschrieben, das nicht richtig läuft. Um dem Fehler auf die Spur zu kommen, habe ich das Progrämmchen etwas umgewandelt, um es auf der Konsole zu testen. Und siehe da, der Fehler ist reproduzierbar. (Lautet zwar anders, dürfte aber derselbe sein). Zum Besseren Verständnis hier das Originalprogramm, das NICHT läuft:

Code: Alles auswählen

program TestObject;
 
uses crt,sysutils;
 
type TRechteck = CLASS
	//Eigenschaften
	Breite: Single;
	Hoehe: Single;
	//Methoden
	function Flaeche: Single;
	function Umfang: Single;
	procedure Ausgabe;
end;
 
function TRechteck.Flaeche: Single;
begin	
	Result := Breite * Hoehe;
end;
 
function TRechteck.Umfang: Single;
begin	
	Result := 2* (Breite + Hoehe);
end;
 
procedure TRechteck.Ausgabe;
begin
	writeln ('Breite; ',round(Breite), 'Hoehe: ',round(Hoehe));
end;
 
var Rechteck: TRechteck;
 
BEGIN
 
	clrscr;
	writeln ('Bitte Breite eingeben : ');
	 readln (Rechteck.Breite);
	 writeln ('Bitte Hoehe eingeben : ');
	 readln (Rechteck.Hoehe);
 
	writeln (Rechteck.Flaeche);
	writeln (Rechteck.Umfang);
	Rechteck.Ausgabe;	
END.
Abbruch: An unhandled exception occurred at $080481D4 : EAccessViolation : Access violation $080481D4
Direkt nach Eingabe (oder auch Zuweisung ohne Readln) von Rechteck.Breite.
So weit so schlecht. Wenn ich aber bei der Typendeklaration folgendes schreibe:

Code: Alles auswählen

type TRechteck = OBJECT
	//Eigenschaften
	Breite: Single;
	Hoehe: Single;
	//Methoden
	function Flaeche: Single;
	function Umfang: Single;
	procedure Ausgabe;
end;
Dann funktioniert alles wunderprächtig auch beim Lazarus-Programm. Woran kann das liegen? Hat da jemand eine Erklärung für???

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Rechteck:=TRechteck.Create;
//Tu was damit
Rechteck.free;

Schau dir doch mal ein paar Grundlagen zu Object-Pascal an.

Dets
Beiträge: 61
Registriert: Di 11. Sep 2007, 16:59
OS, Lazarus, FPC: Ubuntu Maverick (L 0.9.28.2-10, FPC 2.4.0)
CPU-Target: 32Bit
Wohnort: Lage
Kontaktdaten:

Beitrag von Dets »

Beim ersten Drüberschauen fällt mir im ersten Quellcode auf, dass du keine Instanz von TRechteck erzeugst. Es fehlt also ein

Code: Alles auswählen

Rechteck:=TRechteck.Create;
OBJECT hingegen benötigt nicht zwingend eine Instanz (lese ich gerade hier: http://www.freepascal.org/docs-html/ref ... 6-610005.3" onclick="window.open(this.href);return false; )

greetz, Dets ...

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6857
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

theo hat geschrieben:Schau dir doch mal ein paar Grundlagen zu Object-Pascal an.
Vielleicht LazInfos :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Cybermonkey342
Beiträge: 109
Registriert: Sa 1. Mär 2008, 15:19
OS, Lazarus, FPC: openSUSE Leap 15.6 (FPC 3.2.2) / Windows 11 Pro (FPC 3.2.2)
CPU-Target: x64
Kontaktdaten:

Beitrag von Cybermonkey342 »

Ok, war mein Fehler. Wer lesen kann, ist eindeutig im Vorteil. Nix für ungut ... :D
In JAVA scheint mir das ganze etwas einfacher gelöst zu sein ... Lerne nämlich eigentlich gerade JAVA und wollte ein bisschen mit "Objekten" herumspielen, damit ich ein Gespür dafür bekomme und die Quelltexte in Pascal sind halt doch besser zu lesen ...

Antworten