Worldedit
  Worldedit
Le site sur l'éditeur de warcraft 3 !
 
  FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs   medals.php?sid=614b4b770e505ed78d70ae9b18f2aec5Médailles   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 
  FAQFAQ World Editor   UploadUploader une map ou une image    UploadAjouter sa map à l'annuaire   UploadConsulter l'annuaire

Pointeurs et changement de types

 
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Tutoriels
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...)
Rédacteur de tuto #1 (Quantité : 1) Ayane (Quantité : 1)

MessagePosté le: 29/08/07 21:17    Sujet du message: Pointeurs et changement de types Citer

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
Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger
 Bantas
Anomalie floodiforme


Inscrit le: 21 Aoû 2007
Messages: 1524
Sujets: 37

Médailles: 1 (En savoir plus...)
Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 29/08/07 21:23    Sujet du message: Citer

Je link ce tuto à celui sur le game cache.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 DJ-JB
Membre actif


Inscrit le: 29 Oct 2007
Messages: 147
Sujets: 23



MessagePosté le: 31/10/07 21:51    Sujet du message: Citer

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
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
 Bantas
Anomalie floodiforme


Inscrit le: 21 Aoû 2007
Messages: 1524
Sujets: 37

Médailles: 1 (En savoir plus...)
Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 01/11/07 09:00    Sujet du message: Citer

C'est juste des exemples à faire le temps qu'on comprenne comment ça marche, pas des exercices comme à l'école.. Razz
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Keitaro_Ura
Floodozaurus


Inscrit le: 21 Aoû 2007
Messages: 2073
Sujets: 38
Spécialité en worldedit: Oui
Médailles: 1 (En savoir plus...)
Rédacteur de tuto #2 (Quantité : 1)

MessagePosté le: 01/11/07 09:24    Sujet du message: Citer

Pffou, ça me rapelle le C...
Mais jvois pas l'utilité que ça a dans le Jass.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 DJ-JB
Membre actif


Inscrit le: 29 Oct 2007
Messages: 147
Sujets: 23



MessagePosté le: 01/11/07 11:16    Sujet du message: Citer

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
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
 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...)
Rédacteur de tuto #3 (Quantité : 1) Grand mage créateur de sort (Quantité : 1)

MessagePosté le: 01/11/07 11:47    Sujet du message: Citer

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
Voir le profil de l'utilisateur Envoyer un message privé
 Max
Floodeur prématuré


Inscrit le: 13 Jan 2009
Messages: 550
Sujets: 47
Spécialité en worldedit: La partie déclencheurs sauf le GUI.


MessagePosté le: 13/01/09 14:22    Sujet du message: Citer

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
Voir le profil de l'utilisateur Envoyer un message privé
 Ayane
Bot administrateur


Inscrit le: 17 Sep 2007
Messages: 2009
Sujets: 49

Médailles: 2 (En savoir plus...)
Ayane (Quantité : 1) Rédacteur de tuto #1 (Quantité : 1)

MessagePosté le: 13/01/09 21:27    Sujet du message: Citer

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
Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger
 Max
Floodeur prématuré


Inscrit le: 13 Jan 2009
Messages: 550
Sujets: 47
Spécialité en worldedit: La partie déclencheurs sauf le GUI.


MessagePosté le: 14/01/09 11:01    Sujet du message: Citer

D'accord, c'est très clair. Merci
_________________
Maximaxou@northrend

Projet Max Escape Creation (éditeur d'escapes : mazes/slides) : http://max.slid.free.fr/maxEscapeCreation/
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Tutoriels Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com