Es kompiliert nicht alles

Für Fragen rund um die Ide und zum Debugger

Re: Es kompiliert nicht alles

Beitragvon Mathias » 26. Jun 2014, 17:22 Re: Es kompiliert nicht alles

Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4324
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon theo » 26. Jun 2014, 19:59 Re: Es kompiliert nicht alles

Mathias hat geschrieben:Habe ich es richtig gemacht ?


Ist eigentlich jetzt egal, der Bugreport wurde als Duplikat eingestuft.
Der Hauptreport dazu ist hier: http://bugs.freepascal.org/view.php?id=18121

Aber mal eine andere Frage: Wie kommt man eigentlich auf so eine Idee, eine einfache Methode zu "inlinen"?
theo
 
Beiträge: 8058
Registriert: 11. Sep 2006, 18:01

Beitragvon Mathias » 26. Jun 2014, 21:20 Re: Es kompiliert nicht alles

Aber mal eine andere Frage: Wie kommt man eigentlich auf so eine Idee, eine einfache Methode zu "inlinen"?

Eben, weil es eine einfache Methode ist.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4324
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon theo » 26. Jun 2014, 21:56 Re: Es kompiliert nicht alles

Mathias hat geschrieben:
Aber mal eine andere Frage: Wie kommt man eigentlich auf so eine Idee, eine einfache Methode zu "inlinen"?

Eben, weil es eine einfache Methode ist.


Und was versprichst du dir davon? Soll das schneller zeichnen? :lol:
Bisher kannte ich das nur von normalen, kurzen Funtkionen die man evtl. in engen Loops benützt.
theo
 
Beiträge: 8058
Registriert: 11. Sep 2006, 18:01

Beitragvon Mathias » 26. Jun 2014, 22:21 Re: Es kompiliert nicht alles

Und was versprichst du dir davon? Soll das schneller zeichnen? :lol:

Vieleicht eine MikroSekunde. ;)
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4324
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 14. Jul 2018, 17:52 Re: Es kompiliert nicht alles

Der Thread ist Uralt, aber ich musste leider feststellen, das dieser Bug mit dem Inline wieder das ist. (FPC 3.0.4, Lazarus 1.8.4)

Ich habe vorhin mit folgender procedure geübt, sie ist Bestandteil eines TypenHelper und gehört zu einer Packe von mir.
Code: Alles auswählen
procedure Tmat4x4Helper.Translate(x, y, z: GLfloat); inline;
var
  i: integer;
begin
//  for i := 0 to 2 do begin
//    Self[3, i] += Self[0, i] * x + Self[1, i] * y + Self[2, i] * z;
//  end;
  Self[3, 0] += x;
  Self[3, 1] += y;
  Self[3, 2] += z;
end;

Ich werde später mal versuchen den Fehler auf ein Mini-Beispiel einzugrenzen.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4324
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 14. Jul 2018, 19:19 Re: Es kompiliert nicht alles

So habe es nun auf ein Minimum reduziert. Ich kann ich der Unit2 Result ändern, wie ich will, es wird nicht angenommen.
Sobald ich aber in der Unit1 etwas ändere, auch wen es nur eine Leerzeilen einfügen ist, dann wird der neue Wert von Result übernommen.

Kann das sonst noch wer nachvollziehen ?

Getestet mit FPC 3.0.4, Lazarus 1.8.4, Linux 64Bit.

Ich habe es gerade noch mit der Trunk probiert.
Dabei habe ich auch Win32 und Win64 probiert.
Der Bug ist überall.

Wie oben beschrieben auch mit Type Helper:
Code: Alles auswählen
// Unit1
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  i.geti;
  Caption := IntToStr(i);
end;
 
// Unit2
type
  TIntegerHelper = type Helper for Integer
    procedure geti;
  end;
 
implementation
 
procedure TIntegerHelper.geti; inline;
begin
  Self := 7;
end;


Einzig was geht, ist eine nackte Funktion:
Code: Alles auswählen
function getii: Integer; inline;
begin
  Result := 8;
end;
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4324
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Michl » 14. Jul 2018, 19:54 Re: Es kompiliert nicht alles

Ich habe es jetzt noch nicht getestet, aber war der Bug jemals gefixt? Lt. Bugeintrag eigentlich ja nicht. https://bugs.freepascal.org/view.php?id=25797
Code: Alles auswählen
type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 
Michl
 
Beiträge: 2260
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon Mathias » 14. Jul 2018, 19:59 Re: Es kompiliert nicht alles

Ich habe es jetzt noch nicht getestet, aber war der Bug jemals gefixt? Lt. Bugeintrag eigentlich ja nicht. https://bugs.freepascal.org/view.php?id=25797

Dieser Report bezieht sich auch nackte Funktionen, diese gehen, wie ich oben beschrieben habe.
Was noch nicht geht, ist wen inline in Classen oder Type Helper gepackt ist.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4324
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Erwin » 18. Jul 2018, 14:57 Re: Es kompiliert nicht alles

Über ähnlichen Fehler bin ich auch schon gestolpert. Weiß aber nicht, in wie weit es mit diesem hier zusammen hängt.
Aber bei mir tritt der Fehler dann bei folgender Konstellation auf:

Habe ein Unit für Records. Dort erstelle ich einen TMalRecord mit zum Beispiel Angaben von 'Hoehe' und 'Breite'.

Im Hauptunit (also vom Formular) wird der Record dann ... zugewiesen (sagt man das so)? 'BildMalRecord:=TMalRecord'. Des weiteren wird auch in dieser Hauptunit die Daten übertragen/eingetragen (zb. BildMalRecord.Hoehe:=50, BildMalRecord.Breite:=200). Und dann eine Funktion FMalen aufgerufen ('FMalen()')

In einem Dritten Unit ist dann die Funktion 'FMalen()'. Innerhalb dieser Funktion wird dann eben 'BildMalRecord.Hoehe' etc. benutzt, also ausgelesen und dann gemalen.

Wenn ich aber hergehe, und im Unit für Records und im Hauptunit den Namen von 'Hoehe' und 'Breite' in anderen Namen ändere, führt er das Programm ohne Fehlermeldung aus.
Wenn ich dann in 2 Schritten, also
'Hoehe' in HoeheVar' und 'Breite' in 'BreiteVar' ändere, kompiliere dann
'HoeheVar' in 'Breite' und zuletzt 'BreiteVar' in 'Hoehe' umändere, und kompiliere,
zeichnet es dann mit den Daten von Hoehe die Breite und umgekehrt.

Dies 'klappt' so lange, bis man im Dritten Unit etwas ändert oder schreibt. Für mich spricht vieles dafür, dass es eben die Dritte Unit (wo die Funktion FMalen ist) so lange ignoriert, also weder neu Kompiliert und auch nicht die Vars überprüft, bis sich was ändert.

Mit direkten Variablen hingegen geht das nicht. Aber diese werden ja auch nicht extra noch mal zugewiesen wie ein Record.

Und ja, ich kann es mir teils denken: Gehört sich so, weil man sich Zeit sparen will etc. usw.

Allerdings bei Delphi hingegen geht dies nicht. Der meckert grundsätzlich, und nicht erst, wenn sich auch in der Dritten Unit sich was ändert.
Und ja, ich hätte mir den Satz eins weiter oben sparen können. Weil vermute mal, das 'natürlich' es dann Delphi falsch macht, während Lazarus es richtig macht. Und ansonsten ja generell der Fehler am Nutzer, also mir liegt.
Win 7 / Lazarus 1.6 / FP 3.0.0 / x86_64-win64-win32/win64
Erwin
 
Beiträge: 216
Registriert: 16. Sep 2009, 13:15
OS, Lazarus, FPC: Xubuntu 16.04 / x86_64_linux-gtk 2 / L 1.6+dfsg-1 / FPC 3.0.0 | 
Nach oben

Beitragvon Erwin » 20. Jul 2018, 15:56 Re: Es kompiliert nicht alles

Mein Fall betreffend, habe ich inzwischen heraus gefunden, dass wenn man in der Dritten Unit, wo die Funktion für malen ist, wenn man dort die Unit des Record in die Uses einfügt, es dann die Veränderungen in den anderen Units generell mitbekommt.
Weil ursprünglich war es ja nicht nötig, die Unit Record in die uses von Unit Malen aufzulisten.
Tja, das macht es für mich etwas unnötig aufgebläht.

Vielleicht ist der Bug vom Threadersteller auf ähnliche Weise leicht zu beheben?
Oder wurde da nicht schon bereits ähnliches vermutet, also dass ein Zuweisung im geschützten (lokalen) statt offen (globalen) Bereicht ist? Was ja vielleicht teils auf das gleiche hinaus läuft: Das eben Änderungen dadurch ignoriert werden?
Win 7 / Lazarus 1.6 / FP 3.0.0 / x86_64-win64-win32/win64
Erwin
 
Beiträge: 216
Registriert: 16. Sep 2009, 13:15
OS, Lazarus, FPC: Xubuntu 16.04 / x86_64_linux-gtk 2 / L 1.6+dfsg-1 / FPC 3.0.0 | 
Nach oben

Beitragvon Mathias » 20. Jul 2018, 16:47 Re: Es kompiliert nicht alles

Vielleicht ist der Bug vom Threadersteller auf ähnliche Weise leicht zu beheben?

Mein Bug kann ich nur beheben, wen ich während der Entwicklung auf inline verzichte.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4324
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 25. Jul 2018, 20:48 Re: Es kompiliert nicht alles

Ich habe es mal im Typen Helper Kopf probiert. Nützt leider nichts, das Problem besteht weiterhin.
Code: Alles auswählen
type
  TIntegerHelper = type Helper for Integer
    procedure geti; inline// Versuch
  end;
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4324
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon kupferstecher » 26. Jul 2018, 10:06 Re: Es kompiliert nicht alles

Mathias, besteht bei dir nur noch das Problem, dass eine Änderung in Inlinefunktionen in anderen Units nicht übernommen wird, oder kompiliert es gar nicht mit inline-Schlüsselwort?

Wenn ersteres der Fall ist: Das Problem ist ja, dass der FPC fürs schnelle Compilieren nur die Dateien neu übersetzt, die sich auch geändert haben. Beim Inlinen wird der Code aber in den Code der anderen Unit eingebettet, die andere Unit müsste also ebenfalls neu übersetzt werden, obwohl sich der Quellcode selbst nicht geändert hat, nur die geinlineten Funktionen. Das zu wissen hilft vielleicht insofern weiter, dass man besser versteht wann das Problem genau auftritt und sich danach richten kann.
kupferstecher
 
Beiträge: 165
Registriert: 17. Nov 2016, 11:52

Beitragvon Mathias » 26. Jul 2018, 15:50 Re: Es kompiliert nicht alles

Also es ist so, wen ich den Result-Wert in der Unit2 ändere, wird die Änderung ignoriert.
Aber sobald ich was in der Unit1 ändere, Leerzeile einfügen genügt, bei Leerzeichen passiert nichts.

Ohh, jetzt habe ich gerade festgestellt, das die Funktion Test nackt ist, also keine Klasse oder Typenhelper.

Somit ist der Bug auch in nackten Funktionen nicht behoben. Und dies in der stable und Trunk.
Wen man weiter oben liest, war dieser Bug bei den nackten Funktionen mal behoben gewesen und ist jetzt wieder vorhanden.

PS: Ich habe dies im Wiki vermerkt: http://wiki.freepascal.org/Inline/de
Wen der Bug behoben ist, werde ich die Änderung wieder entfernen/ergänzen.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4324
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

• Themenende •
Vorherige

Zurück zu Benutzung der IDE



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste

porpoises-institution
accuracy-worried