typehelper wird nicht richtig erkannt.

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
Mathias
Beiträge: 6210
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

typehelper wird nicht richtig erkannt.

Beitrag von Mathias »

Ist dies so gewollt, oder ist es ein Bug ?
Wen ich ein Typ von einem anderen Typ ableite und beide Typen ein typehelper haben, hat der Compiler Probleme.
Der Code sollte selbsterklärend sein. Spannend ist das zwischen begin und end.
Getestet mit FPC 3.3.1 Linux 64bit.

Code: Alles auswählen

program project1;

  {$modeswitch typehelpers}
type
  TGlfloats = array of single;

  TVectors2f = TGlfloats;   // Ableitung 1
  TVectors3f = TGlfloats;   // Ableitung 2

  TGlfloatsHelper = type Helper for TGlfloats
    procedure Testfloat;
  end;

  TVectors2fHelper = type Helper for TVectors2f
  public
    procedure TestV2;
  end;

  TVectors3fHelper = type Helper for TVectors3f
  public
    procedure TestV3;
  end;

  procedure TVectors3fHelper.TestV3;
  begin
    WriteLn('V3');
  end;

  procedure TVectors2fHelper.TestV2;
  begin
    WriteLn('V2');
  end;

  procedure TGlfloatsHelper.Testfloat;
  begin
    WriteLn('float');
  end;

var
  v2: TVectors2f=nil;
  v3: TVectors3f=nil;
  f: TGlfloats=nil;

begin
  v2.TestV2;    // illegal qualifier
  v3.TestV3;    // geht
  f.Testfloat;  // illegal qualifier

  v2.TestV3;   // geht komischwerweise
end.
Vertausche ich die beiden Blöcke TVectors3fHelper und TVectors2fHelper in der Deklaration, werden auch die Fehlermeldungen zwischen begin und end vertauscht.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: typehelper wird nicht richtig erkannt.

Beitrag von Mathias »

Soll ich einen Bug-Report öffnen ?
Oder habe ich einen Überlegungsfehler ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 834
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: typehelper wird nicht richtig erkannt.

Beitrag von PascalDragon »

Mathias hat geschrieben:
So 5. Nov 2023, 16:31
Oder habe ich einen Überlegungsfehler ?
Ja, du hast einen Überlegungsfehler. Sogar zwei.

Das hier:

Code: Alles auswählen

type
  TVectors2f = TGlfloats;
ist keine „Ableitung”, sondern ein „Alias”. Das heißt, das Program wäre absolut gleich, wenn du alle Vorkommen von TVectors2f und TVectors3f durch TGlfloats ersetzt. Alle deine type helper sind also letztlich für den gleichen Typ (Überlegungsfehler #1).

Überlegungsfehler #2: bei Helpertypen ist immer der letzte Helper im Scope entscheidend. In diesem Fall also TVectors3fHelper, weswegen für alle Variablen nur TestV3 gültig ist.

Wenn du eindeutige Typen haben möchtest, dass musst du einen „Unique Alias” nutzen:

Code: Alles auswählen

type
  TVectors2f = type TGlfloats;
Dann können auch unterschiedliche Helper genutzt werden oder du kannst verschiedene Routinen mit ähnlichen Parameterlisten machen.
FPC Compiler Entwickler

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

Re: typehelper wird nicht richtig erkannt.

Beitrag von Mathias »

Wenn du eindeutige Typen haben möchtest, dass musst du einen „Unique Alias” nutzen:

Code: Alles auswählen

type
  TVectors2f = type TGlfloats;
Danke, dies hat mich einiges weiter gebracht.
Jetzt weis ich wenigsten, für was das type nach dem "=" gut ist. Das sieht man noch recht oft in den FPC-Sourcen.

Überlegungsfehler #2: bei Helpertypen ist immer der letzte Helper im Scope entscheidend. In diesem Fall also TVectors3fHelper, weswegen für alle Variablen nur TestV3 gültig ist.
Dies kann ich jetzt nachvollziehen, folgender Code geht nicht mehr.

Code: Alles auswählen

type
  TIntegerHelper = type Helper for integer
    procedure Test;
  end;
 ...
var
  i: integer = 123;
begin
  i.Test;
  WriteLn(i.toString);  // geht nicht mehr
end. 
Kann man dies auch noch irgendwie umgehen, das dies auch geht ?
Oder kann nur ein typehelper pro Type-Bezeichner auf einmal aktiv sein ?

Nachtrag:
Mit einer Typenumwandlung würde es klappen, auch wen es nicht so schön aussieht.

Code: Alles auswählen

type
  NewInt = type integer;

  TIntegerHelper = type Helper for NewInt
    procedure Test;
  end;

  procedure TIntegerHelper.Test;
  begin
    WriteLn('test');
  end;

var
  i: NewInt = 123;

begin
  i.Test;
  WriteLn(integer(i).toString); // Umwandlung
end. 
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: typehelper wird nicht richtig erkannt.

Beitrag von Socke »

Mathias hat geschrieben:
So 5. Nov 2023, 19:22

Code: Alles auswählen

type
  TIntegerHelper = type Helper for integer
    procedure Test;
  end;
 ...
var
  i: integer = 123;
begin
  i.Test;
  WriteLn(i.toString);  // geht nicht mehr
end. 
Kann man dies auch noch irgendwie umgehen, das dies auch geht ?
Oder kann nur ein typehelper pro Type-Bezeichner auf einmal aktiv sein ?
Es kann pro Typ immer nur ein Helper aktiv sein. Du kannst aber Type Helper vererben:

Code: Alles auswählen

type
  TIntegerHelper = type Helper (TIntegerHelper) for integer
    procedure Test;
  end;
Die Ableitung funktioniert aber nur, wenn beide Helper den selben Typen erweitern. Bei abgeleiteten Typen wie NewInt = type integer; geht das nicht mehr.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: typehelper wird nicht richtig erkannt.

Beitrag von Mathias »

Dein Beispiel funktioniert nicht, "Duplicate identief".

Aber so funktioniert es, und es sieht so aus, das es genau das ist was ich suchte.

Code: Alles auswählen

  TVectors2fHelper = type Helper (TGlfloatsHelper) for TVectors2f
  public
    procedure TestV2;
  end;
Die Ableitung funktioniert aber nur, wenn beide Helper den selben Typen erweitern. Bei abgeleiteten Typen wie NewInt = type integer; geht das nicht mehr.
Dies kann ich jetzt nicht nachvollziehen.

Code: Alles auswählen

type
  TGlfloats = array of single; // Dies wäre eine Ableitung.

  TVectors2f = type TGlfloats;

  TGlfloatsHelper = type Helper for TGlfloats
    procedure Testfloat;
  end;

  TVectors2fHelper = type Helper (TGlfloatsHelper) for TVectors2f
  public
    procedure TestV2;
  end; 
  ...
  var
  v2: TVectors2f = nil;
  f: TGlfloats = nil;

begin
  v2.TestV2;
  f.Testfloat;
  TGlfloats(v2).Testfloat; // Ist nicht mehr nötig
  v2.Testfloat;  // Dies geht neu 
end.  
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: typehelper wird nicht richtig erkannt.

Beitrag von Socke »

Mathias hat geschrieben:
Di 7. Nov 2023, 08:40
Dein Beispiel funktioniert nicht, "Duplicate identief".
Da war ich wohl noch nicht wach :D. Der abgeleitete Type Helper muss natürlich einen anderen Namen haben.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: typehelper wird nicht richtig erkannt.

Beitrag von Mathias »

Danke an alle die geholfen habe, jetzt habe ich dies hingekriegt, was ich wollte. :idea:

Wen man weis wie, kann FPC noch recht viel. :wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: typehelper wird nicht richtig erkannt.

Beitrag von Mathias »

Kann dies sein, das die Vererbung von typehelper ein brandneues Feature von FPC ist ?
Auf meinem Laptop habe ich auch ein FPC 3.3.1, und dort kommt nur.

Code: Alles auswählen

oglvectors.pas(29,3) Error: Derived record or type helper must extend "TGlfloats"
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: typehelper wird nicht richtig erkannt.

Beitrag von Socke »

Mathias hat geschrieben:
Di 7. Nov 2023, 22:08
Kann dies sein, das die Vererbung von typehelper ein brandneues Feature von FPC ist ?
Auf meinem Laptop habe ich auch ein FPC 3.3.1, und dort kommt nur.

Code: Alles auswählen

oglvectors.pas(29,3) Error: Derived record or type helper must extend "TGlfloats"
Version 3.3.1 ist doch "brandneu"? Die Dokumentation für die stabile Version 3.2.2 enthält es jedenfalls (https://www.freepascal.org/docs-html/re ... fch10.html siehe Abschnitt 10.1)
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: typehelper wird nicht richtig erkannt.

Beitrag von Mathias »

Auf jeden Fall funktioniert es auf dem PC, aber auf dem Laptop nicht. Auf dem Laptop ist ein älteres 3.1..1 installiert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 834
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: typehelper wird nicht richtig erkannt.

Beitrag von PascalDragon »

Socke hat geschrieben:
Di 7. Nov 2023, 07:11
Mathias hat geschrieben:
So 5. Nov 2023, 19:22

Code: Alles auswählen

type
  TIntegerHelper = type Helper for integer
    procedure Test;
  end;
 ...
var
  i: integer = 123;
begin
  i.Test;
  WriteLn(i.toString);  // geht nicht mehr
end. 
Kann man dies auch noch irgendwie umgehen, das dies auch geht ?
Oder kann nur ein typehelper pro Type-Bezeichner auf einmal aktiv sein ?
Es kann pro Typ immer nur ein Helper aktiv sein.
In 3.3.1 gibt es auch den Modeswitch MultiHelpers, welcher es erlaubt, dass mehrere Helper auf einmal für einen Typ aktiv sein können (bei mehreren Methoden/Properties in den Helpern mit gleichen Namen wird nach den Scoping Regeln entschieden (der letzte Helper im Scope gewinnt)).
Socke hat geschrieben:
Di 7. Nov 2023, 07:11
Du kannst aber Type Helper vererben:

Code: Alles auswählen

type
  TIntegerHelper = type Helper (TIntegerHelper) for integer
    procedure Test;
  end;
Die Ableitung funktioniert aber nur, wenn beide Helper den selben Typen erweitern. Bei abgeleiteten Typen wie NewInt = type integer; geht das nicht mehr.
Seit ein paar Wochen geht das auch in 3.3.1.
Mathias hat geschrieben:
Di 7. Nov 2023, 22:08
Kann dies sein, das die Vererbung von typehelper ein brandneues Feature von FPC ist ?
Auf meinem Laptop habe ich auch ein FPC 3.3.1, und dort kommt nur.

Code: Alles auswählen

oglvectors.pas(29,3) Error: Derived record or type helper must extend "TGlfloats"
Das geht erst in aktuellen 3.3.1 Versionen, davor kannst du einen Helper nicht für einen „Unique Alias” vererben.
FPC Compiler Entwickler

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

Re: typehelper wird nicht richtig erkannt.

Beitrag von Mathias »

Jetzt hat sich vieles geklärt.
Mit "{$modeswitch MultiHelpers}" klären sich auch die Probleme weiter oben.

Irgendwie schon Zufall, ich wollte versuchen, Type Helper zu vererben, und genau jetzt wurde dies kürzlich neu eingeführt.
Und ich dachte, dies gäbe es schon seit der Einführung von Type Helper.

So wie ich so zum positiven gemerkt habe, ich den letzten paar Jahren, wurde ein paar recht komfortable Funktionen eingeführt.
Operatoren überladen, Type Helper, Array-Operationen und jetzt kommt noch das ganze Generic-Zeugs hinzu.
Alles Funktionen, dies sehr nützlich für Vektor/OpenGL-Programmierung ist.

Einziger Mehrwurtstropen man findet viele Änderungen nur per Zufall.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: typehelper wird nicht richtig erkannt.

Beitrag von theo »

Mathias hat geschrieben:
Do 9. Nov 2023, 08:43
Einziger Mehrwurtstropen man findet viele Änderungen nur per Zufall.
:lol:

https://de.wiktionary.org/wiki/Wermutstropfen

PascalDragon
Beiträge: 834
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: typehelper wird nicht richtig erkannt.

Beitrag von PascalDragon »

Mathias hat geschrieben:
Do 9. Nov 2023, 08:43
Einziger Mehrwurtstropen man findet viele Änderungen nur per Zufall.
Dann stolpere doch mal zufällig über die Wikiseite, welche die Basis für die nächsten Release Notes ist. 😉
FPC Compiler Entwickler

Antworten