Erste Gehversuche mit GTK2

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Mathias
Beiträge: 6207
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Erste Gehversuche mit GTK2

Beitrag von Mathias »

Die C(++) Coder drehen die Exception-Mask immer auf disabled, weil sie zu faul sind, ihre Fehler zu suchen. Ist bei der Syntax ja auch schwer.
Was ich immer noch nicht begreife.
Wieso wird überhaut eine float Exception ausgelöst ?
Hat es in der gtklib einen Bug ?
Rechnet GTK intern mit Float-Zahlen ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6213
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: Erste Gehversuche mit GTK2

Beitrag von af0815 »

An unhandled exception occurred at $00007FB26895E4DB:
EInvalidOp: Invalid floating point operation
https://www.freepascal.org/docs-html/rt ... lidop.html

warum EInvalidOP ausgelöst wird, kannst du maximal in einem gtk Spezialforum erfragen.
Folgende Info habe ich auch noch gefunden
EInvalidOp is raised when the CPU encounters an undefined instruction (see the UD2 instruction), invalid operation, or floating-point stack overflow.
Suche auch mal nach EInvalidOp auf https://wiki.freepascal.org/Multiplatfo ... ming_Guide

Kurze Antwort: Es ist so, ignoriere es einfach.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: Erste Gehversuche mit GTK2

Beitrag von Mathias »

Suche auch mal nach EInvalidOp auf https://wiki.freepascal.org/Multiplatfo ... ming_Guide
Schön beschrieben. somit pfuscht die GTKlib in die Pascal Norm rein.
Kurze Antwort: Es ist so, ignoriere es einfach.
Die wird wohl das Beste sein.

Ich habe vorhin mit "gtk_entry" rumgespielt, da tritt der Fehler auch ein, sobald man dort den Text mit der rechten Maustaste in die Zwischenablage kopieren will.

Somit muss man sich wohl oder übel angewöhnen, die "SetExceptionMask("-Zeile in die GTK2 Programme einzufügen. Auch wen es nicht schön ist.

Wen ich es richtig verstehe, arbeitet der FPC und C/C++ Compiler ganz anders was die Float-Exception anbelangt ?

Was einfach recht übel ist, das einem der ganze Fenstermanager abschmiert, wen man dies nicht beachtet.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6213
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: Erste Gehversuche mit GTK2

Beitrag von af0815 »

Mathias hat geschrieben:
So 5. Feb 2023, 18:28
Wen ich es richtig verstehe, arbeitet der FPC und C/C++ Compiler ganz anders was die Float-Exception anbelangt ?
Das Exception Handling ist beim FPC ziemlich gut umgesetzt, man darf nicht vergessen jede Plattform hat da so seine Eigenheiten. C hat halt einfache Lösungen offensichtlich gesucht, was überall funktioniert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Roland Chastain
Beiträge: 156
Registriert: Sa 7. Jul 2012, 21:50
Wohnort: Saargemünd
Kontaktdaten:

Re: Erste Gehversuche mit GTK2

Beitrag von Roland Chastain »

Hallo zusammen!

Ich habe dieses Tutorial gefunden, das sehr gut gemacht aussieht. Es ist auf Französisch, aber es gibt Codebeispiele.

https://fr.wikibooks.org/wiki/Catégorie ... al_(livre)
Petit poisson deviendra grand,
Pourvu que Dieu lui prête vie.

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

Re: Erste Gehversuche mit GTK2

Beitrag von Mathias »

Roland Chastain hat geschrieben:
So 5. Feb 2023, 21:04
Hallo zusammen!

Ich habe dieses Tutorial gefunden, das sehr gut gemacht aussieht. Es ist auf Französisch, aber es gibt Codebeispiele.

https://fr.wikibooks.org/wiki/Catégorie ... al_(livre)
Cool, und erst noch in FPC.

Da habe ich folgendes gefunden.
https://fr.m.wikibooks.org/wiki/Program ... geMenuItem
Das ist doch genau das Beispiel, was bei mir den Absturz verursacht hat.
Aber da finde ich nirgends die Unit math.

Dies muss ich bei Gelegenheit testen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Erste Gehversuche mit GTK2

Beitrag von Winni »

Mathias hat geschrieben:
So 5. Feb 2023, 21:48
Aber da finde ich nirgends die Unit math.
Die Unit math brauchst Du, wenn Du die Exeption-Mask setzen willst.

Winni

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: Erste Gehversuche mit GTK2

Beitrag von PascalDragon »

Winni hat geschrieben:
Sa 4. Feb 2023, 14:19
Erst im 486er wurde ab Werk die FPU eingebaut. Übrigens das letzte PC-Model ohne Lüfter-Lärm..
Ich sitze hier an einem Tablet mit passiv gekühltem i7-7Y75 ;)
FPC Compiler Entwickler

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

Re: Erste Gehversuche mit GTK2

Beitrag von Mathias »

Ich versuche ein Menü mit TGtkItemFactoryEntry aufzubauen, was optisch auch klappt.

Als Muster für die Deklaration habe ich folgende Beispiel genommen:
https://stuff.mit.edu/afs/sipb/project/ ... x1602.html
Zum Beenden, wir folgendes aufgerufen:

Code: Alles auswählen

 { "/File/Quit",     "<control>Q", gtk_main_quit, 0, NULL },
Für eine eigene Funktion so:

Code: Alles auswählen

 { "/File/_Save",    "<control>S", print_hello, 0, NULL },
Somit ist gtk_main_quit und print_hello das selbe in der deklaration.

In Pascal sieht es so aus:

Code: Alles auswählen

    procedure menu_click_msg(widget: PGtkWidget; Data: gpointer);
    begin
      WriteLn('menu click');
    end;
    ...
    
  (path: '/Datei/Beenden'; accelerator: '<control>q'; callback: @gtk_main_quit; callback_action: 0; item_type: nil; extra_data: nil),
  ...
    (path: '/Hilfe/About...'; accelerator: 'F1'; callback: @menu_click_msg; callback_action: 0; item_type: nil; extra_data: nil)
Nur motz er da mit folgender Meldung:

Code: Alles auswählen

project1.lpr(35,58) Error: Incompatible types: got "<address of procedure(PGtkWidget;Pointer);Register>" expected "<procedure variable type of procedure;CDecl>"
Mache ich eine kurlige Typenumwandlung, geht es:

Code: Alles auswählen

  (path: '/Hilfe/About...'; accelerator: 'F1'; callback: TGtkItemFactoryCallback(@menu_click_msg); callback_action: 0; item_type: nil; extra_data: nil)
Ich vermute mal, das dies nicht die richtige Lösung ist.
Jemand ein besserer Vorschlag ?

Meine Versuchs-Source: https://github.com/sechshelme/Lazarus-G ... temFactory
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Erste Gehversuche mit GTK2

Beitrag von Mathias »

Jemand ein besserer Vorschlag ?
Keiner eine Idee ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Erste Gehversuche mit GTK2

Beitrag von Socke »

Code: Alles auswählen

project1.lpr(35,58) Error: Incompatible types: got "<address of procedure(PGtkWidget;Pointer);Register>" expected "<procedure variable type of procedure;CDecl>"
In C wird eine andere Aufrufkonvention als in Pascal verwendet. Die Aufrufkonvention regelt, in welcher Reihenfolge Parameter und Rückgabewerte auf dem Stack abgelegt oder in Registern übergeben werden und wer (aufrufende oder gerufene Prozedur) den Stack wieder aufräumt.
Für C-Code kann man cdecl annehmen. Windows hingegen setzt auf stdcall. (Gilt für x86)

Code: Alles auswählen

    procedure menu_click_msg(widget: PGtkWidget; Data: gpointer); cdecl; // Aufrufkonvention ändern
    begin
      WriteLn('menu click');
    end;
Alles andere führt im Zweifelsfall zu ganz großem Durcheinander auf dem Stack.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: Erste Gehversuche mit GTK2

Beitrag von Mathias »

Ich habe es so probiert, aber es wird ein ähnlicher Fehler ausgespuckt.

Code: Alles auswählen

    procedure menu_click_msg(widget: PGtkWidget; Data: gpointer); cdecl;
Mit cdecl

Code: Alles auswählen

project1.lpr(43,59) Error: Incompatible types: got "<address of procedure(PGtkWidget;Pointer);CDecl>" expected "<procedure variable type of procedure;CDecl>"
ohne cdecl

Code: Alles auswählen

project1.lpr(43,59) Error: Incompatible types: got "<address of procedure(PGtkWidget;Pointer);Register>" expected "<procedure variable type of procedure;CDecl>"
Einziger Unterschied in der Meldung "CDecl" und "Register".
Ich habe noch eine Umwandlung mit G_CALLBACK( probiert, so wie es bei g_signal_connect( verwendet wird. Auch dies ist nicht kompatibel.

Ist das ganze wieder mal ein Murkst von C, das es dort funktioniert ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1436
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Erste Gehversuche mit GTK2

Beitrag von fliegermichl »

Die Fehlermeldung besagt, daß eine Parameterlose Procedure mit der Aufrufkonvention cdecl erwartet wurde.

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

Re: Erste Gehversuche mit GTK2

Beitrag von Mathias »

fliegermichl hat geschrieben:
Di 14. Feb 2023, 10:09
Die Fehlermeldung besagt, daß eine Parameterlose Procedure mit der Aufrufkonvention cdecl erwartet wurde.
Danke, leider hast du recht.
Stimmt, sie muss leer sein.

Code: Alles auswählen

    procedure test_proc(widget: PGtkWidget); cdecl;
    begin
      WriteLn('menu click');
    end;
Das ist echt schade, das es nur eine Procedure ohne Parameter ist.
Somit muss man für jeden Menu-Punkt eine eigene Procedure nehmen.
Mit "g_signal_connect(", kann man einen Data-Pointer mitgeben, welcher man innerhalb der Procedure auswerten kann.

Zum Trost habe ich hier gelesen, das GtkItemFactoryEntry sowieso veraltet ist. https://www.csparks.com/gtk2-html-2.24. ... ctoryEntry
Was gibt es da für eine Alternativfunktion ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Erste Gehversuche mit GTK2

Beitrag von theo »

Mathias hat geschrieben:
So 19. Feb 2023, 15:16
Zum Trost habe ich hier gelesen, das GtkItemFactoryEntry sowieso veraltet ist. https://www.csparks.com/gtk2-html-2.24. ... ctoryEntry
Was gibt es da für eine Alternativfunktion ?
Die Frage ist und bleibt: Was willst du damit?
GTK2 als von der LCL losgelöstes System ist seit 2011 generell "veraltet". In der LCL ist es als Multi-Platform-Layer mMn nach wie vor sinnvoll.

Warum machst du "erste Gehversuche" mit einem System, welches seit 12 Jahren zwei Nachfolger (3,4) hat?
Ich verstehe deine Motivation manchmal einfach nicht.
"Erste Gehversuche" kannst du ja mit GTK4 machen.

Antworten