Migration de PureBasic 6.30 vers 6.40

Le gestionnaire de chaînes ayant été entièrement repensé pour la version 6.40, certains cas particuliers d'utilisation des chaînes de caractères peuvent ne plus fonctionner. À titre d'information, les chaînes PureBasic utilisent désormais un préfixe dont la longueur est mise en cache, elles ne s'arrêtent donc plus au premier caractère nul rencontré.

Bibliothèque String


L'option #PB_String_InPlace retiré pour ReplaceString().
  ; Ancien
  ReplaceString(a$, "H", "I", #PB_String_InPlace)
  
  ; Nouveau
  a$ = ReplaceString(a$, "H", "I")
Cette méthode sera légèrement plus lente qu'auparavant. Si vous avez besoin d'un remplacement de caractères « à la place de » très rapide, vous pouvez utiliser la solution ci-dessous.
Attention : la modification directe du tampon de chaînes doit être effectuée avec précaution afin d'éviter tout dépassement de capacité.
  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$ = "Bonjour le Monde !"

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

  Debug Test$

API Win32

Auparavant, lors de l'appel à une API Win32 renvoyant une chaîne de caractères, on utilisait généralement la fonction Space() pour cette chaîne. Désormais, la longueur de la chaîne étant mise en cache dans le nouveau gestionnaire de chaînes, il est nécessaire d'intercepter la chaîne renvoyée avec PeekS(). Il est également préférable d'éviter complètement l'utilisation de Space(), car il s'agit d'une solution de contournement. L'idéal est de rechercher Space() dans tout votre code et de vérifier si elle est utilisée lors d'appels de l'API.
  ; Ancien
  CurrentDirectory$ = Space(2000)
  GetCurrentDirectory_(2000, @CurrentDirectory$)
  
  ; Nouveau
  CurrentDirectory$ = Space(2000)
  GetCurrentDirectory_(2000, @CurrentDirectory$)
  CurrentDirectory$ = PeekS(@CurrentDirectory$) ; Garantit que la longueur de la chaîne est correctement mise à jour