Les fonctions du compilateur
DescriptionBool(<expression booléenne>)
Bool permet d'évaluer une expression booléenne en dehors des opérateurs conditionnels réguliers comme If, While, Until, etc.
Arguments
expression booléenne L'expression booléenne à tester.
Valeur de retour
Renvoie #True si l'expression booléenne est vraie, #False sinon.
Exemple
Salut$ = "Salut" LeMonde$ = "Le Monde" Debug Bool(Salut$ = "Salut") ; Affichera 1 Debug Bool(Salut$ <> "Salut" Or LeMonde$ = "Le Monde") ; Affichera 1
Exemple
Procedure Chiffre(char.c) ProcedureReturn Bool(char >= '0' And char <= '9') EndProcedure Debug Chiffre('0') Debug Chiffre('1') Debug Chiffre('a') Debug Chiffre('z')
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.
Arguments
Nom Le nom de l'objet.
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, une map ou une procédure).Type Peut prendre une des valeurs suivantes: #PB_Constant #PB_Variable #PB_Array #PB_List #PB_Map #PB_Structure #PB_Interface #PB_Procedure #PB_Function #PB_OSFunction #PB_Label #PB_Prototype #PB_Module #PB_Enumeration
Valeur de retour
Aucune.
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
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 du sous-système est insensible à la casse.
Exemple
CompilerIf Subsystem("OpenGL") Debug "Compilation avec le sous-système OpenGL" CompilerEndIf
DescriptionResultat = OffsetOf(Structure\Champ) Resultat = OffsetOf(Interface\Fonction())
La commande OffsetOf permet de déterminer la position en mémoire d'un champ d'une structure ou la position en mémoire d'une fonction dans le cas d'une interface (soit IndexDeLaFunction*SizeOf(Integer)).
Arguments
Structure\Champ ou Interface\Fonction() Le champ de la structure ou la fonction de l'interface.
Valeur de retour
Renvoie l'index du champ ou de la fonction, zéro sinon.
Exemple
Structure Personne Nom.s Prenom.s Age.w EndStructure Debug OffsetOf(Personne\Age) ; Affichera 8 car une 'string' occupe 4 octets en mémoire ;(16 avec un compilateur 64 bits, car une 'string' occupe 8 octets en mémoire) Interface ITest Creer() Detruire(Options) EndInterface Debug OffsetOf(ITest\Detruire()) ; Affichera 4
DescriptionResultat = SizeOf(Type)
La commande SizeOf permet de renvoyer la taille en octets que prendra une structure, les types de base tels que les 'word', les 'float', etc.), une interface ou même une variable (Si une variable et une structure ont le même nom, la structure aura la priorité sur la variable.).
Comme SizeOf est une fonction du compilateur, elle ne fonctionne pas avec les tableaux, les Listes ou les Maps. Utilisez ArraySize(), ListSize() ou MapSize() à la place.
En tant que fonction du compilateur, SizeOf(x) est affectée à une constante et ne nécessite pas d'affectation à une autre variable si elle se trouve à l'intérieur d'une boucle ou d'une procédure appelée à plusieurs reprise.
Arguments
Type Le type de l'objet.
Valeur de retour
La taille de l'objet en mémoire, en octets
Remarques
C'est très utile dans de nombreux cas, notamment lors de l'utilisation des commandes API.
Note : Une variable de type caractère (CHARACTER) (.c) est unicode et occupe 2 octets et une variable de type ASCII (.a) n'occupe qu'1 octet.
Exemple: 1
VariableCaractere.c = '!' Debug SizeOf(VariableCaractere) ; affiche 2, c'est à dire 2 octets Debug SizeOf(CHARACTER) ; affiche 2, c'est à dire 2 octets VariableAscii.a = '!' Debug SizeOf(VariableAscii) ; affiche 1, c'est à dire 1 octets Debug SizeOf(ASCII) ; affiche 1, c'est à dire 1 octets
Exemple: 2
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) Jean.Personne\Nom = "Jean" Debug SizeOf(Jean) ; Affichera 10 aussi
DescriptionResultat = TypeOf(Objet)
TypeOf permet de déterminer le type d'une variable, ou d'un champ de structure.
Arguments
Objet L'objet à utiliser.
Valeur de retour
Le type de l'objet.
Le type peut être une des valeurs suivantes:#PB_Byte #PB_Word #PB_Long #PB_String #PB_Structure #PB_Float #PB_Character #PB_Double #PB_Quad #PB_List #PB_Array #PB_Integer #PB_Map #PB_Ascii #PB_Unicode #PB_Interface
Exemple
Structure Personne Nom.s Prenom.s Age.w EndStructure If TypeOf(Personne\Age) = #PB_Word Debug "Age est un 'Word'" EndIf Surface.f If TypeOf(Surface) = #PB_Float Debug "Surface est un 'Float'" EndIf
DescriptionInitializeStructure(*Memoire, Structure)
Initialise un objet structuré en mémoire.
En fait, cette fonction initialise les membres d'une structure. Ces membres sont de type Array, List ou Map mais les autres types ne sont pas affectés (.s .l, .i, etc.).
Arguments
*Memoire L'adresse mémoire à utiliser. Structure Le nom de la structure qui doit être utilisé pour effectuer l'initialisation.
Il n'y a pas de contrôle pour s'assurer que la zone mémoire corresponde à la structure.
Valeur de retour
Aucune.
Remarques
Attention: plusieurs appels à InitializeStructure crée une fuite de mémoire parce que les anciens membres de la structure ne sont pas libérés de la mémoire. ClearStructure doit être appelée avant d'appeler une nouvelle fois InitializeStructure.
Cette fonction est pour les utilisateurs avancés et doit être utilisée avec précaution.
Pour allouer une structure dynamique, utiliser AllocateStructure().
Exemple
Structure Personne Prenom$ Age.l List Amis.s() EndStructure *Etudiant.Personne = AllocateMemory(SizeOf(Personne)) InitializeStructure(*Etudiant, Personne) ; Maintenant, la liste est prête à l'emploi ; AddElement(*Etudiant\Amis()) *Etudiant\Amis() = "John" AddElement(*Etudiant\Amis()) *Etudiant\Amis() = "Yann" ; Affichage du contenu de la liste ; ForEach *Etudiant\Amis() Debug *Etudiant\Amis() Next
DescriptionCopyStructure(*Source, *Destination, Structure)
Copie une structure en mémoire vers une autre.
Arguments
*Source L'adresse mémoire contenant la structure à copier. *Destination L'adresse mémoire de la copie. Structure Le nom de la structure qui doit être utilisé pour effectuer la copie.
Valeur de retour
Aucune.
Remarques
C'est particulièrement utile lors de l'utilisation de mémoire dynamique avec les pointeurs. Chaque champ de la structure sera dupliqué, y compris les tableaux dynamiques, les listes ou les maps. La structure de destination sera automatiquement effacée avant de faire la copie, il n'est pas nécessaire d'appeler ClearStructure avant CopyStructure.
Attention : La destination doit être une zone de mémoire de structure valide, ou une zone mémoire effacée. Si la zone de mémoire n'est pas effacée, cela pourrait provoquer un crash, car des valeurs aléatoires seront utilisées.
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 Personne Prenom$ Nom$ Map Amis$() Age.l EndStructure Etudiant.Personne\Prenom$ = "Paul" Etudiant\Nom$ = "Morito" Etudiant\Amis$("Tom") = "Jones" Etudiant\Amis$("Jim") = "Doe" CopyStructure(@Etudiant, @EtudiantCopy.Personne, Personne) Debug EtudiantCopy\Prenom$ Debug EtudiantCopy\Nom$ Debug EtudiantCopy\Amis$("Tom") Debug EtudiantCopy\Amis$("Jim")
DescriptionResultat = ClearStructure(*Memoire, Structure)
Vide la zone mémoire structurée et met la valeur de tous les champs à zéro.
Arguments
*Memoire L'adresse mémoire contenant la structure à effacer. Structure Le nom de la structure qui sera utilisée pour effectuer le nettoyage.
Valeur de retour
Aucune.
Remarques
C'est particulièrement utile quand la structure contient des chaînes de caractères, des tableaux, des listes ou des maps qui ont été alloués en interne par PureBasic. Tous les champs seront mis à zéro, même les types natifs comme long, integer, etc.
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. Cette fonction est réservée aux utilisateurs avancés.
Exemple
Structure Personne Prenom$ Nom$ Age.l EndStructure Etudiant.Personne\Prenom$ = "Paul" Etudiant\Nom$ = "Morito" Etudiant\Age = 10 ClearStructure(@Etudiant, Personne) ; Affichera des chaines vide, car la structure entiere a ete videe. Tous les autres champs ont ete remis a zero ; Debug Etudiant\Prenom$ Debug Etudiant\Nom$ Debug Etudiant\Age
DescriptionResetStructure(*Memoire, Structure)
ResetStructure, vide la zone mémoire structurée et l'initialise pour être prête à être utilisée.
Arguments
*Memoire L'adresse mémoire contenant la structure à réinitialiser. Structure Le nom de la structure utilisée.
Valeur de retour
Aucune.
Remarques
C'est particulièrement utile quand la structure contient des chaînes de caractères, des tableaux, des listes ou des maps qui ont été alloués en interne par PureBasic. Tous les champs seront mis à zéro, même les types natifs comme long, integer, etc.
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. Cette fonction est réservée aux utilisateurs avancés.
Exemple
Structure Personne Map Amis.s() EndStructure Henri.Personne\Amis("1") = "Paul" ResetStructure(@Henri, Personne) ; Affiche une chaîne vide car l'ensemble de la structure a été réinitialisée. ; La map est encore utilisable, mais vide. ; Debug Henri\Amis("1")