bonjour tous le monde,
J´ai un problème j´appren en ce moment le C/C++ mais bon la je suis au pointeur et je comprend pas à quoi sa sert et se que c´est.
vous pouvez m´expliqué
![]()
Les pointeurs servent a plein de chose...
En particulier, ca sert lors d´appel de fonction.
Quand tu appele une fonctoin avec des parametre, les parametres sont recopié vers la nouvelle fonction. Donc si tu les modifies dans cette fonction elles ne seront pas modifié dans la fonction appelante. Demo
void toto(int a)
{a=2;}
int main ()
{
int tutu=3;
toto(tutu);
printf ("%d\n", tutu); // affiche 3 et pas 2
return 0;
}
alors que si tu passe l´adresse d´une variable, c´est l´adresse qui sera recopié lors de l´appel de fonction. Donc tu pourra modifié ce qui est a l´adresse donné et donc bien modifier ce que tu veux. Demo:
void toto(int *a)
{*a=2;}
int main ()
{
int tutu=3;
toto(&tutu);
printf ("%d\n", tutu); // affiche 2 maintenant
return 0;
}
Si tu fais l´analogie avec le web :
Tu as par exemple des grosses structures, et des pointeurs vers ces structures.
En web : ça donne des gros sites web, et les pointeurs sont juste l´URL...
Quand tu donnes un site a quelqu´un, soit tu lui donnes une copie entiere du site (tiens, prend tes 2 Go dans ta boite mail...) soit un pointeur vers le site (une URL) -> 30 octets...
Rentabilité...
Les pointeurs... héhé... en clair, une variable de type pointeur contient l´adresse d´une case mémoire donnée (elle pointe vers cette case mémoire).
Un tel mécanisme te permet de modifier des données plus facilement lors de l´appel d´une fonction (enfin, différement qu´un paramètrage par adresse on va dire...), et ça permet pas mal d´autres choses: réservation dynamique de la mémoire (c´est assez kiffant les tableaux de pointeurs d´entiers avec mallocage à gogo, m´enfin bref T_T), c´est également une chose essentielle à l´utilisation des listes chainées (euh, des pointeurs structures récursives O_ô ?) ...
Enfin euh voilà, erf, j´sui pas d´un grand secour :s
offspring
Disons qu´on comprend si on sait déja ce que c´est que des pointeurs
J´aime bien l´exemple de fvirtman
![]()
J´ai une question sur le pointeurs, Imaginons que je veuille faire une fonction d´initialisation de surfaces et autres ( via la SDL par exemple ), je suis donc obligé de faire mes initilisations avec des pointeurs ? C´est un peu chiant à utiliser pour le reste du programme non ? il n´y a pas d´autres moyens ?
Enfin, petite rectification, de toute façon les surfaces sont déjà des pointeurs, mais pour les coordonnees par exemple ?
pas forcément. Regarde par exemple la fonction Rect de ce morceau du tuto de JYY :
http://perso.numericable.fr/~fvirtman/info/tuto/2_B_01_chutelibre.cpp
Merci pour le tuto, mais imaginons qu´il faille que j´initialise plusieurs choses en une seule fonction, je ne peux retourner qu´une seul valeur via cette fonction non ? alors comment est-ce possible ?
"mais imaginons qu´il faille que j´initialise plusieurs choses "
--> bonne question ![]()
Tu peux passer des variables qui modifieront l´appelant : une adresse (philosophie C), ou une référence (philosophie C++)
exemple 1 (passage par adresse : philosophie C) :
void fonc(int* a,int* b,int* c)
{
}
int main()
{
int a,b,c;
a=b=c = 0;
fonc(&a,&b,&c);
// ici, a=6, b=7, c=8 : 3 valeurs "retournées"
...
}
exemple 1 (passage par reference: philosophie C++) :
void fonc(int& a,int& b,int& c)
{
a = 6;
b = 7;
c = 8;
}
int main()
{
int a,b,c;
a=b=c = 0;
fonc(a,b,c);
// ici, a=6, b=7, c=8 : 3 valeurs "retournées"
...
}
Merci de tes explications, mais j´ai encore quelques questions ( Moi, chiant ? ), Le type void n´est-il pas réservé aux fonctions sans paramètres ? Et, enfaite je ne pourrais pas réutiliser ton exemple (Je pense avoir compris le principe, mais je n´en suis pas totalement sur, encore un peu de mal avec les pointeurs parfois ), Parce qu´enfaite je deois faire l´initilisations à l´intérieur de la fonction sans utiliser aucun paramètres, par exemple :
void initilisation()
{
SDL_Surface *Ecran = NULL, *Fond = {NULL};
SDL_Rect position[100] = {0};
position[0].x = 0;
position[0].y = 0;
position[1].x = 300;
position[1].y = 400;
Fond = SDL_LoadBMP("Fond.bmp");
SDL_SetColorKey(Fond, SDL_SRCCOLORKEY, SDL_MapRGB(Fond->format, 255, 255, 0));
}
Donc en gros j´aimerais réutiliser les valeurs de "Ecran", de "Fond" et de position .
Bonjour,
je suis pas sur d´avoir très bien compris, mais étant donnée que tu code en C, tu peux les déclarer en global, je m´explique avec un exemple:
SDL_Surface *Ecran = NULL, *Fond = NULL;
SDL_Rect position[100] = {0};
void initilisation()
{
position[0].x = 0;
position[0].y = 0;
position[1].x = 300;
position[1].y = 400;
Fond = SDL_LoadBMP("Fond.bmp");
SDL_SetColorKey(Fond, SDL_SRCCOLORKEY, SDL_MapRGB(Fond->format, 255, 255, 0));
}
int main(int, char**)
{
initialisation();
// Utilisation de la variable global initialisé
SDL_BlitSurface(Fond, NULL, Ecran, NULL);
return 0;
}
Voilà, j´espère que c´est ce que tu cherchais et tu ai compris.
vexover > une fonction peut, ou pas, retourner void, qu´elle aie des parametres ou non : pas de restricition la dessus.
tu peux passer tes images a initialiser par adresse ou par référence !
void initilisation(SDL_Surface** Fond)
{
*Fond = SDL_LoadBMP("Fond.bmp");
....
ou alors par référence :
void initilisation(SDL_Surface*& Fond)
{
Fond = SDL_LoadBMP("Fond.bmp");
....
KeepSmile >> Sauf que les positions ne sont pas réutilisable et c´est bien ça mon problème .
Fvirtman >> Oui, sauf que ces fonctions demandent des paramètres, et moi ce que je voudrais faire c´est une fonction qui s´occupe de toutes les initialisations pour que le code ressemble en gros à ça :
int main()
{
while(1)
{
initilisation();
requetteEvenement();
affichage();
}
}
Dans ces cas la, fait des variables globales, ou alors une classe (ou structure) avec une instance globale.
Il me semble avoir vaguement entendu parlé des variables globales, elle sont aussi appelés variables statics non ?
Quelqu´un aurait-il quelques précisions sur celles-ci ?
Ps : En tout cas merce beaucoups de votre aide, et dsl d´être aussi insistant ^^.
Après quelques recherche sur wikipédia, j´ai donc compris que la variable global était une variable déclarée en dehors de toutes classes, structures ou fonction ( y compris la main ), et pouvant être utilisé n´importe où dans le code .
Mais je ne peux pas l´utiliser dans mon cas étant donné que j´aimerais faire ça dans une fonction, une méthode de remplacement consisterait donc de mettres ces variable dans un .h et de l´inclure au début du code pour ensuite affecter ces variables au lieu de les initialiser dans la foction prévu à cette effet . est-ce possible ?
Bonjour,
Tout d´abord, j´aimerai que tu lises les post entièrement et essaie de les comprendre avant de partir n´importe ou.
Pourquoi je dis cela ?, car si tu aurai regardé mon post, tu aurai pu éviter plein de recherche pour rien. Je parlais de variable global et que vois je après :
"Il me semble avoir vaguement entendu parlé des variables globales, elle sont aussi appelés variables statics non ?"
Regarde mon post, et pour te répondre non les variables statics sont différentes des variables globales, du moins syntaxiquement, mais en utilisation c´est vrai que c´est assez ressemblant, mais fait bien la différence entre les deux. Pour plus de précision tu peux aller voir sur le site de FVirtman (cf: va voir sa carte).
"KeepSmile >> Sauf que les positions ne sont pas réutilisable et c´est bien ça mon problème . "
Bien sur que non !, les positions sont déclaré en global donc dans ton main tu peux utiliser les variables initialisé dans la fonction "initialisation()" car elles ne sont pas déclarées dans la fonction "initialisation()" mais en global.
Après pour ta question sur les fichier .h (header), oui en effet tu peux déclarer des variables dedans et inclure ton fichier, mais cela n´a pas vraiment d´utilité dans ton cas, généralement on utilise les fichiers header pour la déclaration de prototype de fonction et structure. (attention les class ne sont pas un concept du langage C mais du langage C++)
Après pour t´aider sur ce que tu veux faire, il nous ferait un peu plus de précision, pour savoir si une structure serait plus adapté ...etc.
Que essaies tu de faire ?
Arf, oui dsl, j´ai lu ton post un peu distraitement et j´ai pas fait attention aux variable globales et au fait que tu en parlais juste au dessus
, Mea culpa .
Sinon en ce qui concerne ce que je comte faire vraiment, c´est dans l´optique d´un petit jeu de plate-forme, et j´ai prévu d´écrire un editeur de map poure celui-ci, mon objectif pour le moment est donc de charger une map à partir d´un fichier, c´est pour ça que j´ai besoin d´initilialiser à partir d´une fonction : Le programme lit le fichier et l´interprète, au fur et à mesure de la lecture il initialise les surface et positions qui doivent l´être . J´ai mis une partie du code sur un autre topic dont je suis le créateur et qui ne doit pas être bien loin, donc je posterais le code quand il sera un peu plus complet pour vous donner une meilleur idée de ce que je compte faire .
Merci de ton aide .
Maintenant qu´on voit ce que tu veux faire, ce que tu pourrais être sympa c´est de faire des structures comme:
typedef struct {
int hp;
int mp;
int force;
int defense;
SDL_Surface* image;
} Personnage;
et d´autre structure utile comme pour les monstres ou la map, et après tu fais des fonctions d´initialisation et de traitement sur ces structures.
void chargerCarte(char* filename); // rempli la structure Carte
void initPersonnage(Personnage* perso); // initialise le personnage
regarde sur le site de FVirtman, tu as des exemples de ce type
, et la les fichiers header interviennent ;)