Migration von PureBasic 6.30 nach 6.40

Da der gesamte String-Manager für Version 6.40 überarbeitet wurde, funktionieren einige Sonderfälle mit Strings nicht mehr. Zur Information: PureBasic-Strings verwenden nun ein Präfix mit zwischengespeicherter Länge, sodass die Verarbeitung nicht mehr beim ersten Nullzeichen abbricht.

String Bibliothek


Das Flag #PB_String_InPlace wurde bei ReplaceString() entfernt.
  ; Alt
  ReplaceString(a$, "H", "I", #PB_String_InPlace)
  
  ; Neu
  a$ = ReplaceString(a$, "H", "I")
Dies ist etwas langsamer als zuvor. Falls Sie eine sehr schnelle Zeichenersetzung direkt im String ("inplace") benötigen, können Sie die folgende Methode verwenden. Achtung: Das direkte Bearbeiten des String-Puffers muss mit Bedacht erfolgen, um einen Pufferüberlauf zu vermeiden.
  Procedure ReplaceChar(*String.Character, CharToSearch.c, CharToReplace.c)
    If *String = 0
      ProcedureReturn
    EndIf
    
    While *String\c
      If *String\c = CharToSearch
        *String\c = CharToReplace
      EndIf
      
      *String+SizeOf(Character)
    Wend
  EndProcedure

  Test$ = "Hello World !"

  ReplaceChar(@Test$, 'o', 'O')

  Debug Test$

Win32 API Aufruf

Ein üblicher Anwendungsfall beim Aufruf von Win32-API, die einen String-Puffer zurückgibt, war die Verwendung von Space() für diesen Puffer. Da die Stringlänge nun im neuen String-Manager zwischengespeichert wird, muss der zurückgegebene String mittels PeekS() "abgefangen" werden. Es empfiehlt sich, die Verwendung von Space() ganz zu vermeiden, da es sich hier um eine Art "Hack" handelt. Am besten suchen Sie in Ihrem gesamten Code nach Space() und prüfen, ob es für API-Aufrufe verwendet wird.
  ; Alt
  CurrentDirectory$ = Space(2000)
  GetCurrentDirectory_(2000, @CurrentDirectory$)
  
  ; Neu
  CurrentDirectory$ = Space(2000)
  GetCurrentDirectory_(2000, @CurrentDirectory$)
  CurrentDirectory$ = PeekS(@CurrentDirectory$) ; Stellt sicher, dass die Zeichenkettenlänge korrekt aktualisiert wird.