Linux + PureBasic V5.22 - Probleme mit float und double

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Omi
Beiträge: 143
Registriert: 25.03.2013 09:59

Linux + PureBasic V5.22 - Probleme mit float und double

Beitrag von Omi »

Hallo!

Ich hab bei meinen ersten Versuchen mit PureBasic - Linux festgestellt, dass API-Funktionen mit Parametern mit dem Datentyp 'Double' oder 'Float' selten korrekt funktionieren.

Dies betrifft beispielsweise:
ListIconGadgets - Spaltenausrichtung: Diese wird per Werte 0.0, 0.5, 1.0 links-, mittig, oder rechtsbündig eingestellt und funktioniert in den Spalten, jedoch nicht im Header (gtk_tree_view_column_set_alignment ()).
SpinGadgets: Egal ob manipulierte PureBasic-SpinGadgets oder selbst erstellte APIs (gtk_spin_button_new_). Nichts funktioniert korrekt, wenn Fließkomma-Werte übergeben werden.
TextGadget: Versucht man die Drehrichtung zu ändern (gtk_label_set_angle(GadgetID(#Text1), 90.0)) bleiben diese standardmäßig auf 0° gedreht.

Beispiel:

Code: Alles auswählen

ImportC ""
	gtk_label_set_angle(*label.GtkLabel, angle.d)
EndImport

EnableExplicit

; Object constants
#MainWin= 0
#Text1   = 0

#WinX=300
#WinY=200
#WinW=250
#WinH=200

Global.l gEvent, gQuit


If OpenWindow(#MainWin, #WinX, #WinY, #WinW, #WinH, "TextGadget - with angle", #PB_Window_SystemMenu)
	TextGadget(#Text1, 5, 120, 100, 25, "vert. Text")
	
	gtk_label_set_angle(GadgetID(#Text1), 90.0)
	
	Repeat
		gEvent= WaitWindowEvent()
		
		Select gEvent
			Case #PB_Event_CloseWindow
				gQuit= #True
		EndSelect
		
	Until gQuit
EndIf
Sobald ein gdouble oder gfloat-Dateityp als Parameter vorkommt gibts anscheinend Probleme.
Könnte dies ein Linux-Bug, ein Installationsproblem von PureBasic oder Linux oder User-Bug :roll: sein?

Gruß und Danke erst mal
Charly

Rechner 64Bit, Linux Xubuntu 13.10 (32Bit), PureBasic 5.22LTS (32Bit)
PureBasic Linux-API-Library: http://www.chabba.de
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Linux + PureBasic V5.22 - Probleme mit float und double

Beitrag von edel »

Unter gtk3 funktioniert es. Hast du es testweise mal mit einer anderen Sprache probiert?
Omi
Beiträge: 143
Registriert: 25.03.2013 09:59

Re: Linux + PureBasic V5.22 - Probleme mit float und double

Beitrag von Omi »

Hallo edel,

danke für die Antwort.

Du hast Recht mit Gtk3!
Auch hab ich jetzt die häufig im Forum gefundene Aussage 'unter Gtk3' geregelt bekommen, das vermeintlich vorhandene Gtk3 nachinstalliert, und in Compiler-Optionen bei Library Subsystem 'gtk3' eingetragen.
Das TextGadget im Beispiel dreht jetzt ordentlich die 90° was es unter Gtk2 ja eigentlich auch tun müßte???

Leider bringt die Umstellung (bzw. Hinzufügung) auf Gtk3 aber einige Nebenwirkungen wie Linkerfehler, z.T. deutlich geänderte Gadgetgrößen, Einrückungen etc. Da hat sich wohl einiges unter der Haube getan mit dem PureBasic noch nicht umgehen kann.

Aber gut zu wissen wo der Wind herweht.

Danke Dir.

Charly
PureBasic Linux-API-Library: http://www.chabba.de
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: Linux + PureBasic V5.22 - Probleme mit float und double

Beitrag von Shardik »

Omi hat geschrieben:TextGadget: Versucht man die Drehrichtung zu ändern (gtk_label_set_angle(GadgetID(#Text1), 90.0)) bleiben diese standardmäßig auf 0° gedreht.
Die GTK2-Dokumentation zu gtk_label_set_angle() weist auf folgende Einschränkungen hin:
GTK2-Dokumantation zu gtk_label_set_angle() hat geschrieben:The angle setting for the label is ignored if the label is selectable, wrapped, or ellipsized.
PureBasic hat aber standardmäßig Wrapping (d.h. das Umbrechen von Text, der nicht in das TextGadget paßt) für das TextGadget eingeschaltet, sodass das Drehen des Textes nicht funktioniert. Eine Abhilfe ist also äußerst einfach: vor gtk_label_set_angle() muß die folgende Zeile eingefügt werden, um das Wrapping abzuschalten:

Code: Alles auswählen

   gtk_label_set_line_wrap_(GadgetID(#Text1), #False)
Warum dies mit dem Subsystem gtk3 nicht nötig ist, ist mir ein Rätsel, denn auch mit dem Subsystem gtk3 sollte die Änderung der Drehrichtung bei eingeschaltetem Wrapping laut GTK3-Dokumentation nicht funktionieren!
Omi
Beiträge: 143
Registriert: 25.03.2013 09:59

Re: Linux + PureBasic V5.22 - Probleme mit float und double

Beitrag von Omi »

Danke Shardik,

mea culpa!

Hatte es in der Gtk3-Doku gelesen und auch das PureBasic-Verhalten bemerkt, aber die Kombination :roll:
Hier wars also nix mit meiner Fließkomma-Theorie - war auch ein wenig relavantes Beispiel.

Bei folgendem brauchbarerem Beispiel (Umsetzung ist geklaut) hilft jedoch auch gtk3 nix - die Text bleiben linksbündig:

Code: Alles auswählen

;LINUX - Column-Header-Alignment ...
; Alignment: 0.0 = Left, 0.5 = Center, 1.0 = Right

; Object constants
#MainWin= 0
#LIG    = 0

#WinX= 300
#WinY= 200
#WinW= 320
#WinH= 280

Global.l gEvent, gQuit

Procedure SetListIconColumnFormat(Gadget, Colmn, Alignment.f)
	Protected *Column
	*Column = gtk_tree_view_get_column_(GadgetID(Gadget), Colmn) 
	If *Column
		gtk_tree_view_column_set_alignment_(*Column, Alignment);    header-alignment - without function
		gtk_widget_queue_draw_(GadgetID(Gadget));                   force Redraw
	EndIf
EndProcedure

Procedure CreateWindow_Main()
	Protected.i I

	If OpenWindow(#MainWin, #WinX, #WinY, #WinW, #WinH, "Column-Header alignment", #PB_Window_SystemMenu)
		ListIconGadget(#LIG, 5, 5, 310, 270, "linksbündig", 100)
		AddGadgetColumn(#LIG, 1, "mittig", 100)
		AddGadgetColumn(#LIG, 2, "rechtsbündig", 100)

		For I= 1 To 10
			AddGadgetItem(#LIG, -1, Str(I) + " / 1" + #LF$ + Str(I) + " / 2" + #LF$ + Str(I) + " / 3")
		Next I
	EndIf

EndProcedure

CreateWindow_Main()

SetListIconColumnFormat(#LIG, 0, 0.0);    JustifyColumnLeft
SetListIconColumnFormat(#LIG, 1, 0.5);    JustifyColumnCenter
SetListIconColumnFormat(#LIG, 2, 1.0);    JustifyColumnRight

Repeat
	gEvent= WaitWindowEvent()

	Select gEvent
		Case #PB_Event_CloseWindow
			gQuit= #True
	EndSelect
	
Until gQuit
Grüße
Charly
PureBasic Linux-API-Library: http://www.chabba.de
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Linux + PureBasic V5.22 - Probleme mit float und double

Beitrag von edel »

Vergiss das mit der Api, GTK ist sehr schlecht eingepflegt. Entweder schreibst du die den Import selber oder du kannst ein Programm von Remi nutzen http://www.forums.purebasic.com/english ... 14&t=43681. Damit laesst es sich besser arbeiten.

In dem Fall von gtk_tree_view_column_set_alignment_ wird ein Integer uebergeben und kein Float. Das ist ein Bug in der Purebasic!
Am besten die die GTK Api entfernen und selber schreiben /:->

Code: Alles auswählen

ImportC ""
	gtk_tree_view_column_set_alignment(*g, a.f)
EndImport
Das sollte helfen.
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: Linux + PureBasic V5.22 - Probleme mit float und double

Beitrag von Shardik »

Du solltest Dir einfach ein funktionierendes Beispiel wie das von freak (nur für Linux) oder von mir (plattformübergreifend für Windows, Linux und MacOS) anschauen und für Deine Zwecke abwandeln, weil das Ganze doch ein wenig komplexer ist... :wink:
Omi
Beiträge: 143
Registriert: 25.03.2013 09:59

Re: Linux + PureBasic V5.22 - Probleme mit float und double

Beitrag von Omi »

Herzlichen Dank, Shardik und edel!

Hab schon gemerkt, ihr habt Recht und ich geb (vorerst mal) Ruh!
Der Teufel steckt hier noch schwer im Detail und z.T. auch noch in den Fließkommas :wink:

In obigem Beispiel hilft tatsächlich der Tausch des (fehlerhaft implementierten)
gtk_tree_view_column_set_alignment_(*Column, Alignment)
gegen ein ...

Code: Alles auswählen

ImportC ""
	gtk_tree_view_column_set_alignment(*tree_column, xalign.f)
EndImport
und obiges Beispiel funktioniert, wie edel sagt. Das Beispiel war ein Auszug aus freak's Routine und die hat das selbe Problem!

Ich bin grad auf Linux-API-Entdeckungsreise, probiere wahllos Erweiterungen für Gadgets aus der Gtk-Doku durch und sammle funktionierende Routinen.
Vielleicht reichts ja mal zu einer kleinen Linux-API-Sammlung ala RSBasic's WinAPI Library.

Danke Euch und schönen Tag
Charly
PureBasic Linux-API-Library: http://www.chabba.de
Omi
Beiträge: 143
Registriert: 25.03.2013 09:59

Re: Linux + PureBasic V5.22 - Probleme mit float und double

Beitrag von Omi »

Sodele,

ich hab noch ein paar Linux PureBasic-API-Funktionen ausgemacht, die in der Basic-Version mit Unterstrich unter derzeitigem Standard gtk2 nicht korrekt funktionieren.
Alle haben Parameter des Typs gfloat oder gdouble!
Beispiel: gtk_button_set_alignment_(*button.GtkButton, xalign.f, yalign.f)

Diese bisher gefundenen Funktionen sollten importiert und ohne Unterstriche aufgerufen werden ...

Code: Alles auswählen

ImportC "";  Replacements for PureBasic-implementations with 'float'/'double'-bugs
	gtk_adjustment_new(value.d, lower.d, upper.d, step_increment.d, page_increment.d, page_size.d)
	gtk_spin_button_new(*adjustment.GtkAdjustment, climb_rate.d, digits.i)
	gtk_spin_button_new_with_range(min.d, max.d, step_.d)
	
	gtk_entry_set_alignment(*entry.GtkEntry, xalign.f)
	
	gtk_label_set_angle(*label.GtkLabel, angle.d)
	
	gtk_button_set_alignment(*button.GtkButton, xalign.f, yalign.f)
EndImport
Und das sind mit Sicherheit nicht alle mit diesem Problem.

Charly
PureBasic Linux-API-Library: http://www.chabba.de
Antworten