y'a un truc qui ne va pas avec les pointeurs

Sujets variés concernant le développement en PureBasic
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

y'a un truc qui ne va pas avec les pointeurs

Message par Dr. Dri »

Pour commencer, je vais essayer de récapituler ce qui est faisable avec les pointeurs

un pointeur est un "symbole" à part entière qui commence par '*'. A part entière parce que "variable" est différent de "*variable".

un pointeur, c'est une variable qui contient une adresse. l'adresse d'une autre variable, d'un tableau ou d'une zone quelconque de mémoire.

pour obtenir une adresse il y a plusieurs moyens, le premier est d'utiliser le symbole '@' (fonctionne dans tous les cas de figure). Le second est spécifique aux tableaux. Et enfin certaines fonctions comme AllocateMemory retournent une adresse.

les types de base ne permettent pas de manipuler directement un pointeur. il faut passer par les fonctions peek/poke ce qui rend le principe de pointeur inutile (une variable de type "l" fait l'affaire)

pour profiter pleinement des pointeurs il faut donc passer par des structures. c'est d'ailleurs pour ca qu'il existe des structures pour les types de base (Long pour pointer sur des .l, Float pour des .f etc).

dans une structure il est possible d'avoir un tableau "statique" grace aux symboles "[" et "]" (par exemple Bidule.b[32] représentera 32 octets dans la structure).

le compilateur permet de pointer vers un tableau de taille inconnu si la taille est [0]. si ce n'est pas un pointeur, [0] équivaut à [1].

petit code pour résumer tout ce qui a été dit plus haut:

Code : Tout sélectionner

Structure Truc
  Machin.l
  Bidule.b[2]
EndStructure

Structure Trucs ;obligé de passer par une structure pour
  Trucs.Truc[0] ;un tableau (taille inconnue) de Truc
EndStructure

Dim tableau.Truc(3)

;rempli et affiche le tableau
For t = 0 To 3
  tableau(t)\Machin = Random(1000)
  tableau(t)\Bidule[0] = Random(255)
  tableau(t)\Bidule[1] = Random(255)
  
  Debug tableau(t)\Machin
  Debug tableau(t)\Bidule[0]
  Debug tableau(t)\Bidule[1]
Next t

;petit repère visuel
Debug "---"

;pointe vers le tableau
*pointeur.Trucs ;le pointeur est dans la structure...
*pointeur = tableau() ;recoit l'adresse du tableau

;affiche le tableau via le pointeur
For t = 0 To 3
  Debug *pointeur\Trucs[t]\Machin
  Debug *pointeur\Trucs[t]\Bidule[0]
  Debug *pointeur\Trucs[t]\Bidule[1]
Next t
Alors je suis d'accord ca fonctionne très bien. Mais y'a comme un petit problème. Pour pointer vers un tableau d'une structure quelconque je dois passer par une structure supplémentaire.

Exemple concret:
Si je ne passe pas par une structure temporaire voila ce qui se passe

Code : Tout sélectionner

Structure pLong5
  *dword.Long[5] ;ce n'est pas un pointeur vers un tableau de Long
EndStructure

;un pointeur c'est comme un long
;la structure contient 5 longs donc 5 pointeurs
Debug SizeOf(pLong5) / SizeOf(Long)
Pour moi y'a un problème de syntaxe. Telle qu'elle est fichue elle est trop restrictive. variable[taille].type devrait désigner plusieurs variables du type "type" dans la structure. Et avec les pointeurs ca permettrait de faire ceci:

Code : Tout sélectionner

*pointeur.type[0]    ;pointeur qui pointe vers un tableau de type
*pointeur[0].type    ;tableau de pointeurs qui pointent vers une variable type
*pointeur[0].type[0] ;tableau de pointeurs qui pointent vers un tableau de type
votre avis ?

Dri :?:
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

j'aime bien l'idée du tableau de pointeur comme tu l'as écrit. Je vote pour.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Oui ça manque!
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Ca risque de devenir prise de tête aussi...
Mais c'ets pas grave, le cachet d'aspirine tout prêt et hop, c'est partit... :lol:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Répondre