Pointeurs et accès mémoire
Pointeurs
Il existe seulement trois méthodes valides pour fixer la valeur d'un pointeur:Exemple
*MonEcran.Ecran = OpenScreen(0,320,200,8,0) mouseX = *MonEcran\SourisX ; La structure Ecran devant contenir un champ SourisX
Exemple: Pointeurs et variables structurées
Pointeurs et tableauxDefine Point1.Point, Point2.Point *PointCourant.Point = @Point1 ; Déclare le pointeur, l'associe à une structure et l'initialise avec l'adresse de Point1 *PointCourant\x = 10 ; Assigne la valeur 10 à Point1\x *PointCourant.Point = @Point2 ; Récupère l'adresse de Point2 *PointCourant\x = 20 ; Assigne la valeur 20 à Point2\x Debug Point1\x Debug Point2\x
Exemple: Pointeurs et tableaux
Les pointeurs permettent donc de se déplacer, de lire et d'écrire facilement en mémoire. De plus ils permettent aux programmeurs d'accéder à de grandes quantités de données sans coût supplémentaire suite à une duplication de ces données. Copier un pointeur est beaucoup plus rapide.Define Point1.Point, Point2.Point ; 2 Variables de type 'point' (type prédéfini dans PureBasic) Dim *Points.Point(1) ; Un tableau de 2 pointeurs et le tableau est de type 'Point' *Points(0) = @Point1 ; Le premier pointeur contient l'adresse de la variable Point1 *Points(1) = @Point2 ; Le second pointeur contient l'adresse de la variable Point2 *Points(0)\x = 10 ; Modification de la variable Point1 à travers le pointeur *Points(1)\x = 20 ; Idem avec Point2 Debug Point1\x Debug Point2\x
Exemple
Arithmétiques des pointeursTexte$ = "Bonjour" *Texte = @Texte$ ;*Texte a pour valeur l'adresse où réside la chaîne de caractères en mémoire *Pointeur.String = @*Texte ; *Pointeur pointe sur *Texte Debug *Pointeur\s ; Lit la chaîne de caractères qui réside à l'adresse écrite en *Pointeur (c-a-d @Texte$)
Exemple
Dim Tableau.Point(1) ; tableau de points *Pointeur.Point = @Tableau() ; Récupère l'adresse du tableau *Pointeur\x = 10 ; Modifie l'élément 0 du tableau *Pointeur\y = 15 *Pointeur + SizeOf(Point) ; Pointe sur l'élément suivant *Pointeur\x = 7 ; Modifie l'élément 1 du tableau *Pointeur\y = 9 ;Affiche le résultat For i = 0 To 1 Debug Tableau(i)\x Debug Tableau(i)\y Next i
Adresses des variables : '@'
Pour obtenir l'adresse d'une variable dans votre code, utilisez le symbole @. La raison la plus fréquente d'utiliser ce système est le transfert d'une variable de type structure à une procédure. Il faut passer un pointeur à la procédure car il est impossible de passer directement la structure comme argument.Exemple
Structure astruct a.w b.l c.w EndStructure Procedure SetB(*monpointeur.astruct) *monpointeur\b = 69 EndProcedure Define.astruct mavariable mavariable\b = 0 SetB( @mavariable ) Debug mavariable\b
Adresses des chaînes littérales
Pour obtenir l'adresse d'une chaîne de caractères littérales, utilisez le symbole @ devant elle. Les chaînes constantes sont aussi supportées.Exemple
*Chaine = @"Test" Debug PeekC(*Chaine) ; Affiche 84, qui est la valeur de la lettre T majuscule 'T'
Adresses des procédures : '@'
En principe seuls les programmeurs avancés ont à connaître l'adresse d'une procédure. La raison la plus fréquente est de devoir négocier des échanges de bas niveau avec le système d'exploitation. Certains systèmes autorisent la mise en place de callbacks ou points d'ancrage (hooks) permettant au système d'exploitation de dialoguer avec le programme en étendant ainsi les capacités du système d'exploitation. L'adresse d'une procédure est accessible d'une manière similaire à une variable.Exemple
Procedure WindowCB(WindowID.i, Message.i, wParam.i, lParam.i) ; C'est ici que le traitement de votre callback sera effectué EndProcedure ; Un callback spécifique pour Windows permet de traiter les évènements sur les fenêtres SetWindowCallback( @WindowCB() )
Adresses des labels : '?'
Il peut également être utile de connaître l'adresse d'un label dans votre programme. Cela peut être le cas pour accéder au code ou aux données placées à cet endroit ou toute autre bonne raison qui peut vous venir à l'esprit. Pour trouver l'adresse d'un label dans votre programme, placez un '?' devant le nom du label.Exemple
Debug "Taille du fichier de données = " + Str(?endofmydata - ?mydata) DataSection mydata: IncludeBinary "somefile.bin" endofmydata: