Memory-Lib, Ascii() u. Hilfe-Dok.

Anfängerfragen zum Programmieren mit PureBasic.
PeDre
Beiträge: 13
Registriert: 19.12.2014 11:22
Wohnort: Wien

Memory-Lib, Ascii() u. Hilfe-Dok.

Beitrag von PeDre »

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
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Memory-Lib, Ascii() u. Hilfe-Dok.

Beitrag von GPI »

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:

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
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.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
PeDre
Beiträge: 13
Registriert: 19.12.2014 11:22
Wohnort: Wien

Re: Memory-Lib, Ascii() u. Hilfe-Dok.

Beitrag von PeDre »

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
Antworten