Mit unbenutzter Variable knallt es

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 7215
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: 7215
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: 11173
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: 7215
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: 7160
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).

Mathias
Beiträge: 7215
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 »

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.
Dann ist das die Lösung dafür:

Code: Alles auswählen

  var
    i1:Integer;
    {$CODEALIGN LOCALMIN=16}
    m: Tmat4;
    {$CODEALIGN LOCALMIN=0}
    i2:Integer;  
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Zvoni
Beiträge: 546
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: Mit unbenutzter Variable knallt es

Beitrag von Zvoni »

Hab ich jetzt nen Knick in der Optik?
Im ersten Post übergibst du einen Zeiger auf dein array an die C-Funktion

Code: Alles auswählen

 Pmat4=^Tmat4;

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

Jetzt im anderen Code, welcher anscheinend funzt, ist es ein Tmat4 (!!)

Code: Alles auswählen

 {$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;
Hä??
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Mathias
Beiträge: 7215
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 »

Pmat4 !!!
Das mit dem Pmat4 war ein Versuch weil ich zuerst an dies dachte, aber da ich jetzt den Fehler gefunden habe, geht es auch mit Tmat4, was mir sympatischer ist.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7160
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 »

Das wäre zielführender, weil die alten Compilereinstellungen durch das Push/Pop erhalten bleiben. So zerstörst du ein eventuell bereits vorhandenes Codealign nicht.

Code: Alles auswählen

  var
    i1:Integer;
    {$PUSH}
    {$CODEALIGN LOCALMIN=16}
    m: Tmat4;
    {$POP}
    i2:Integer;  
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Mathias
Beiträge: 7215
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 »

Die knallt bei mir, wieso auch immer

Code: Alles auswählen

program project1;

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

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

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;
    {$PUSH}
    {$CODEALIGN LOCALMIN=16}
    m: Tmat4;
    {$POP}
    i2: integer;
  begin
    glmc_mat4_identity(m);
    printMatrix(m);
  end;

begin
  main;
end.
Sobald ich push und pop wieder weg nehme geht es wieder.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7160
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, 19:26 Die knallt bei mir, wieso auch immer ...
Sobald ich push und pop wieder weg nehme geht es wieder.
Dann wird der Bereich wo du das brauchst auch der Bereich sein, wo du die Variablen verwendest.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten