PureBasic:Pointeurs Memoire


PureBasic:Manuel

<< Précédent | Sommaire | Suivant >>


Pointeurs et accès mémoire


Sommaire

[modifier] Pointeurs

L'utilisation des pointeurs est possible en plaçant une * devant le nom de variable. Un pointeur est une variable de type long qui stocke une adresse. Le pointeur est généralement associé avec un type structure. Cela permet d'accéder à la structure via le pointeur.

Exemple:

  *MonEcran.Ecran = OpenScreen(0,320,200,8,0)
  mouseX = *MonEcran\SourisX ; La structure Ecran devant contenir un champ SourisX

Il existe seulement trois méthodes valides pour fixer la valeur d'un pointeur:

  • Obtenir le résultat par une fonction (voir l'exemple ci-dessous)
  • Copier la valeur d'un autre pointeur
  • Trouver l'adresse d'une variable, procédure ou label (voir ci-dessous)

[modifier] Adresses des variables

Pour trouver 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
  
  DefType.astruct mavariable
  mavariable\b = 0
  SetB( @mavariable )
  Debug mavariable\b
  End

[modifier] 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.l, Message.l, wParam.l, lParam.l)
    ; 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() )


[modifier] 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(?findesdonnees - ?mesdonnees))
  End
  
  mesdonnees:
  IncludeBinary "unfichier.bin"
  findesdonnees:

[modifier] Liens internes