Die Funktion Ascii() gibt einen Zeiger auf einen Speicherbereich zurück, der mit FreeMemory() wieder freigegeben werden muss. In der Hilfe zu FreeMemory() steht, dass nur ein Wert übergeben werden darf, der von Allocate- oder ReAllocateMemory() stammt.
Darf man annehmen, dass die zurückgegebenen *MemoryIDs der Memory-Funktionen, nur Zeiger auf Speicherbereiche sind? Darf man diese *MemoryIDs mit den Zeigern von anderen Funktionen, wie eben Ascii(), vermischen?
Wie funktioniert die Funktion MemorySize() mit einem Zeiger von Ascii()? Oder darf man dafür nur MemoryStringLength() verwenden?
Es funktioniert anscheinend mit beiden Funktionen richtig, aber ist das immer der Fall?
Ich habe mich jetzt endgültig entschlossen, von Xojo nach PureBasic zu wechseln, darum diese vielleicht seltsamen Fragen.
Peter
Memory-Lib, Ascii() u. Hilfe-Dok.
Re: Memory-Lib, Ascii() u. Hilfe-Dok.
jup, kannst einfach mit FreeMemory() freigeben. Mit größter Wahrscheinlichkeit funktioniert das auch mit MemorySize(), da dort auch nur Betriebsystemfunktionen aufgerufen werden. *ABER* es ist nicht garantiert, dass das in zukünftigen Funktionen auch so bleibt! Von da her ist StringByteLength die sichere Wahl.
edit: Eventuell sollte man das in der Anleitung bei FreeMemory() aufnehmen, das man da UTF8() und ASCII() freigeben kann... /edit
Jenachdem was du mit den Text machst, ist es eventuell sinnvoller, lieber UTF8 zu verwenden. Dann werden auch alle Sonderzeichen korrekt gehandhabt. Das schöne an UTF8 ist, das es in Bereich ASCII-wert <128 identisch mit der ASCII-Tabelle ist.
ich hab mir übrigens eine kleine Routine geschrieben:
mit _FastUTF8() wird der Speicher nicht immer gleich freigegeben, sondern man behält ihn. Wenn man öfters kleinere Texte übersetzen muss, spart man sich das dauernde Freigeben und reservieren. Hat natürlich auch nachteile, wenn ein Befehl zwei UTF8-Strings braucht, klappt das nicht, weil beim setzen des zweiten der erste Freigegeben wird.
edit: Eventuell sollte man das in der Anleitung bei FreeMemory() aufnehmen, das man da UTF8() und ASCII() freigeben kann... /edit
Jenachdem was du mit den Text machst, ist es eventuell sinnvoller, lieber UTF8 zu verwenden. Dann werden auch alle Sonderzeichen korrekt gehandhabt. Das schöne an UTF8 ist, das es in Bereich ASCII-wert <128 identisch mit der ASCII-Tabelle ist.
ich hab mir übrigens eine kleine Routine geschrieben:
Code: Alles auswählen
Procedure _fastUTF8(str.s="")
Static *buf,bufsize
Protected needed
If str=""
If *buf
FreeMemory(*buf)
*buf=0
EndIf
ProcedureReturn 0
EndIf
needed=StringByteLength(str,#PB_UTF8)+1;null-terminated
If *buf=0 Or bufsize<needed
If *buf
FreeMemory(*buf)
EndIf
bufsize=needed:If bufsize<1024:bufsize=1024:EndIf
*buf=AllocateMemory(bufsize)
EndIf
If *buf
PokeS(*buf,str,-1,#PB_UTF8)
EndIf
ProcedureReturn *buf
EndProcedure
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Re: Memory-Lib, Ascii() u. Hilfe-Dok.
Danke für die Antwort, dann bleibe ich mit MemoryStringLength() lieber auf der sicheren Seite.
Ich sende Daten zu einem USBTMC-Gerät, darum benötige ich ASCII für die SCPI-Kommandos.
Die Kommunikation mit dem Gerät, mit Hilfe der Libusb funktionert schon.
Leider lässt die PB-Hilfe einiges an Vermutungen zu, da hilft dann nur ausprobieren.
Peter
Ich sende Daten zu einem USBTMC-Gerät, darum benötige ich ASCII für die SCPI-Kommandos.
Die Kommunikation mit dem Gerät, mit Hilfe der Libusb funktionert schon.
Leider lässt die PB-Hilfe einiges an Vermutungen zu, da hilft dann nur ausprobieren.
Peter