32bit - const und single will nicht.

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

32bit - const und single will nicht.

Beitrag von Mathias »

Folgendes Programm löst folgenden Fehler aus:

Code: Alles auswählen

vlianzeigeschiene.pas(71,32) Error: Compilation raised exception internally
Error: An unhandled exception occurred at $00000000004D96F0:
Error: EAccessViolation: Access violation
Bei Windows und Linux 32Bit.

Code: Alles auswählen

procedure TInnenProfil.WriteVertex;
var
  inn, aus, wand, o, u: single;
  anz: integer;
  i: integer;

const
  achse = 2.0;
  posz = 0.0;
  tiefe = 10.0;
begin
  Quads(
    vec3(aus, u, posz + tiefe + achse / 2),
    vec3(aus, u, posz + tiefe - achse / 2),
    vec3(aus, u + 5 - achse / 2, posz + tiefe - achse / 2),
    vec3(aus, u + 5 - achse / 2, posz + tiefe + achse / 2))
Unter Win64 und Linux 64bit compiliert es ohne Probleme.
Ersetze ich folgende Zeile

Code: Alles auswählen

  achse = 2.0;
durch

Code: Alles auswählen

  achse: single = 2.0;
Läuft es auch mit 32bit, egal ob Windows oder Linux.

Es ist ein sehr komplexes Programm, daher warte ich noch mit abspecken.
Vielleicht ist der Fehler schon bekannt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: 32bit - const und single will nicht.

Beitrag von wp_xyz »

Wieder heiteres Beruferaten... Was genau sind Vec3 und Quads? Ich kann's mir denken und habe mir folgenden compilierbaren Code zusammengereimt:

Code: Alles auswählen

type
  TVec3 = record x,y,z: Single; end;   
 
function Vec3(a, b, c: Single): TVec3;
begin
end;

procedure Quads(v1, v2, v3, v4: TVec3);
begin
end;

procedure TForm1.WriteVertex;
var
  inn, aus, wand, o, u: single;
  anz: integer;
  i: integer;
const
  achse = 2.0;
  posz = 0.0;
  tiefe = 10.0;
begin
  Quads(
    vec3(aus, u, posz + tiefe + achse / 2),
    vec3(aus, u, posz + tiefe - achse / 2),
    vec3(aus, u + 5 - achse / 2, posz + tiefe - achse / 2),
    vec3(aus, u + 5 - achse / 2, posz + tiefe + achse / 2)
  );
end; 
Und das kompiliert mit Laz/main + FPC3.2.2 ohne probleme unter Windows/32 bit. Und da du ein Fan von FPC/main bist, habe ich es auch damit probiert: auch kein Problem.

Etwas mehr brauchen wir schon...

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

Re: 32bit - const und single will nicht.

Beitrag von Mathias »

So habe es nun auf ein Minimum abgespeckt, ich habe sogar sämtliche LCL-Zeugs entfernt.

Aber etwas muss doch noch anders sein, als wen ich ein neues "Einfaches Programm" erstelle. Wen ich dies mache und die Plattform umstelle, läuft dieses dann. Daher bitte das Programm in Anhang als Referenz verwenden.

Lazarus/FPC habe ich eine etwa 1-2 Monate alte Trunk, welche auf Linux 64bit läuift. Das 32bit Zeugs habe ich als Cross compiliert.

Habe gerade noch die stable probiert, dort geht es. Ausser das ein Runtime error wegen Writeln kommt.
Ich habe es gerade noch mit der neusten Trunk probiert, dort kommt auch der komisch Fehler.
Dateianhänge
anz_bug.zip
(3.29 KiB) 208-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: 32bit - const und single will nicht.

Beitrag von wp_xyz »

Ich habe FPC 3.3.1, 3.2.2, 3.2.0, 3.0.4 und 2.6.4 unter 32-bit Windows ausprobiert. Bis auf 3.3.1 liefern alle mit deinem Programm einen Laufzeitfehler 103, "File not open" - das ist klar, das Häkchen bei "Win32 GUI application" unter "Projekt Options" > "Compiler Options" > "Config and Target" ist gesetzt. Entferne ich dieses, läuft das Programm fehlerfrei.

Bleibt FPC 3.3.1 - hier gibt es aber den Fehler "project1.lpr(13,25) Error: Compilation raised exception internally". Das ist neu, und das solltest du im Bugtracker melden, zusammen mit deinem Programm (entferne noch das "hauptfenster.pas" aus dem Projekt); das "/1" kann man noch weglassen: "Vec3(u + 5 - achse)" reicht. Lässt man einen von den drei Operanden weg, tritt der fehler nicht mehr auf, auch wenn man "achse" addiert statt subtrahiert.

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

Re: 32bit - const und single will nicht.

Beitrag von Mathias »

und das solltest du im Bugtracker melden,
https://gitlab.com/freepascal.org/fpc/s ... sues/40727

Ich habe noch was festgestellt , der Fehler tritt nur bei (-O4) auf.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten