TArray

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

TArray

Beitrag von Mathias »

Ich wollte mal TArray ausprobieren, aber es kommt nur zu einem Syntax-Fehler.

Code: Alles auswählen

type
  Ta= TArray<Byte>;
var
  a: TArray<Byte>;

Code: Alles auswählen

unit1.pas(34,13) Fatal: Syntax error, ";" expected but "<" found

Was mache ich falsch ?

So nebenbei gibt es TArray 2x .

Einmal in syshelph.inc

Code: Alles auswählen

{%mainunit syshelpers.pp}
 
Type
  generic TArray<T> = array of T;


Un einmal in der Unit DynamicArray:

Code: Alles auswählen

  TArray=Class
  private
    FCols: TFpList;
    FOnDestroyItem: TOnNotifyItem;
    FOnNewItem: TonNotifyItem; 
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 329
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: TArray

Beitrag von Niesi »

Mathias hat geschrieben:Ich wollte mal TArray ausprobieren, aber es kommt nur zu einem Syntax-Fehler.

Code: Alles auswählen

type
  Ta= TArray<Byte>;
var
  a: TArray<Byte>;

Code: Alles auswählen

unit1.pas(34,13) Fatal: Syntax error, ";" expected but "<" found

Was mache ich falsch ?

So nebenbei gibt es TArray 2x .

Einmal in syshelph.inc

Code: Alles auswählen

{%mainunit syshelpers.pp}
 
Type
  generic TArray<T> = array of T;


Un einmal in der Unit DynamicArray:

Code: Alles auswählen

  TArray=Class
  private
    FCols: TFpList;
    FOnDestroyItem: TOnNotifyItem;
    FOnNewItem: TonNotifyItem; 



Versuch mal bitte hinter dem "=" ein "specialize".

Also
type
tMyArray = specialize tArray<integer>;

Geht bei mir ...

.
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

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

Re: TArray

Beitrag von Mathias »

Danke, dies funktioniert.

Code: Alles auswählen

var
  a0: specialize TArray<byte>;
  a1: array of byte;


Was hat TArray für einen Vorteil gegenüber von array of ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: TArray

Beitrag von wp_xyz »

Welchen Vorteil hat der Aufruf "s.Length" gegenüber "Length(s)" bei einem String s?

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 »

Mathias hat geschrieben:Was hat TArray für einen Vorteil gegenüber von array of ?


Im Quelltext steht was:
objpas.pp hat geschrieben:Slightly Less useful in FPC, since dyn array compatibility is at the element level.
But still useful for generic methods and of course Delphi compatibility
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: TArray

Beitrag von Mathias »

Etwas weniger nützlich in FPC, da die Dyn-Array-Kompatibilität auf der Elementebene liegt.
Aber immer noch nützlich für generische Methoden und natürlich Delphi-Kompatibilität

Anscheinend wegen Delphi, kennt Delphi keine dynamische Array ? :roll:

Was ich mir noch vorstellen kann, für Umsteiger von C++.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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 »

Mathias hat geschrieben:Anscheinend wegen Delphi, kennt Delphi keine dynamische Array ? :roll:

Weil Delphi diesen Typ hat, ist er auch in Free Pascal vorhanden.

Der andere Fall (generische Methoden) sehen in etwa so aus:

Code: Alles auswählen

type
  generic TMyClass<x> = class
    procedure Process(a: specialize TArray<Byte>);
  end;

Auch hier gilt: man kann es auch anders schreiben.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: TArray

Beitrag von Warf »

wp_xyz hat geschrieben:Welchen Vorteil hat der Aufruf "s.Length" gegenüber "Length(s)" bei einem String s?


Grundsätzlich keinen, aber grade wenn man mehrere funktionen kombiniert finde ich es deutlich angenehmer vom Schreibfluss z.B.:

Code: Alles auswählen

Str.Length.ToString;
//vs
IntToStr(Length(Str));

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

Re: TArray

Beitrag von Mathias »

Kann man dies nich auch mit type helper machen ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1423
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: TArray

Beitrag von fliegermichl »

Eben glaube ich nicht was ich da sehe.

Seit wann kann man denn in Pascal s.Length.ToString schreiben wenn s mit var s : string deklariert wurde?

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

Re: TArray

Beitrag von Mathias »

Seit 3.0.0 .

Gucke mal die type helper an.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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 »

Mathias hat geschrieben:Kann man dies nich auch mit type helper machen ?

Das sind doch welche.

fliegermichl hat geschrieben:Seit wann kann man denn in Pascal s.Length.ToString schreiben wenn s mit var s : string deklariert wurde?

Seit 3.0. http://wiki.freepascal.org/Type_Helper/de
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1423
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: TArray

Beitrag von fliegermichl »

Danke für die Info. Man lernt nie aus.

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 »

Str.Length.ToString;

Das wird dann aber schnell unübersichtlich, wenn man das so fortführen würde.

Ich finde einfach Lenght(str) ist ein Schritt und Den Integer in einem String zu wandeln wäre ein zweiter.
Aber diese Syntax verbindet diese beiden Schritte zu einem Schritt.
MFG
Michael Springwald

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

Re: TArray

Beitrag von wp_xyz »

pluto hat geschrieben:
Str.Length.ToString;

Das wird dann aber schnell unübersichtlich, wenn man das so fortführen würde.

Ich finde einfach Lenght(str) ist ein Schritt und Den Integer in einem String zu wandeln wäre ein zweiter.
Aber diese Syntax verbindet diese beiden Schritte zu einem Schritt.

Nein das hat nichts mit dieser neuen Syntax zu tun. Mit der "alten" klassischen Pascal Schreibweise kann man ja dasselbe genauso verschachtelt schreiben:

Code: Alles auswählen

  WriteLn(IntToStr(Length(Str)));

Der Unterschied ist, dass man bei der alten Schreibweise Funktionen vor dem Operanden anfügt, bei der neuen hinter dem Operanden. Für manche Leute könnte die neuen Schreibweise den Vorteil haben machen, dass man keine Klammern mehr zählen muss (aber wer mit der Klammerhervorhebung des Lazarus-Editors noch Klammern zählt, ist selbst schuld). Der Nachteil ist m.E., dass die Typehelper ja nicht zum Standardumfang von Pascal gehören, sondern selbst erst mal programmiet werden mussten. D.h. das Programm wird wegen m.E. unnötigem Code aufgebläht. Und zur Zeit gibt es auf der FPC-Mailingliste auch eine Diskussion, warum die Compilierzeit mit fpc-trunk länger ist als mit 3.0.2, und da stehen tatsächlich die Typehelper auf der Verdachtsliste.

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.

Antworten