TArray

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Re: TArray

Beitragvon Mathias » 22. Mai 2018, 13:28 Re: TArray

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4324
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon pluto » 22. Mai 2018, 14:45 Re: TArray

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
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6668
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.3 | 
CPU-Target: AMD
Nach oben

Beitragvon m.fuchs » 22. Mai 2018, 15:20 Re: TArray

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
m.fuchs
 
Beiträge: 1970
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon pluto » 22. Mai 2018, 15:23 Re: TArray

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
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6668
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.3 | 
CPU-Target: AMD
Nach oben

Beitragvon Mathias » 22. Mai 2018, 15:39 Re: TArray

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4324
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon m.fuchs » 22. Mai 2018, 19:26 Re: TArray

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
m.fuchs
 
Beiträge: 1970
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon Warf » 22. Mai 2018, 21:00 Re: TArray

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
Warf
 
Beiträge: 984
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon pluto » 22. Mai 2018, 21:05 Re: TArray

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
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6668
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.3 | 
CPU-Target: AMD
Nach oben

Beitragvon Mathias » 22. Mai 2018, 21:35 Re: TArray

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4324
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 22. Mai 2018, 21:38 Re: TArray

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4324
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon m.fuchs » 22. Mai 2018, 22:38 Re: TArray

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
m.fuchs
 
Beiträge: 1970
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon m.fuchs » 22. Mai 2018, 22:41 Re: TArray

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
m.fuchs
 
Beiträge: 1970
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon pluto » 22. Mai 2018, 23:40 Re: TArray

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
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6668
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.3 | 
CPU-Target: AMD
Nach oben

Beitragvon wp_xyz » 23. Mai 2018, 00:00 Re: TArray

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)
wp_xyz
 
Beiträge: 2641
Registriert: 8. Apr 2011, 08:01

Beitragvon pluto » 23. Mai 2018, 00:12 Re: TArray

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
Aktuelles Projekt: PlutoArduino
pluto
 
Beiträge: 6668
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg/Oldenburg
OS, Lazarus, FPC: Linux Mint 18.3 | 
CPU-Target: AMD
Nach oben

» Weitere Beiträge siehe nächste Seite »
VorherigeNächste

Zurück zu Freepascal



Wer ist online?

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

cron
porpoises-institution
accuracy-worried