TArray

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TArray

Beitrag von Mathias »

Der Nachteil ist m.E., dass die Typehelper ja nicht zum Standardumfang von Pascal gehören, sondern selbst erst mal programmiet werden mussten

IntToStr ist auch eine programmierte Funktion.

Ich benutze die Typen Helper auch sehr gerne, bei den Vektoren und Matrizen eine sehr übersichtliche Sache.
So nebenbei ist eine recht schnelle Eingabe mit den "." Funktionen möglich. Man drückt einen "." hinter der Variable und es wird gelistet, was alles möglich ist.

Und wer jammert, der Compiler sei zu langsam, der soll C nehmen, da bekommt man einen Geschwindigkeitsrausch. :mrgreen: :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 »

Das alles nur, weil manche Leute unbedingt Pascal zu Javascript machen möchten und weil diese Schreibweise nun halt mal "modern" ist. Aber das Jammern hilft nichts: Die Dinger sind nun mal da und werden nicht mehr verschwinden.

Das ist das Problem... Pacal ist nun mal nicht Java bzw. C++. Wer Java Programmieren möchte, muss halt Java Nutzen....
MFG
Michael Springwald

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
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 »

Das ist doch Unfug, die Schreibweise mit dem Punkt ist doch nichts Neues in Pascal. Das gibt es seit Einführung der Objektorientierten Programmierung.
Neu ist ja nur, dass diese Typehelper dazugekommen sind, die es so aussehen lassen als ob "normale" Variablen auch Objekte wären.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

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 »

Das ist doch Unfug, die Schreibweise mit dem Punkt ist doch nichts Neues in Pascal. Das gibt es seit Einführung der Objektorientierten Programmierung.
Neu ist ja nur, dass diese Typehelper dazugekommen sind, die es so aussehen lassen als ob "normale" Variablen auch Objekte wären.

Das was wir meinen ist: Das "Normle" Funktionen/Proceduren nun aufeinmal "Methoden" sind von entsprechenden Datentypen.

Somit müsste "Integer" ein Objekt/Klasse sein. Genau wie String und co...
MFG
Michael Springwald

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

Re: TArray

Beitrag von Mathias »

die Schreibweise mit dem Punkt ist doch nichts Neues in Pascal. Das gibt es seit Einführung der Objektorientierten Programmierung.

Hat es den vorher nicht schon bei den Record gegeben ?

Das was wir meinen ist: Das "Normle" Funktionen/Proceduren nun aufeinmal "Methoden" sind von entsprechenden Datentypen.

Das ist so, aber es macht dadurch vieles um einiges einfacher und übersichtlicher.

Wen man dieses Ausschnitt aus meiner Matrix-Unit anguckt von OpenGL, macht dies das Coden einfacher. Tmat4x4 ist dabei immer noch eine reine Array aus Float.

Code: Alles auswählen

  TMatrixHelper = type Helper for Tmat4x4
    procedure Identity;
    procedure RotateA(Winkel: GLfloat);
    procedure RotateB(Winkel: GLfloat);
    procedure RotateC(Winkel: GLfloat);
    procedure Translate(x, y, z: GLfloat); overload;
    procedure Scale(Faktor: GLfloat); overload;

Wen ich eine Matrix drehen will, sieht die sehr einfach aus:

Code: Alles auswählen

Matrix.Rotate(....

Und gleichzeitig ist Matix immer noch eine statische Array, welche ich einfach OpenGL-Funktionen übergeben kann.

Code: Alles auswählen

glBlaBla(@Matrix

Dies geht bei Record, Klassen, Objecten nicht
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
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 »

pluto hat geschrieben:
Neu ist ja nur, dass diese Typehelper dazugekommen sind, die es so aussehen lassen als ob "normale" Variablen auch Objekte wären.

Das was wir meinen ist: Das "Normle" Funktionen/Proceduren nun aufeinmal "Methoden" sind von entsprechenden Datentypen.

Es sind ja eben nicht normale Funktionen/Prozeduren. Es sind Methoden, vom TypeHelper nämlich.

Aber ursprünglich ging es doch bei der Beschwerde um die verschachtelten Aufrufe mit dem Punkt.
Aber erstens ist das nun wirklich nicht unübersichtlicher als Klammerei.
Zweitens kommen die Verschachtelungen nicht so häufig vor. Meistens ruft man ja nur eine Methode des Typs auf, oder vielleicht zwei.
Und drittens, es löst ja nicht die "normalen" Funktionen/Prozeduren ab.

pluto hat geschrieben:Somit müsste "Integer" ein Objekt/Klasse sein. Genau wie String und co...

Es gibt sogar Sprachen in denen das so ist. Inklusive der aufwändigen Speicherverwaltung. Da ist mir das mit den TypeHelper eigentlich deutlich lieber.

Mathias hat geschrieben:
die Schreibweise mit dem Punkt ist doch nichts Neues in Pascal. Das gibt es seit Einführung der Objektorientierten Programmierung.

Hat es den vorher nicht schon bei den Record gegeben?

Eigentlich nicht, Records kannten ja (damals) nur Datenfelder, aber keine Methoden.

Mathias hat geschrieben:Und gleichzeitig ist Matix immer noch eine statische Array, welche ich einfach OpenGL-Funktionen übergeben kann.
Dies geht bei Record, Klassen, Objecten nicht

Wieso kannst du Records, Klassen oder Objekte nicht übergeben? Also vorausgesetzt sie sind als Parameter zugelassen.

Der eigentliche Vorteil von TypeHelpern auf "normale" Datentypen ist: ich gewinne die Einfachheit von Methoden, erspare mir aber Referenzierung und Constructor-Aufrufe.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: TArray

Beitrag von Warf »

pluto hat geschrieben:Das was wir meinen ist: Das "Normle" Funktionen/Proceduren nun aufeinmal "Methoden" sind von entsprechenden Datentypen.

Somit müsste "Integer" ein Objekt/Klasse sein. Genau wie String und co...


Nein die Idee von Typhelpern ist genau das zu umgehen. Der Typhelper ist dabei tatsächlich (im OOP sinne) ein Objekt um das der Datentyp erweitert wird, und die Methoden sind Methoden dieses Objektes. Ob der datentypen dabei selbst ein Objekt ist spielt keine rolle. Auch wenn der vergleich an einigen stellen hinkt, wenn ich bei mir daheim einen Baum pflanzen möchte kann ich das nicht, da in einem Haus nicht die richtigen Vorraussetzungen sind. Wenn ich aber mein Haus um einen garten erweitere kann ich im garten einen Baum pflanzen, ohne dafür mein Haus Baumgerecht umbauen zu müssen. Das haus ist weiterhin ein Haus, mein garten ist ein Garten, und zusammen habe ich damit die Eigenschaften eines Hauses und die eines Gartens.

So ähnlich ist es mit typhelpern, sie erweitern typen um die Mechaniken die wir aus dem OOP kennen, ohne dabei den typen zu einem Objekt ändern zu müssen (wie z.B. beim Java Integer Wrapper klasse). Somit hat man die Einfachheit von simplen Datentypen in Kombination mit der kompfortablität von OOP

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 »

Eigentlich nicht, Records kannten ja (damals) nur Datenfelder, aber keine Methoden.

Doch, Records konnten schon früher methoden.... das ist ja das "Verrückte". du kannst in einem Record sowas schreiben
procedure Test1(...);

So ähnlich ist es mit typhelpern, sie erweitern typen um die Mechaniken die wir aus dem OOP kennen, ohne dabei den typen zu einem Objekt ändern zu müssen (wie z.B. beim Java Integer Wrapper klasse).

Ich finde jedenfalls die "Syntax" nicht gut.... die erinnert so stark an Java oder C++ Basierte Sprachen. Aber gut, wenn einige vorteile sehen ist es ja gut....
MFG
Michael Springwald

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

Re: TArray

Beitrag von Mathias »

Doch, Records konnten schon früher methoden.... das ist ja das "Verrückte". du kannst in einem Record sowas schreiben
procedure Test1(...);

Dies muss man aber aktivieren.

Code: Alles auswählen

{$modeswitch advancedrecords}
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: TArray

Beitrag von Mathias »

Mathias hat geschrieben:Und gleichzeitig ist Matix immer noch eine statische Array, welche ich einfach OpenGL-Funktionen übergeben kann.
Dies geht bei Record, Klassen, Objecten nicht

Wieso kannst du Records, Klassen oder Objekte nicht übergeben? Also vorausgesetzt sie sind als Parameter zugelassen.

Weil OpenGL-Funktionen auf Raw-Daten zugreifen muss.

Der eigentliche Vorteil von TypeHelpern auf "normale" Datentypen ist: ich gewinne die Einfachheit von Methoden, erspare mir aber Referenzierung und Constructor-Aufrufe.[/quote]
Beispiel:

Code: Alles auswählen

glBufferData(GL_ARRAY_BUFFER, SizeOf(VertexDaten), @VertexDaten, GL_STATIC_DRAW);
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
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 »

pluto hat geschrieben:
Eigentlich nicht, Records kannten ja (damals) nur Datenfelder, aber keine Methoden.

Doch, Records konnten schon früher methoden.... das ist ja das "Verrückte". du kannst in einem Record sowas schreiben
procedure Test1(...);

Das geht erst seitdem Advanced Records eingeführt wurden. Wo bitte soll das denn davor schon gegangen sein?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
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 »

Mathias hat geschrieben:
Wieso kannst du Records, Klassen oder Objekte nicht übergeben? Also vorausgesetzt sie sind als Parameter zugelassen.

Weil OpenGL-Funktionen auf Raw-Daten zugreifen muss.

Deswegen schrieb ich ja die Einschränkung die ich rot markiert habe. Dass man den Datentyp übergeben muss, den eine Prozedur erwartet, sollte ja jedem klar sein.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

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 »

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

Ich habe die "Advanced Records" nie verwendet, habe es nur mal gesehen, dass es geht. Ich weiß allerdings nicht wann sie eingeführt wurden, aber aufjedenfall eher als die "Integer.toString" Variante.
MFG
Michael Springwald

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TArray

Beitrag von wp_xyz »

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)

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 »

Ihr meint also solche aufrufe:
translate([ (width-wc)/2+(x*4*2.54),(length-4.00) / 2])circle(d=4.00,$fn=30);

Das ist OpenScad
Ich mag diese Syntax einfach nicht.... aber Geschmacksache....Solange ist Alternativen gibt, aber so werden sprachen auf "aufgebläht"...
MFG
Michael Springwald

Antworten