Mit unbenutzter Variable knallt es

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

Mit unbenutzter Variable knallt es

Beitrag von Mathias »

Warum knallt es hier ?
Was aber interessant ist, sobald ich die Zeile mit "mat_ID: integer;" ausklammere funktioniert es, obwohl dies Variable nirgends verwendet wird.
Das ganze kann ich bei der Trunk und Stable von fpc beobachten.

Einer eine Idee was da faul ist ?

Code: Alles auswählen

program project1;

const
  libcglm = 'cglm';

type
  Tvec4 = array[0..3] of single;
  Tmat4 = array[0..3] of Tvec4;
  Pmat4=^Tmat4;

// procedure glmc_mat4_identity(mat: Tmat4); cdecl; external libcglm;
  procedure glmc_mat4_identity(mat: Pmat4); cdecl; external libcglm;


  procedure main;
  var
    mat_ID: integer;  // ohne dies gehts
    mat2: Tmat4;

  begin
    WriteLn(111111);
    glmc_mat4_identity(@mat2);  // bum !
    WriteLn(111111);
  end;

begin
  main;
end.              
Probiert mit Linux Mint
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2878
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: Mit unbenutzter Variable knallt es

Beitrag von m.fuchs »

Spannend. Kann man auch durch beliebige andere Variablen erzeugen.

Liegt aber nicht an mat_ID sondern an mat2 - setzt du die an die erste Stelle der Variablendeklaration, dann geht es.

Da würde ich doch mal auf wildes Pointer-Verschieben in der Lib tippen.
0118999881999119725-3

Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

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

Re: Mit unbenutzter Variable knallt es

Beitrag von Mathias »

Spannend. Kann man auch durch beliebige andere Variablen erzeugen.
Vor allem ach bei Variablen, welche man gar nicht benutzt, ich dachte immer die werden beim kompilieren ignoriert.
So nebenbei mit wine geht es ohne Fehler.
Da würde ich doch mal auf wildes Pointer-Verschieben in der Lib tippen.
Gut möglich, das cglm ein Bug hat. Die meisten C-Coder nehmen die glm_xxx und nicht die glmc_xxx Funktionen welche gebunden werden können.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Mit unbenutzter Variable knallt es

Beitrag von theo »

Schon mal mit initialisieren von mat2 probiert?
Immerhin meckert der Compiler das an.

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

Re: Mit unbenutzter Variable knallt es

Beitrag von Mathias »

Ich bin eine Schritt weiter gekommen, es hat mit der Ausrichtung zu tun.
Wen ich folgendes ins Hauptprogramm schreibe, dann geht es:

Code: Alles auswählen

{$CODEALIGN LOCALMIN=16}
Das kommt daher, weil cglm AVX-Register verwendet.

https://www.freepascal.org/daily/doc/prog/progsu9.html

Also folgender Testcode funktioniert.

Code: Alles auswählen

program project1;

const
  {$IFDEF Linux}
  libcglm = 'cglm';
  {$ENDIF}

  {$IFDEF Windows}
  libcglm = 'libcglm-0.dll';
  {$ENDIF}

  {$CODEALIGN LOCALMIN=16}

type
  Tvec4 = array[0..3] of single;
  Tmat4 = array[0..3] of Tvec4;

  procedure glmc_mat4_identity(mat: Tmat4); cdecl; external libcglm;

  procedure printMatrix(const m: Tmat4);
  var
    y, x: integer;
  begin
    for y := 0 to 3 do begin
      for x := 0 to 3 do begin
        Write(m[y, x]: 4: 2, ' ');
      end;
      WriteLn();
    end;
    WriteLn();
  end;

  procedure main;
  var
    mat_ID: integer;
    m: Tmat4;

  begin
    glmc_mat4_identity(m);
    printMatrix(m);
  end;

begin
  main;
end.
Aber ein Schönheitsfehler hat es doch noch, will ich es in der Unit mit der Bindung habe, dann knallt es trotzdem, das "{$CODEALIGN LOCALMIN=16}" muss zwingen ins Hauptprogramm.
Unit:

Code: Alles auswählen

unit Unit1;

interface

const
  {$IFDEF Linux}
  libcglm = 'cglm';
  {$ENDIF}

  {$IFDEF Windows}
  libcglm = 'libcglm-0.dll';
  {$ENDIF}

  {$CODEALIGN LOCALMIN=16}

type
  Tvec4 = array[0..3] of single;
  Tmat4 = array[0..3] of Tvec4;

  procedure glmc_mat4_identity(mat: Tmat4); cdecl; external libcglm;

implementation

end.                      
Hauptprogramm:

Code: Alles auswählen

program project1;

uses Unit1;

  procedure printMatrix(const m: Tmat4);
  var
    y, x: integer;
  begin
    for y := 0 to 3 do begin
      for x := 0 to 3 do begin
        Write(m[y, x]: 4: 2, ' ');
      end;
      WriteLn();
    end;
    WriteLn();
  end;

  procedure main;
  var
    mat_ID: integer;
    m: Tmat4;

  begin
    glmc_mat4_identity(m);  // Bum !
    printMatrix(m);
  end;

begin
  main;
end.
Darum die nächste Frage, kann man das "{$CODEALIGN LOCALMIN=16}" irgendwie in die Unit auslagern ?
Und wieso wird das "var mat_ID: integer;" nicht weg optimiert, ich dachte immer FPC entfernt unbenutztes ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7153
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Mit unbenutzter Variable knallt es

Beitrag von af0815 »

Mathias hat geschrieben: Mi 18. Feb 2026, 13:04 Darum die nächste Frage, kann man das "{$CODEALIGN LOCALMIN=16}" irgendwie in die Unit auslagern ?
Es ist dort notwendig, wo du die Variablen definierst bzw. verwendest und das machst du im Hauptprogramm und nicht in der Unit. Das Codealign selbst funktioniert in der Unit, nur sollten dann die Variablen auch dort bleiben.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten