Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Jul 09, 2025 20:50

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 22 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: dynArray IN einer Klasse
BeitragVerfasst: Di Feb 03, 2009 22:20 
Offline
DGL Member

Registriert: Mi Nov 12, 2008 18:27
Beiträge: 134
Hallo, ich hab hier nen ernsthaftes Problem :D

Code:
  1. type MO_Aufgabe = class(MO_Kommentar)
  2.  Betreff :shortstring;
  3.  Aufgabe: Array of MO_Aufgabe;
  4.  procedure NeueAufgabe;
  5. end;


Code:
  1.  
  2. procedure MO_Aufgabe.NeueAufgabe;
  3. begin
  4.  setlength(Aufgabe,2);
  5. end;
  6.  


beim aufrufen von setlength kommt es dann zu einer zugriffsverletzung -.-
hatte es ursprünglich mit

setlength(Thema.aufgabe,2) versucht, aber das gab selbiges ergebnis (Thema is instanz der klasse)

ich hab zwar jemanden gefunden der mein problem teilt:
http://www.delphi-forum.de/printview.ph ... fbde217cce

aber da wurde ganz freundlich darüber hinweggegangen und ihm erklärt das er das ja gar nicht braucht :-) .. naja zumindest so ähnlich :roll:

hilfe wäre echt nett

mfg grey


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 04, 2009 01:33 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Hm, also prinzipiell müsste das denk' ich funktionieren.
Standard-Fehler bei Klassen ist wohl, dass die Instanz nicht oder nicht richtig erzeugt wurde.
In deinem Fall:
Code:
  1.  
  2. Thema:=MO_Aufgabe.Create;
  3.  

Wie gesagt das ist der Standard-Fehler und obiges die Standard-Antwort dazu.
Wenn das nicht hilft, kannst du ja mal überprüfen ob die Instanz aus einem anderen Grund nicht richtig erstellt wurde. Oder du versuchst mal statt einem "Array of MO_Aufgabe" einen "Array of Integer" zum Beispiel, wobei mich das überraschen würde wenn das funktioniert. Ob der shortstring etwas damit zu tun haben kann, weiß ich auch nicht, da ich normalerweise nur strings verwende. Im zweifelsfall also mal auskommentieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 04, 2009 09:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Kann Schläfer da nur zustimmen. Ich denke auch, dass du die Klasse nicht ganz richtig erstellst. Bzw falsch benutzt. Es gehört schon einiges dazu um Delphi da aus dem Tritt zu bringen. Ich habe es noch nicht geschafft und ich versuche das seit 12 Jahren. Falls es nicht klappen sollte, dann wäre es das Beste, wenn du ein bisschen mehr Code postest. Also auch die Stellen an denen du NeueAufgabe aufrufst.

Kleine Anmerkung zum Array. Array of MO_Aufgabe oder Array of Integer sind für Delphi ziemlich gleich. Intern ist es nur ein Array auf einen 32 Bit Wert. Allerdings wenn du Klassen benutzt, dann musst du dafür sorgen, dass die Instanzen auch anständig initialisiert werden. Bzw später, dass die Instanzen auch wieder sauber freigegeben werden. Also mit anderen Worten du müsstest die Instanz die du mit MO_Aufgabe.Create; bekommst an die passende Arraystelle packen.

PS: Anstelle eines Arrays kannst du auch eine TList oder eine TObjectList benutzen. Die sind dafür da um eine unbestimmte Anzahl an Pointern oder Klassen aufnehmen zu können. Die Arrayverwaltung würde dann intern in der Klasse passieren. TObjectList besitzt aber auch die Möglichkeit die Instanzen die du hinzugefügt hast auch wieder zu löschen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 04, 2009 11:37 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Was du vorallem nicht vergessen darfst ist, wenn du das Array verlängerst auch die Instanzen in den neu erstellten Feldern zu erstellen. Standardmäßig steht da nämlich irgendein mist drin, was halt gerade in dem Speicherbereich stand, wo das Array gelandet ist.

Du müsstest also für jedes neu angelegte Array-Element auch
Code:
  1. Aufgabe[x] := TMO_Aufgabe.Create

ausführen (wobei x natürlich der Index des neuen Feldes ist).

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 04, 2009 16:06 
Offline
DGL Member

Registriert: Mi Nov 12, 2008 18:27
Beiträge: 134
danke :)

sind genau die beiden fehler gewesen - habs dann heute in der pause doch selbst noch rausgefunden :)

allerdings muss man das mit der zuweisung machen - nur thema.create geht nicht.

vielen dank nochmal

mfg damian


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 04, 2009 16:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
grey hat geschrieben:
allerdings muss man das mit der zuweisung machen - nur thema.create geht nicht.

Das ist vollkommen richtig. Den Konstruktor musst du IMMER mit Klassename.Konstruktor aufrufen. Thema ist ja noch komplett leer. Du musst der Variable erst einmal irgendwas zuweisen. Und dazu solltest du einen Konstruktor aufrufen. Das geht aber nur wenn du weißt welche Klasse du haben willst. Also der Klassennamen muss bekannt sein). Also zum Beispiel TObject.Create. Dort bekommst du dann als Rückgabewert eine Instanz von TObject. Ob Ob du diese jetzt in eine Variable packst oder sonst etwas damit anstellst ist dir überlassen.

PS: Der Konstruktor muss auch nicht zwingend Create heißen. Allerdings empfielt es sich nicht den anders zu benennen. Außer man hat SEHR triftige Gründe.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 04, 2009 16:46 
Offline
DGL Member

Registriert: Mi Nov 12, 2008 18:27
Beiträge: 134
Die da wären ? :D - mir würde spontan nur das ärgern seiner mitmenschen einfallen

werd mal nen projekt-thread eröffnen - wie ihr hier sicherlich gesehn habt (oder auch nicht :lol: ) arbeite ich nämlich grade an einem aufgabenplaner bzw projektmanagement system


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 04, 2009 19:10 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Na, ich habe z.B. den Grund, dass ich bei meinen GUI-Elementen einen Konstruktor für die automatische Erzeugung verbraten muss, die zwar geplant aber noch nicht implementiert ist. Aber den Konstruktor gibt es schon. Dieser Konstruktor heißt „Create“ und übernimmt zwei Parameter. Ich brauche für die händische Erzeugung aber einen zusätzlichen Konstruktor, der viel mehr Parameter aufnehmen muss, der heißt bei mir „CreateExt“, was soviel heißen soll wie „CreateExtended“.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 04, 2009 19:38 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Wenn sich nur die Parameter unterscheiden kann man genauso mit overload arbeiten.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 04, 2009 21:26 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Sie unterscheiden sich auch dadurch, dass das normale Create static ist und das erweiterte Create virtual.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 05, 2009 07:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ja genau. So etwas ist zum Beispiel ein Grund dafür. Bei meiner glBitmap habe ich ca 6-7 Konstruktoren. Alle mittels overload gekennzeichnet nur bei einem sind die Parametertypen mit einem Anderem identisch. Also musste der einen neuen Namen bekommen.

PS: So lange der Grund für dich wichtig genug ist, dann reicht das ja auch schon aus. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 05, 2009 14:41 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Das sollte dich aber nicht am Overload hindern, oder?

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 05, 2009 16:54 
Offline
DGL Member

Registriert: Mi Nov 12, 2008 18:27
Beiträge: 134
*grins ^^

mit overload arbeite ich auch - nur nen neuen namen brauchte ich noch nie :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 05, 2009 17:41 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Folgendes habe ich ausprobiert:
Code:
  1. program project1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. uses
  6.   Classes
  7.  
  8. Type
  9. //********************************************************************
  10.    TTestType = Class(Tobject)
  11.    public
  12.       Constructor Create; Reintroduce; Overload;
  13.       Constructor Create(AName: String); virtual; Overload;
  14.    End;
  15. //********************************************************************
  16.    TTestTypeNew = Class(TTestType)
  17.    public
  18.       Constructor Create(AName: String; AParent: TObject); Reintroduce;
  19.    End;
  20. //********************************************************************
  21. Constructor TTestType.Create;
  22. Begin
  23. End;
  24. //********************************************************************
  25. Constructor TTestType.Create(AName: String);
  26. Begin
  27. End;
  28. //********************************************************************
  29. Constructor TTestTypeNew.Create(AName: String; AParent: TObject);
  30. Begin
  31.    Inherited Create;           // falsch
  32.    Inherited Create(AName);    // richtig
  33. End;
  34. //********************************************************************
  35. Var ATestOBJ: TTestTypeNew; MyObject: TObject;
  36. begin
  37.    MyObject:= TObject.Create;
  38.    ATestOBJ:= TTestTypeNew.Create('BLABLA',MyObject);
  39. end.


Das funktioniert. Allerdings möchte ich so etwas nicht tun.
In dem Konstruktor „TTestTypeNew.Create(AName: String; AParent: TObject);“ muss der richtige geerbete Konstruktor aufgerufen werden. Wenn man jetzt nicht wirklich sattelfest ist (nicht jeder ist immer 100% leistungsfähig), nimmt man den falschen Konstruktor, nämlich den „Create“ ohne Parameter. In meinem Fall würde das zu einem Laufzeitfehler führen. Aus diesem Grund ziehe ich es vor, die Vererbung etwas deutlicher zu machen und einen anderen Namen zu vergeben, OBWOHL Du recht hast und es möglich und zulässig ist, einen überladenen Konstruktor mit dem gleichen Namen zu haben.

Der Compiler kommt nicht durcheinander, zugegeben. Aber ich vielleicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 06, 2009 02:03 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Sensation! Die erste Rekursion in der Deklaration....

...oder hab ich was verpasst?

Code:
  1. type
  2.   NeueKlasse = class
  3.     MeineNeueKlasse : NeueKlasse;
  4.   end;

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 22 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.016s | 17 Queries | GZIP : On ]