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

Aktuelle Zeit: So Jul 13, 2025 01:26

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Von Cpp2Delphi (advanced)
BeitragVerfasst: Do Sep 06, 2007 12:53 
Offline
DGL Member

Registriert: Mi Jan 31, 2007 09:02
Beiträge: 28
Hey ho zusammen,
nachdem im Vorherigen Thread ein paar basics besprochen wurden, würde ich gerne die Community strapazieren und ein paar weitere Fragen stellen und zwar bezüglich Referenzen, Pointer, Funktionpointer und enumerations. Das rührt daher, dass mir noch nicht 100%ig klar ist, wann ein typ via reference und wann via value übergeben wird.
Sagen wir mal wir haben folgende klasse:
Code:
  1.  
  2. C = class(TObject)
  3. public
  4. lab : TLabel;
  5. procedure SetLabel(var l : TLable);
  6. begin
  7. lab := l;
  8. end;
  9. end;
  10.  

(ich bin mir ziemlich sicher, dass das da oben nicht zu komplilieren ist, aber vom prinzip her sollte es klar sein ^^)
Meine Frage: Erhält hier C.lab wirklich die reference des objektes l? Und was passiert wenn ich das keyword 'var' weglasse. Passiert dann genau dasselbe wie mit?

Kommen wir zu den Pointern:
Werden pointer überhaupt noch benutzt? Es gibt das keyword 'unsafe'. Macht es Sinn mit pointern zu arbeiten?

Funktionspointer:
Wie ist es möglich der Klasse C einen Funktionspointer zu übergeben und dann mit einer procedure auszuführen? Ich habe leider auch hier nichts stichhaltiges im Internet gefunden.

Enumerations:
Im vorherigen Thread hab ich die Frage schon gestellt aber ich stell sie hier nochmal, da sie noch nicht beantwortet ist:
Wieso muss ich ein enum immer in einen Integer casten? D.h. folgendes würde nicht gehen:
Code:
  1.  
  2. E = (e1 = 0, e2);
  3. procedure F
  4. var
  5. i : array[0..2] of integer;
  6. begin
  7. i[e1] := 5;
  8. e[e2] := 9;
  9. end;
  10.  

Man muss es stets in ein integer casten:
Code:
  1.  
  2. procedure F
  3. var
  4. i : array[0..2] of integer;
  5. begin
  6. i[Integer(e1)] := 5;
  7. e[Integer(e2)] := 9;
  8. end;
  9.  



Ok das wars erstmal. Ich hoffe der ein oder andere kann mir weiterhelfen. Ob durch eigene erklärung oder link.
Vielen Dank schonmal im Vorraus
Cherio
Woltan


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Von Cpp2Delphi (advanced)
BeitragVerfasst: Do Sep 06, 2007 13:09 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Woltan hat geschrieben:
Meine Frage: Erhält hier C.lab wirklich die reference des objektes l? Und was passiert wenn ich das keyword 'var' weglasse. Passiert dann genau dasselbe wie mit?

In dem Fall kann var weggelassen werden. l: TLable ist im Prinzip nur ein typsisierter Pointer auf die Klasse TLable. Somit hast du TLable schon als Reference.

Woltan hat geschrieben:
Kommen wir zu den Pointern:
Werden pointer überhaupt noch benutzt? Es gibt das keyword 'unsafe'. Macht es Sinn mit pointern zu arbeiten?

Naja, es gibt Stellen wo man mit Pointern arbeiten muss. Die Frage ist nur ob man allgemeine Pointer oder typisierter (PInteger = ^Integer) benutzt.

Woltan hat geschrieben:
Funktionspointer:

Code:
  1.  
  2. type
  3.   TFunction = function(Integer): Integer;
  4.  
  5.   C = class
  6.     func: TFunction;
  7.   end;
  8.  
  9. function abs(i: Integer): Integer;
  10. begin
  11.   if i >= 0 then
  12.     Result := i
  13.   else
  14.     Result := -i;
  15. end;
  16.  
  17. begin
  18.   C.func := @abs;
  19. end;


Man muss nur zwischen Klassenfunkkionen (daher Funktionen die innerhalb einer Klasse definiert sind) sowie allgemeinen Funktionen unterscheiden.

Zitat:
Enumerations

Wurde schon im vorherigen Thread beantwortet ;)

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 06, 2007 14:31 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Um mal Missverständnissen vorzubeugen(ja auch bei Dir, iOnOs :twisted: ): In Delphi herrscht wie auch in C/C++ der Grundsatz CallByValue. Es wird also der Wert des Aufrufparameters in eine lokale Variable kopiert. D.h. der Inhlat der übergebenen Variable ändert sich nicht.
Da aber Instanzvariablen in Delphi ein Doppelleben führen, sind sie implizit Zeiger und werden bei Bedarf implizit dereferenziert. Dies führt dazu, dass bei Objektinstanzen, die übergeben werden sehr wohl die originale Instanz verändert werden kann (kann ich in C ja auch, wenn ich einen Zeiger übergebe). Ich kann quasi Member verändern und der Aufrufer 'merkt' das.
Die übergebene Variable selber ist aber unveränderbar, d.h.ich kann nicht einfach das Objekt freigeben oder Nil zuwesen, da das der Aufrufer nicht mitbekommt (seine Referenz zeigt ins Nirvana). Um dies zu ermöglichen kann ich CallByReference erzwingen, indem ich ein 'var' voanstelle. Tu ich dies, wird auch der Wert der Variable beim Aufrufer verändert.
Weitere Modifikatoren sind noch 'out' und 'const':
'out' signalisiert, dass der Parameter zur Rückgabe dient (Reference). Hier wird sogar ein evtl übergebener Wert gelöscht und steht innerhalb der Funktion nicht zur Verfügung.
'const' bewirkt, dass die übergebene Kopie (Value) innerhalb der Methode nicht veränderbar ist. Es ist quasi zur Konstante geworden und kann weder als Var noch als Out weitergegeben werden.
[edit] Objektinstanzen sind Referenzdatentypen, im Gegensatr zu Wertdatentypen, wie Int oder Char. Das hat mit CallByReference/Value nix zu tun. Die Referenz ist ohne Var sozusagen nicht änderbar, wohl aber das referenzierte Objekt[/edit]

zu Enums: Du kannst neben dem Int-cast auch die Funktion Ord() benutzen. Bei Enums hat der erste immer den Ordinalwert 0, alle weiteren jeweils eins mehr. Rückwärts kommst Du allerdings um den Cast nicht drumrum.

zu Funktionspointern: Offiziell muss in der Deplhilanguage beim Zuweisen ein @ vorangestellt werden, Borland ist hier aber sich selbst untreu geworden und meldet sogar einen Fehler, sodass es eigentlich C.func:=abs; heissen muss. In FPC wird das @ allerdings strikt verlangt (ausser im Delphi-Kompatibilitätsmodus). Klassenmethodentypen werden so definirt:
Code:
  1.  
  2.   Type
  3.      TKlassenmethode=Procedure (ParameterListe: Parametertyp) of Object;
  4. //oder
  5.     TKlassenfunktion=Function(Parameterliste:Parametertyo):Ergebnistyp of Object;
  6.  

Einer Variable eines solchen Typs (Normalerweise Ereignisdelegaten) kann man dann nur eine Methode einer Klasseninstanz zuweisen.

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 07, 2007 13:01 
Offline
DGL Member

Registriert: Mi Jan 31, 2007 09:02
Beiträge: 28
Vielen Dank erstmal für die ausführlichen Erklärungen! Sie haben mir sehr weitergeholfen, und das Projekt an dem ich arbeite nimmt langsam gestallt an. Ich glaube es gilt nur noch ein Delphibezogenes Problem zu lösen. Und das ist jenes:
Code:
  1.  
  2. Link = class(TObject)
  3. public
  4. myLabel : string;
  5. iArray : integer;
  6. construcot Create(s : string; i : integer);
  7. end;
  8.  
  9. Link.Create(s : string; i : integer);
  10. myLabel := s;           //Hier kommt die exception
  11. iArray := i;
  12. end;
  13.  
  14. M = class(TObject)
  15. public
  16. constructor Create;
  17. private
  18. var
  19. linkArray : array[0..32] of Label;
  20. end;
  21.  
  22. M.Create;
  23. var I : integer;
  24. begin
  25. for I := 0 to 32 do linkArray[I].Create('blub', I);
  26. end;
  27.  
  28.  
  29. end.
  30.  


Was mache ich an diesem Beispiel da oben falsch? Warum werden die Elemente von Link nicht mit dem Construktor automatisch allokiert?
Bin für jeden link/tipp dankbar

cherio Woltan


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 07, 2007 13:05 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Das Erstellen einer Klasse geht wie folgt:
Code:
  1. linkArray[I] := TLabelLink.Create('blub', I);

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 07, 2007 13:11 
Offline
DGL Member

Registriert: Mi Jan 31, 2007 09:02
Beiträge: 28
Unglaublich das funktioniert!!!!
Danke für die schnelle Hilfe!

Rock n Roll DGL!!
cherio Woltan


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 07, 2007 13:59 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
.. auch hier liegen Delphi und C++ näher beieinander, als man denkt. In C erstellst Du eine Instanz mit
Code:
  1. new Klassenname(Parameter)
an. Es wird sozusagen die Methode der Klasse gerufen, die genauso heisst und diesen Typ zurückgibt. Du würdest in C doch auch nie schreiben
Code:
  1. Klassenname Variable;
  2. new Variable;
  3.  


In Delphi kann man allerdings seine Konstruktoren nennen, wie man will und deshalb muss hier die Methode mit angegeben werden. Beispiel:
Code:
  1.  
  2. Type
  3.   TFoo=Class(TObject)
  4.     public
  5.      Constructor MeinKonstrukt;
  6.   End;
  7.  
  8. .....
  9. Constructor TFoo.MeinKonstrukt;
  10. Begin
  11.   Inherited Create;
  12.   //tu was;
  13. End;
  14.  
  15. //irgendwo im Code
  16. meineVar:=TFoo.MeinKonstrukt; // legt auch eine Instanz an.
  17.  

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 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.009s | 16 Queries | GZIP : On ]