Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Berkeley
Anmeldungsdatum: 13.05.2024 Beiträge: 97
|
Verfasst am: 15.08.2024, 18:05 Titel: WSTRING als Rückgabewert |
|
|
- scheint nicht möglich.
Also dass man ne FUNCTION macht mystring=myfunc(), PRINT myfunc()... alles als WSTRING... NICHT WSTRING PTR...
Komisch, weil bei den eingebauten FreeBASIC-Funktionen geht's ja auch... |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4709 Wohnort: ~/
|
Verfasst am: 15.08.2024, 20:48 Titel: |
|
|
WSTRING (und ZSTRING) ist eigentlich immer ein Pointer. Ich glaube, die Builtin-Funktionen von FreeBASIC verstecken das nur., so wie es letztlich bei den WSTRINGs fester Länge versteckt wird.
Dass man keine fixed-length-WSTRINGs übergeben kann, hat vielleicht desselben Grund wie dass nur dynamische Arrays übergeben werden können (genauer gesagt: statische Arrays können zwar übergeben werden, werden dann aber in der Funktion wie dynamische Arrays behandelt). _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Monika
Anmeldungsdatum: 03.07.2025 Beiträge: 6
|
Verfasst am: 09.10.2025, 18:43 Titel: |
|
|
Du hast recht, das ist tatsächlich eine Einschränkung in FreeBASIC. Benutzerdefinierte Funktionen können WSTRING leider nur als PTR zurückgeben, nicht direkt als Wert. Die internen Funktionen sind da speziell implementiert. Als Workaround kannst du einen WSTRING-Puffer außerhalb der Funktion bereitstellen oder einen WSTRING PTR zurückgeben und später mit DEALLOCATE freigeben. Ist nicht ganz elegant, aber momentan die beste Lösung. Hoffe, das hilft dir trotzdem! |
|
Nach oben |
|
 |
Berkeley
Anmeldungsdatum: 13.05.2024 Beiträge: 97
|
Verfasst am: 10.10.2025, 16:25 Titel: |
|
|
Code: |
SUB UTF8TOUTF16(BYVAL source AS STRING, BYREF destination AS WSTRING, BYVAL size AS INTEGER)
DIM AS INTEGER i, i2, l
DIM AS UBYTE c
' #todo:/#note: only working on Little Endian systems
' big endian code should convert everything internally into Little Endian encoding
destination[0]=&hFEFF
l=LEN(source)
i=0
i2=1
WHILE i2<size AND i<l
c=source[i]
IF c>127 THEN
destination[i2]=UTF8GETCODE(MID(source, i+1))
' the first bits are telling how long a UTF-8 code is
' (maximum 4 bytes)
IF (c AND 224)=192 THEN
i+=2
ELSEIF (c AND 240)=224 THEN
i+=3
ELSE
i+=4
ENDIF
ELSE
destination[i2]=c
i+=1
ENDIF
i2+=1
WEND
IF i2>=size THEN i2=size-1
destination[i2]=0
END SUB
|
|
|
Nach oben |
|
 |
|