Pseudotypes und Arrays

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Makke
Beiträge: 156
Registriert: 24.08.2011 18:00
Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
Wohnort: Ruhrpott
Kontaktdaten:

Pseudotypes und Arrays

Beitrag von Makke »

Hallo zusammen,

ich habe gerade festgestellt, dass Pseudotypes anscheinend nicht mit Arrays arbeiten.

Code: Alles auswählen

ImportC ""
  gdk_pixbuf_savev (*pixbuf, filename.p-utf8, type.p-utf8, Array option_keys.p-utf8(1), Array option_values.i(1), *error.GError)
EndImport
filename und type funktionieren, der Array option_keys() jedoch nicht. Wenn ich einen Array mit option_keys.s(3) definiere, dann kommt bei der Übergabe die Fehlermeldung:

Code: Alles auswählen

[15:21:56] [COMPILER] Zeile 222: Array stimmt nicht mit dem Prozedur-Parameter  berein.
Wenn ich den Import dann ohne Pseudotype mache:

Code: Alles auswählen

gdk_pixbuf_savev (*pixbuf, filename.p-utf8, type.p-utf8, Array option_keys.s(1), Array option_values.i(1), *error.GError)
bekomme ich die Fehlermeldung:

Code: Alles auswählen

[15:24:33] [WARNING] GdkPixbuf (WARNING): Unrecognized parameter (Dا) passed to JPEG saver.
Und das obwohl die Strings im Array vorher zu UTF8 umwandle. Weiß jemand Rat ?
---
Windows 11 (64 bit)
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Pseudotypes und Arrays

Beitrag von Bisonte »

Und das obwohl die Strings im Array vorher zu UTF8 umwandle.
Wie denn ?

Wenn PB ein Array mit Strings hat, sind die Strings auch in Unicode, wenn in Unicode Modus kompiliert wird.

Jetzt müsste man sich überlegen, wie man PB überredet, dass es die Strings im Array im UTF8 Modus hält.
Eigentlich müsste es reichen wenn nur die Speicherbereiche im Array stehen. Also die Pointer die auf die Strings zeigen,
die in UTF8 umgewandelt wurden.

Dann ist es wieder ein Array options_keys.i() und somit kein Problem mehr.
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Omi
Beiträge: 143
Registriert: 25.03.2013 09:59

Re: Pseudotypes und Arrays

Beitrag von Omi »

Hallo Makke,
Bisonte hat völlig recht.

Sieh Dir bitte mal das Beispiel unter http://www.chabba.de/Linux/Dialog/Dialog_About_5.pb an.
'Documenters', 'authors' und 'credit_section' wird hier als Pointer auf ein UTF8-String-Array übergeben das in PB aufgebaut wird.
Geht bestimmt noch eleganter, aber funktioniert so zumindest als Ascii- und Unicode-Executable.
Irgendwo im englischen Forum gibt's noch ein Beispiel in dem das Array manuell im Speicher aufgebaut wird, soweit ich mich erinnern kann.

Gruß, Charly
PureBasic Linux-API-Library: http://www.chabba.de
Benutzeravatar
Makke
Beiträge: 156
Registriert: 24.08.2011 18:00
Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
Wohnort: Ruhrpott
Kontaktdaten:

Re: Pseudotypes und Arrays

Beitrag von Makke »

Hallo,

danke für die Antworten, zunächst, es funktioniert jetzt wie es soll, ich weiß nicht ob es an der 5.43LTS lag, aber der gleiche Code mit der 5.44LTS funktioniert jetzt:

Code: Alles auswählen

EnableExplicit

ImportC ""
  g_error_free (*error.GError)
  gdk_pixbuf_get_width  (*pixbuf)
  gdk_pixbuf_get_height (*pixbuf)
  gdk_pixbuf_new_from_file (filename.p-utf8, *error.GError)
  gdk_pixbuf_new_from_file_at_scale (filename.p-utf8, width.i, height.i, preserve_aspect_ratio.b, *error.GError)
  gdk_pixbuf_save  (*pixbuf, filename.p-utf8, type.p-utf8, *error.GError) As "gdk_pixbuf_save"
  gdk_pixbuf_save1 (*pixbuf, filename.p-utf8, type.p-utf8, *error.GError, key1.p-utf8, val1.p-utf8, terminate.b = #Null) As "gdk_pixbuf_save"
  gdk_pixbuf_save2 (*pixbuf, filename.p-utf8, type.p-utf8, *error.GError, key1.p-utf8, val1.p-utf8, key2.p-utf8, val2.p-utf8, terminate.b = #Null) As "gdk_pixbuf_save"
  gdk_pixbuf_savev (*pixbuf, filename.p-utf8, type.p-utf8, *option_keys, *option_values, *error.GError)
EndImport

Define.i       newpix
Define.GError  *error

Dim keys.s(3)
Dim values.s(3)

Macro toUTF8(Text, Var)
  Var = Space(Len(Text))+1
  PokeS(@Var, Text, Len(Text), #PB_UTF8)
EndMacro

;keys(0)   = "quality"
toUTF8("quality", keys(0))
;values(0) = "50"
toUTF8("50", values(0))


If OpenWindow(0, 0, 0, 800, 600, "PIXBUF Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  
  If ImageGadget(0, 0, 0, WindowWidth(0), WindowHeight(0), 0)
    
    newpix = gdk_pixbuf_new_from_file_at_scale (#PB_Compiler_Home + "examples/sources/Data/PureBasic.bmp", GadgetWidth(0), GadgetHeight(0), #True, @*error)
    
    If newpix = 0 Or *error <> 0
      Debug *error\domain
      Debug *error\code
      Debug PeekS(*error\message, -1, #PB_Ascii)
      g_error_free(*error)
    Else
      SetGadgetState(0, newpix)
      Debug "ImageSize: " + Str(gdk_pixbuf_get_width(newpix)) + "x" + Str(gdk_pixbuf_get_height(newpix))
      ;gdk_pixbuf_save1(newpix, "PureBasic.jpg", "jpeg", @*error, "quality", "50")
      gdk_pixbuf_savev(newpix, "PureBasic.jpg", "jpeg", keys(), values(), @*error)
    EndIf
    
  EndIf
  
EndIf

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

End
Soweit so gut.

Nun zu den Antworten, Bisonte meint, dass die Strings im Speicher (umgewandelt) bleiben und ich in dem Array nur die Adressen speichere und übergebe (also als Integer Array). Omi will jedoch ein String Array aufbauen und das dann übergeben. Ersteres habe ich nicht probiert, die zweite Variante hat bisher immer gut funktioniert, außer bei dieser Funktion (möglicherweise hatte das mit einem Bug in 5.43 zu tun).

Was mich an der ganzen Sache noch wundert, wenn ich einer Prozedure/Funktion ein Array mit dem Schlüsselwort "Array" übergebe, passiert die gemäß Anleitung als Referenz. Trotzdem ändert PureBasic die Formatierung der Strings, finde ich irgendwie merkwürdig.

Das ändert aber an der Grundproblematik nichts, das Pseudotypen nicht mit (String-)Arrays zusammen arbeiten und das man Pseudotypes keine Defaultwerte übergeben kann:

Code: Alles auswählen

 gdk_pixbuf_save  (*pixbuf, filename.p-utf8, type.p-utf8, *error.GError = #Null) ;<-- geht
 gdk_pixbuf_save  (*pixbuf, filename.p-utf8, type.p-utf8 = "jpeg", *error.GError = #Null) ;<-- SyntaxError
Dann wird ein Syntax-Fehler ausgegeben. Vielleicht sollte das auf die ToDo Liste.
---
Windows 11 (64 bit)
Antworten