Warnung bei Type Helper loswerden

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

Warnung bei Type Helper loswerden

Beitrag von Mathias »

Bei diesem kleinen Code-Schnipsel kommt eine Warnung, das "v" nicht initialisiert ist.
Genau dies macht ja die procedure init.

Code: Alles auswählen

program Project1;

  {$modeswitch typehelpers}

type
  TVec2 = array[0..1] of single;

  TVec2fHelper = type Helper for TVec2
    procedure init;
  end;

  procedure TVec2fHelper.init;
  begin
    Self := [0, 1];
  end;

var
  v: TVec2;

begin
  v.init;   // project1.lpr(21,3) Warning: Variable "v" does not seem to be initialized
  WriteLn(v[0], v[1]);
end.  
Klar ich könnte folgendes machen, aber dies würde nach meiner Meinung null Sinn machen.

Code: Alles auswählen

var
  v: TVec2 = (0, 0);  
oder

Code: Alles auswählen

 {$WARNINGS OFF}
 v.init;   // project1.lpr(21,3) Warning: Variable "v" does not seem to be initialized
 {$WARNINGS ON}
Ist dies so gewollt ?
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: Warnung bei Type Helper loswerden

Beitrag von PascalDragon »

Mathias hat geschrieben:
Mi 13. Dez 2023, 16:17
Bei diesem kleinen Code-Schnipsel kommt eine Warnung, das "v" nicht initialisiert ist.
Genau dies macht ja die procedure init.
Der Compiler hat keine Ahnung, dass Init das macht.
Mathias hat geschrieben:
Mi 13. Dez 2023, 16:17
Klar ich könnte folgendes machen, aber dies würde nach meiner Meinung null Sinn machen.

Code: Alles auswählen

var
  v: TVec2 = (0, 0);  
oder

Code: Alles auswählen

 {$WARNINGS OFF}
 v.init;   // project1.lpr(21,3) Warning: Variable "v" does not seem to be initialized
 {$WARNINGS ON}
Deklariere halt eine passende, typisierte Konstante und nutze die zur Initialisierung:

Code: Alles auswählen

const
  Vec2Default: TVec2 = (0, 1);
var
  v: TVec2;
begin
  v := Vec2Default;
end.
Oder wenn dein initaler Wert tatsächlich mit allem Werten 0 ist, dann kannst du auch v := Default(TVec2) nutzen.

Und wenn du bestimmte Werte angeben kannst, könntest du in deinem Helper auch einen Konstruktor deklarieren (parameterlose Konstruktoren sind nicht erlaubt, das schließt auch Konstruktoren mit nur optionalen Parametern mit ein).
FPC Compiler Entwickler

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Warnung bei Type Helper loswerden

Beitrag von corpsman »

Übrigens, wenn es dir um eine Vector mathe Lib geht, da würde ich mal einen Blick auf uvectormath.pas empfehlen, da sind auch Typehelper drin ;)
--
Just try it

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

Re: Warnung bei Type Helper loswerden

Beitrag von Mathias »

Und wenn du bestimmte Werte angeben kannst, könntest du in deinem Helper auch einen Konstruktor deklarieren (parameterlose Konstruktoren sind nicht erlaubt, das schließt auch Konstruktoren mit nur optionalen Parametern mit ein).
Von dem habe ich auch schon gelesen, und genau wegen diesen Parametern habe ich es dann sein gelasen.
Dieses Beispiel wird korrekt ausgeführt, nur sehe ich keinen Sinn hinter diesem zwingendem Parameter,

Code: Alles auswählen

{$modeswitch advancedrecords}
{$modeswitch typehelpers}
type
  TMat = array[0..1, 0..1] of single;

  TMatHelper = type Helper for TMat
    constructor init(dummy: byte);
  end;

  constructor TMatHelper.init(dummy: byte);
  begin
    Self := [[1, 0], [0, 1]];
  end;

var
  m: TMat;

begin
  m.init(123);
  WriteLn(m[0, 0]); // -> 1
end.    
Übrigens, wenn es dir um eine Vector mathe Lib geht, da würde ich mal einen Blick auf uvectormath.pas empfehlen, da sind auch Typehelper drin ;)
Danke für den Link, sieht recht spanned aus.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten