TArray

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TArray

Beitrag von mse »

m.fuchs hat geschrieben:Das geht erst seitdem Advanced Records eingeführt wurden. Wo bitte soll das denn davor schon gegangen sein?

Mit Objekten:
https://www.freepascal.org/docs-html/cu ... x59-770005
In MSElang spielen Objekte wieder eine wichtige Rolle.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TArray

Beitrag von Socke »

mse hat geschrieben:
m.fuchs hat geschrieben:Das geht erst seitdem Advanced Records eingeführt wurden. Wo bitte soll das denn davor schon gegangen sein?

Mit Objekten:
https://www.freepascal.org/docs-html/cu ... x59-770005
In MSElang spielen Objekte wieder eine wichtige Rolle.

Der Vorteil von Records mit Typehelper gegenüber Objekten ist die volle Kontrolle über die Speicherbelegung (Byte Alignment). Das ist insbesondere beim Austausch mit Fremdbibliotheken wichtig. Bei Objekten hast du immer die VMT, die dir dafür virtuelle Methoden erlaubt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2634
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TArray

Beitrag von m.fuchs »

mse hat geschrieben:
m.fuchs hat geschrieben:Das geht erst seitdem Advanced Records eingeführt wurden. Wo bitte soll das denn davor schon gegangen sein?

Mit Objekten:

Bitte genauer lesen: es geht um Records.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TArray

Beitrag von mse »

Socke hat geschrieben:Der Vorteil von Records mit Typehelper gegenüber Objekten ist die volle Kontrolle über die Speicherbelegung (Byte Alignment). Das ist insbesondere beim Austausch mit Fremdbibliotheken wichtig. Bei Objekten hast du immer die VMT, die dir dafür virtuelle Methoden erlaubt.

AFAIK haben nur Objekte mit virtuellen Methoden eine VMT, auf jeden Fall wird es in MSElang so gemacht. Sonst sind sie normale records, welche auch auf dem stack oder im globalen Memory angelegt werden können. Dass Borland Objekte nach der Einführung von Klassen ("class", "TObject") stiefkindlich behandelte, hat weitgehend Marketing-Gründe. Später konnten die Borland Nachfolger dann nicht mehr zurück und haben stattdessen advanced records eingeführt. Vielleicht haben sie auch einfach vergessen, dass es bereits "object" gibt...

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TArray

Beitrag von mse »

m.fuchs hat geschrieben:
mse hat geschrieben:
m.fuchs hat geschrieben:Das geht erst seitdem Advanced Records eingeführt wurden. Wo bitte soll das denn davor schon gegangen sein?

Mit Objekten:

Bitte genauer lesen: es geht um Records.

Vielleicht verwechselst du "class"/"TObject" mit "object"?

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

Re: TArray

Beitrag von theo »


Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2634
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TArray

Beitrag von m.fuchs »

mse hat geschrieben:
m.fuchs hat geschrieben:
mse hat geschrieben:Mit Objekten:

Bitte genauer lesen: es geht um Records.

Vielleicht verwechselst du "class"/"TObject" mit "object"?

Nein, verwechsele ich nicht. Die Frage drehte sich aber tatsächlich um Records. Bitte also nicht die guten alten Objekte mit hineinwerfen. Danke.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TArray

Beitrag von mse »

m.fuchs hat geschrieben:Nein, verwechsele ich nicht. Die Frage drehte sich aber tatsächlich um Records. Bitte also nicht die guten alten Objekte mit hineinwerfen. Danke.

Dann hat Pluto vielleicht "record" mit "object" verwechselt. Ich bitte viel mal um Entschuldigung, wenn ich dich beleidigt habe, das war nicht beabsichtigt.
Es ändert nichts daran, dass "object" und "advanced records" sich überlappen und viele Leute das nicht wissen.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TArray

Beitrag von pluto »

Dann hat Pluto vielleicht "record" mit "object" verwechselt. Ich bitte viel mal um Entschuldigung, wenn ich dich beleidigt habe, das war nicht beabsichtigt.

Nein, ich meinte auch record's mit objects habe ich noch nie gearbeitet....
MFG
Michael Springwald

Mathias
Beiträge: 6146
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TArray

Beitrag von Mathias »

wp_xyz hat geschrieben:
m.fuchs hat geschrieben:Aber erstens ist das nun wirklich nicht unübersichtlicher als Klammerei.

Ich mag die Dinger ja auch nicht, aber ich muss zugeben, dass der verkettete Aufruf deutlich übersichtlicher sein kann als verschachtelte Prozedur/Funktionsaufrufe, nämlich wenn zusätzliche Parameter im Spiel sind.

Nehmen wir das Beispiel von oben mit der Matrix-Rotation. Da wird der Typehelper .Rotate wahrscheinlich mit drei Parametern für die Drehwinkel um die drei Raumachsen aufgerufen werden, also

Code: Alles auswählen

  Matrix.Rotate(alpha, beta, gamma)

Der klassische Funktionsaufruf wäre entsprechend

Code: Alles auswählen

  Matrix2 := Rotate(Matrix, alpha, beta, gamma);

Sowie noch unentschieden. Interessant wird's aber, wenn man nach der Rotation noch eine Translation durchführen möchte, die ihrerseits auch wieder drei Parameter dx, dy, dz hat:

Code: Alles auswählen

  Matrix.Translate(dx, dy, dz);
// bzw als klassische Funktion
  Matrix2 := Translate(Matrix, dx, dy, dz);

Wenn man die beiden Operationen nun hintereinanderausführt, zuerst die Rotation, dann die Translation, sieht der Typehelper-Aufruf so aus, schön von links nach rechts, und die Parameter direkt bei der Methode:

Code: Alles auswählen

  Matrix.Rotate(alpha, beta, gamma).Translate(dx, dy, dz)

Der klassiche Aufruf ist dagegen das reinste Chaos, weil man die Zeile sowohl von vorne als auch von hinten lesen muss und die Parameter des außeren Aufrufs durch den inneren Aufruf abgetrennt werden:

Code: Alles auswählen

  Matrix := Translate(Rotate(Matrix, alpha, beta, gamma), dx, dy, dz)

Nur wird es das bei mir nicht geben, da Rotate und Translation proceduren sind, welche Self verändern.

Beispiel:

Code: Alles auswählen

procedure Tmat3x3Helper.Translate(x, y: single);
begin
  Self[2, 0] := Self[2, 0] + x;
  Self[2, 1] := Self[2, 1] + y;
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: TArray

Beitrag von marcov »

wp_xyz hat geschrieben:Der klassiche Aufruf ist dagegen das reinste Chaos, weil man die Zeile sowohl von vorne als auch von hinten lesen muss und die Parameter des außeren Aufrufs durch den inneren Aufruf abgetrennt werden:

Code: Alles auswählen

  Matrix := Translate(Rotate(Matrix, alpha, beta, gamma), dx, dy, dz)


Ja. Mann soll Mathe unbedingt neu formulieren mit Objecte! :roll:
Zuletzt geändert von m.fuchs am Sa 26. Mai 2018, 00:51, insgesamt 1-mal geändert.
Grund: Zitat korrigiert

Mathias
Beiträge: 6146
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TArray

Beitrag von Mathias »

Ich habe gerade eine Merkwürdige Deklaration entdeckt:

Code: Alles auswählen

type
  Ta = array[(a, b, c, d)] of byte;
var
  m:Ta;
begin
  m[a]:=123;
  m[b]:=456;


Dies wird anstandslos kompiliert. :roll:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TArray

Beitrag von pluto »

Dies wird anstandslos kompiliert.

Wusste gar nicht, dass sowas geht? Aber warum auch nicht?
Ich nehme an, Buchstaben werden intern auch als Zahlen gehandhabt?
MFG
Michael Springwald

Mathias
Beiträge: 6146
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TArray

Beitrag von Mathias »

Wusste gar nicht, dass sowas geht? Aber warum auch nicht?

Auch als eingefleischter Pascal-Freaks entdeckt man immer wieder was neues. :wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TArray

Beitrag von pluto »

Auch als eingefleischter Pascal-Freaks entdeckt man immer wieder was neues.

Die Sorucen von Lazarus&FPC sind schon eine ware Goldgrube...
MFG
Michael Springwald

Antworten