Voir le sujet précédent :: Voir le sujet suivant |
Auteur |
Message |
Ayane Bot administrateur
Inscrit le: 17 Sep 2007 Messages: 2009 Sujets: 49
Médailles: 2 (En savoir plus...)
|
Posté le: 29/08/07 21:17 Sujet du message: Pointeurs et changement de types |
|
|
Pointeur en programmation
En programmation un pointeur sert à faire référence à une variable.
Une variable est composé d'une valeur stoquée en mémoire centrale (RAM), Pour savoir où elle se trouve en mémoire elle possède une adresse.
Matériel: Par exemple si vous avez 256Mo de RAM ce qui donne en hexadécimales 10000000 octets (268 435 456 en décimales), et que vous avez un processeur 32
bits (ainsi que l'OS) soit 4 octets, alors votre mémoire sera découpé en bloc de 4 octets, ce qui donne en hexadécimale 4000000 blocs (67'108'864 en
décimales). Evidemment il n'y a pas que les mémoires, il y a également les programmes de chargés et d'autres.
Revenons aux pointeurs, un pointeur indique donc l'adresse mémoire d'une variable, cela sert à quoi?
A plusieurs choses, par exemple cela permet les tables (variables array), on a donc l'adresse de base de la variable + l'index pour retrouver l'adresse
mémoire où est stoquée la valeur.
On peux déplacé une valeur (cela ne reste qu'un nombre, une suite de 0 et de 1) et la placé dans un autre type, par exemple un caractère A, qui est en fait
une image, est stoqué par une valeur (ici $41 en unicode, on allait tout de même pas stoqué l'image à chaque fois...). Donc si on déplace cette valeur dans
une variable de type entier alors on aura bien $41.
On peud donc passé une variable à une fonction de deux façons: par référence ou par valeur, la différence:
Code: |
fonction Test ( ParValeur param1 )
param1 <- 3
fin fonction
param1 <- 1
Test( param1 )
// param1 contient la valeur 1
fonction Test ( ParReference param1 )
param1 <- 3
fin fonction
param1 <- 1
Test( param1 )
// param1 contient la valeur 3
|
Objets
S'appelle Objet toute type de valeur qui n'est pas basique.
C'est à dire toute valeur qui ne rentre pas sur 4 octets.
En Jass les types de bases sont: integer, real, boolean, handle
Une variable objet a pour valeur un pointeur vers l'objet, c'est pour cela que si on ne sert plus de l'objet faire
set varobj = null
ne supprimera pas l'objet de la mémoire, il faut appeler une fonction s'occupe à partir du pointeur de détruire l'objet
call DestroyGroup( vargroup )
Pointeur en Jass
Si vous n'avez pas tout compris de ce qui précède ce n'est pas grave bien que cela vous permet de mieux comprendre ce que vous faîtes faire.
Le Jass est un langage interprêté (script), donc c'est un peu différend.
Vous avez peut-être remarqué que les valeurs passées en paramètre d'une fonction se fait par valeur
Jass: |
function Test takes integer I returns nothing
set i = i + 10
endfunction
local integer a = 2
call Test(a)
call BJDebugMsg( S2I(a) )
// Affichera 2
|
Il en va de même pour les objets seulement leur valeur étant un pointeur
Jass: |
function Test takes location dest, location src returns nothing
call MoveLocation( dest, 100, 100 )
set dest = src
call BJDebugMsg( "l1in: " + R2S(GetLocationX( dest )) )
endfunction
local location l1 = Location( 2, 2 )
local location l2 = Location( 10, 10 )
call Test( l1, l2 )
call BJDebugMsg( "l1out: " + R2S(GetLocationX( l1 )) )
// Affichera
// l1in: 10
// dest pointant sur le même objet src
// l1out: 100
// MoveLocation ayant modifié la valeur de l1
|
A quoi cela sert en Jass?
Il existe un bogue dans l'interpréteur d'erreur du Jass qui nous permet de changer le type d'une valeur.
C'est l'instruction return, en effet return arrête l'execution d'une fonction et renvoie la valeur. Le parseur fait une erreur si le type de la valeur n'est
pas compatible, mais il le fait seulement pour le dernier return de la fonction.
Donc si on fait:
Jass: |
function I2B takes integer I returns boolean
return I
return false
endfunction
local boolean b
set b = I2B(0)
if b then
call BJDebugMsg( "0: true" )
else
call BJDebugMsg( "0: false" )
endif
set b = I2B(1)
if b then
call BJDebugMsg( "1: true" )
else
call BJDebugMsg( "1: false" )
endif
|
return false permet donc que le parseur ne génère pas d'erreur, ce ne sera jamais exécuté ayant return I avant.
Cela affichera
// 0: false
// 1: true
On peut bien entendu le faire de l'autre sens
Jass: |
function B2I takes boolean B returns integer
return B
return 0
endfunction
|
Changer le type est très intéressant notamment pour les objets qui sont des extensions pour la plupart de handle (voir common.j). Voici donc les conversions
les plus utilisées:
Jass: |
function H2I takes handle H returns integer
return H
return 0
endfunction
function I2H takes integer I returns handle
return I
return null
endfunction
|
En effet étant donné que c'est un pointeur qui est transmis, le récupérer en entier sert beaucoup.
La principale application est de stoquer ainsi n'importe quel type de variables dans le gamecache, ce qui vous permet de faire des tables multidimensionnels
à index non-entier, ce sera pour un prochain tutorial, déjà je pense que cela fait beaucoup à assimiler.
Donc pour l'instant je vais vous donner quelques exercices pour voir si vous avez compris:
Exercice1:
Si le joueur1 tape: ptr texte
texte étant entré par l'utilisateur
Alors afficher le pointeur de texte
Si le joueur1 tape: str pointeur
pointeur étant entré par l'utilisateur
Alors afficher le texte de ce pointeur
Exercice2:
Faire une table multitypé
Vous créez une unité et deux item
Après trois secondes vous devez les supprimées.
Mais vous n'avez le droit d'utiliser qu'une seule table, aucune autre variable ^^.
Voila si vous réussissez à faire cela alors vous aurez tout compris sur le sujet.
Evidemment je vous demande de ne pas poster la réponse.
Si vous avez un problème ou que vous trouvez que c'est confus faîtes moi en part. _________________
Dernière édition par Ayane le 01/11/07 14:18; édité 1 fois |
|
Revenir en haut |
|
|
Bantas Anomalie floodiforme
Inscrit le: 21 Aoû 2007 Messages: 1524 Sujets: 37
Médailles: 1 (En savoir plus...)
|
Posté le: 29/08/07 21:23 Sujet du message: |
|
|
Je link ce tuto à celui sur le game cache. _________________
|
|
Revenir en haut |
|
|
DJ-JB Membre actif
Inscrit le: 29 Oct 2007 Messages: 147 Sujets: 23
|
Posté le: 31/10/07 21:51 Sujet du message: |
|
|
Je crois que sa serait bien si ont pouvait avoir accés aux résultats sinon il y aura peu d'intérêts, comment savoir si notre résultat est juste ? Ou comment avoir la solution ? _________________
|
|
Revenir en haut |
|
|
Bantas Anomalie floodiforme
Inscrit le: 21 Aoû 2007 Messages: 1524 Sujets: 37
Médailles: 1 (En savoir plus...)
|
|
Revenir en haut |
|
|
Keitaro_Ura Floodozaurus
Inscrit le: 21 Aoû 2007 Messages: 2073 Sujets: 38 Spécialité en worldedit: Oui Médailles: 1 (En savoir plus...)
|
Posté le: 01/11/07 09:24 Sujet du message: |
|
|
Pffou, ça me rapelle le C...
Mais jvois pas l'utilité que ça a dans le Jass. _________________
|
|
Revenir en haut |
|
|
DJ-JB Membre actif
Inscrit le: 29 Oct 2007 Messages: 147 Sujets: 23
|
Posté le: 01/11/07 11:16 Sujet du message: |
|
|
Ben j'ai plus compris les pointeurs en C++ que les pointeurs en JASS :s
Je vois le principe parce que je connaissais déjà le principe des pointeurs mais je vois pas comment collé un pointeur à une adresse de variable :s _________________
|
|
Revenir en haut |
|
|
Troll-Brain Ri1kamoua
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
|
Posté le: 01/11/07 11:47 Sujet du message: |
|
|
en utilisant les fonction H2I et I2H
Ta variable est de type entier qui stocke un handle (pointeur) _________________
Le violet, c'est moche. |
|
Revenir en haut |
|
|
Max Floodeur prématuré
Inscrit le: 13 Jan 2009 Messages: 550 Sujets: 47 Spécialité en worldedit: La partie déclencheurs sauf le GUI.
|
Posté le: 13/01/09 14:22 Sujet du message: |
|
|
Je poste plus d'un an après la création de ce sujet, mais j'ai un problème et je trouve ce sujet très adapté. Comment faire la chose toute simple suivante ?
Code: |
var un_pointeur
var un_entier = 0
un_pointeur --> un_entier //faire pointer le pointeur sur l'entier
val( un_pointeur ) = 1
afficher( un_entier )
//et là ça doit afficher 1
|
J'espère avoir été clair. Je ne suis pas sûr que ça soit possible en jass, mais c'est pourtant rudement utile. (en tout cas ça me simplifierait beaucoup la vie ^^) _________________
|
|
Revenir en haut |
|
|
Ayane Bot administrateur
Inscrit le: 17 Sep 2007 Messages: 2009 Sujets: 49
Médailles: 2 (En savoir plus...)
|
Posté le: 13/01/09 21:27 Sujet du message: |
|
|
Ce n'est pas possible, la seule chose que l'on peut faire c'est du transtypage en fait.
Je parle de pointeur parce qu'en fait tous les types étendant le type handle est en réalité un pointeur, on peut donc le transtyper en entier afin d'obtenir une adresse. Il est parfois utile de travailler avec un entier en Jass à cause de certaines fonctions ou possibilités.
Par exemple on ne peut pas faire d'array du type code, par contre on peut le transtyper en entier et faire un array d'entiers que l'on pourra retranstyper en code pour les utiliser, il y a pleins d'autres choses de ce genre là.
Le Jass n'est pas un langage bien puissant, à la base il a surtout été créé pour faire des quêtes, il n'a pas été prévu pour notre utilisation actuelle. Dans Starcraft2 on devrait avoir une grande évolution à ce niveau là (à priori langage objet ou prototype). _________________
|
|
Revenir en haut |
|
|
Max Floodeur prématuré
Inscrit le: 13 Jan 2009 Messages: 550 Sujets: 47 Spécialité en worldedit: La partie déclencheurs sauf le GUI.
|
Posté le: 14/01/09 11:01 Sujet du message: |
|
|
D'accord, c'est très clair. Merci _________________
|
|
Revenir en haut |
|
|
|