Les fonctions du compilateur
DescriptionSizeOf(Type)
La commande SizeOf permet de renvoyer la taille en octets que prendra une structure complexe (ne fonctionne pas avec les types de base tels que les 'long', les 'word' etc.), une interface ou même une variable. C'est très utile dans de nombreux cas, notamment lors de l'utilisation des commandes API.
Note : Dans le mode unicode un caractère occupe 2 octets. Dans le mode ASCII un caractère occupe 1 octet. Sizeof(Character) permet de renvoyer la taille en octets que prend un caractère selon le mode activé.
Exemple
Structure Personne
Nom.s
Prenom.s
Age.w
EndStructure
Debug "La taille d'une personne est "+Str(Sizeof(Personne))+" octets" ; Affichera 10 (4+4+2)
John.Personne\Nom = "John"
Debug SizeOf(John) ; Affichera 10 aussi
Note: si une variable et une structure ont le même nom, la structure aura la priorité sur la variable.
DescriptionOffsetOf(Structure\Champ) OffsetOf(Interface\Fonction())
La commande OffsetOf permet de déterminer l'index d'un champ dans le cas d'une structure ou l'index d'une fonction dans le cas d'une interface (qui sera sa position en mémoire soit IndexDeLaFunction*4).
Exemple
Structure Personne
Nom.s
Prenom.s
Age.w
EndStructure
Debug OffsetOf(Personne\Age) ; Affichera 8 car un 'string' occupe 4 octets en memoire
Interface ITest
Creer()
Detruire(Options)
EndInterface
Debug OffsetOf(ITest\Detruire()) ; Affichera 4
DescriptionResultat = Subsystem(<expression texte constante>)
Subsystem permet de savoir si un sous-système est utilisé pour le programme en cours de compilation. Le nom de sous-système n'est pas sensible à la casse.
Exemple
CompilerIf Subsystem("OpenGL")
Debug "Compilation avec le sous-système OpenGL"
CompilerEndIf
DescriptionResultat = Defined(Nom, Type)
Defined détermine si un objet tel qu'une structure, interface, variables etc. est déjà défini dans le programme. Le paramètre 'Nom' doit être spécifié sans aucune forme de décoration (sans le '#' pour une constante, sans les '()' pour un tableau, une liste chaînée, une map ou une procédure).
Le paramètre 'Type' peut être une des valeurs suivantes:#PB_Constant #PB_Variable #PB_Array #PB_LinkedList #PB_Map #PB_Structure #PB_Interface #PB_Procedure #PB_Function #PB_OSFunction
Exemple
#PureConstante = 10
CompilerIf Defined(PureConstante, #PB_Constant)
Debug "La constante 'PureConstante' est déjà déclarée"
CompilerEndIf
Test = 25
CompilerIf Defined(Test, #PB_Variable)
Debug "La variable 'Test' est déjà déclarée"
CompilerEndIf
DescriptionInitializeStructure(*Pointeur, Structure)
InitializeStructure initialise la zone mémoire structurée. C'est particulièrement utile quand la structure contient des tableaux dynamiques, des listes ou des maps qui doivent être allouées en interne par PureBasic. 'Structure' est le nom de la structure qui sera utilisée pour effectuer l'initialisation. Il n'y a pas de contrôle pour s'assurer que la zone mémoire est bien du type 'Structure' spécifié, donc il est impératif de manipuler cette commande avec précaution.
Exemple
Structure People
Name$
Age.l
List Friends.s()
EndStructure
*Student.People = AllocateMemory(SizeOf(People))
InitializeStructure(*Student, People)
; Now the list is ready to use
;
AddElement(*Student\Friends())
*Student\Friends() = "John"
AddElement(*Student\Friends())
*Student\Friends() = "Yann"
; Print out the list content
;
ForEach *Student\Friends()
Debug *Student\Friends()
Next
DescriptionCopyStructure(*Source, *Destination, Structure)
CopyStructure copie une zone de mémoire structurée vers une autre. C'est particulièrement utile lors de l'utilisation de mémoire dynamique pour stocker la structure. Chaque champ de la structure sera dupliqué, y compris les tableaux dynamiques, les listes et les maps. Il n'y a pas de contrôle pour s'assurer que les deux zones mémoires sont bien du type 'Structure', donc il est impératif de manipuler cette commande avec précaution.
Exemple
Structure People
Name$
LastName$
Map Friends$()
Age.l
EndStructure
Student.People\Name$ = "Paul"
Student\LastName$ = "Morito"
Student\Friends$("Tom") = "Jones"
Student\Friends$("Jim") = "Doe"
CopyStructure(@Student, @StudentCopy.People, People)
Debug StudentCopy\Name$
Debug StudentCopy\LastName$
Debug StudentCopy\Friends$("Tom")
Debug StudentCopy\Friends$("Jim")
DescriptionResultat = ClearStructure(*Pointeur, Structure)
ClearStructure vide la zone mémoire structurée et met la valeur de tous les champs à zéro. C'est particulièrement utile quand la structure contient des chaînes de caractères qui ont été allouées en interne par PureBasic. 'Structure' est le nom de la structure qui sera utilisée pour effectuer le nettoyage. Il n'y a pas de contrôle pour s'assurer que la zone mémoire est bien du type 'Structure' spécifié, donc il est impératif de manipuler cette commande avec précaution.
Exemple
Structure People
Name$
LastName$
Age.l
EndStructure
Student.People\Name$ = "Paul"
Student\LastName$ = "Morito"
Student\Age = 10
ClearStructure(@Student, People)
; Affichera des chaines vide, car la structure entiere a ete videe. Tous les autres champs ont ete remis a zero
;
Debug Student\Name$
Debug Student\LastName$
Debug Student\Age