vue Probleme avec mon premier logiciel - Page 3
Kommunauty
Connexion
Inscription

Probleme avec mon premier logiciel


muklesur Messages : 746

Ce n'est pas grave , et le créateur de mincraft ( qui est un gas comme toi et moi qui n'a pas de société ) , lui il lui a fallut des années ou bien il lui a suffit qu'un simple tuto ?

jeudi 4 aout 2011

Lucas Messages : 830

D'après toi...

Ce mec est indépendant, mais ça faisait plusieurs années qu'il s'intéressait aux jeux vidéos, et il avait déjà réalisé plusieurs jeux en fausse 3D (style mode 7 : Doom)

jeudi 4 aout 2011 (Dernière édition jeudi 4 aout 2011)

Vanyali Messages : 1298

non, le tuto sur irrlicht est un bon début pour faire de la 3D, il est plutôt simple d'utilisation, mais bon, le tuto a parfois des erreur, qui fait que ça fonctionne pas toujours, mais où sinon, on arrive vite a faire de bon truc, après, pour les jeux, ça deviens plus dur, car il faut modéliser ce qu'on veut, et puis pour qu'il soit bien, il faut pas que de la programmation, mais de la réflexion avant

par conter, irrlicht, c'est du C++, et il faut quand même être un minimum calé en C++ pour comprendre, où sinon, on fait tou sans vraiment savoir ce qu'on fait.

les pointeurs, ça sert énormément pour faire des choses diverse et varié, on peut "retourner" plusieurs valeurs avec les fonctions grâce au pointeur car quand tu fait *pointeur, en fait, tu modifie directement la variable à l'adresse où elle se trouve,

donc imaginons la fonction divisionAvecReste

elle prend comme paramètre dividende et diviseur

on a donc une fonction :

int divisionAvecReste (int dividende, int diviseur) cette fonction renvoie un int donc, mais que renvoie t'elle exactement ? le résultat où le reste ?? ce cas n'est pas faisable sans pointeur.

pour pouvoir réussir a avoir le résultat et le reste, il faut faire une fonction avec des pointeurs :

void divisionAvecReste (int dividende, int diviseur, int* reste, int* résultat) celle ci ne renvoie rien, en effet, les pointeur vont se charger de récupérer le reste et le résultat comment ? et bien voyons comment on utilise la fonction dans le main :

tout d'abord, on dois créer deux variables, qui vont recueillir les résultats :

int resteMain et int resultatMain (je met Main pour les différencier de ceux de la fonction, mais ça, tu n'est pas obligé de le faire )

et ensuite, je n'ai pas besoin de créer de pointeur, par exemple, je veux diviser 10 par 4 (ce qui fait 2, reste 2)

on appelle donc la fonction comme ceci (j'explique après) divisionAvecReste ( 10, 4, &resteMain, &resultatMain)

bon, pour le 10 et le 4, pas de problème je pense, et pour le reste, plus dur, mais je m'explique : int *reste est un pointeur, donc sa valeur dois être une adresse !! donc quand on fait &resteMain, on envoie bien l'adresse au pointeur reste, resteMain n'a pas de valeur, car on ne l'a pas initialisé, pareil pour resultatMain et résultat

et ensuite, dans la fonction, et bien tu fait ta division, et tu mettra le résultat comme ceci :

*resultat = dividende/diviseur (comme c'est un int, il donnera que la partie entière) et là, que se passe t'il ? et bien comme je l'ai dis, quand tu fait *resultat, tu modifie directement la variable pointée ! donc en fait, si tu veux, tu modifie la variable qui se trouve dans le main !

et pour le reste, tu fait pareil :

*reste = dividende%diviseur (le modulo(le %), ça te donne le reste de la division si tu te rappelle)

du coup, quand tu reviens dans le main après la fonction, tes variables resteMain et resultatMain aurons pris une valeur (dans ce cas, 2 et 2 )

autre utilisation des pointeurs, toujours en rapport avec les fonction mais tu le verra plus tard, si tu a des variables qui on une taille énorme (où un objet en C++) imaginons qu'il prenne 10ko de mémoire vive (ce qui est beaucoup pour une variable !!, seule des variables très spéciale pourrait avoir se genre de taille, mais en pratique, aucune n'auras jamais vraiment cette taille ) et bien si tu prend cette variable dans la fonction, il va la copier, et ça prendra donc 20ko de mémoire vive, et ainsi de suite si tu utilise des fonctions dans les fonctions. alors que si tu utilise un pointeur, qui font toujours la même taille (4 octet dans un système 32 bit) et donc si tu prend un pointeur plutôt que ta variable, tu rajoute seulement 4 octet dans la fonction, ce qui est une énorme économie ( environ 2500 fois moins de place est utilisée) j'utilise un cas extrême, mais c'est pour illustrer et quand on veut faire un jeu, l'économie de mémoire est très importante !!

j'espère que ça t'aideras aussi, je suis moins clair, parce que c'est plus dur a expliqué

jeudi 4 aout 2011

muklesur Messages : 746

A ok merci a toi , j'ai pus mettre au clair certain point qui me paressait impossible a comprendre , merci a toi , j'ai enfin a peu près compris a quoi servait les pointeurs ( plus ou moins ) mais tu vois l'exemple du haut avec la division , tu pourrais le mettre en code source s'il te plait ( ton explication est très clair mais un " schéma " vaut mieux qu'un long discours( sans vouloir abusé de ta gentillesse )) , d'ailleurs , j'ai enfin compris ce schéma

, merci encore .

ps: * attends avec impatience le code source de vanyali *

Quand on utilise un pointeur dans une fonction et que l'on veut renvoyé plusieurs résultat , on mets " void " comme type de fonction ?

jeudi 4 aout 2011 (Dernière édition vendredi 5 aout 2011)

Vanyali Messages : 1298

bon, j'avais pas donné de code source pour être sûr que tu comprenne par l'explication, mais c'est vrai que rien ne vaut un exemple bien concret, je te donne donc un code source commenté, et complet, il suffit de le copier et le compiler pour qu'il marche, je viens de le tester, j'ai même mis une petite boucle pour pas avoir à le redémarrer entre chaque essais essaye de le lire et de bien comprendre, mais tu verra, j'ai pris l'exemple de la division euclidienne parce que la fonction est extrêmement simple

#include <stdio.h>
#include <stdlib.h>

void divisionAvecReste (int dividende, int diviseur, int *resultat, int *reste);//ici, le prototype de la fonction

int main()
{
    int dividendeMain, diviseurMain ; //nos deux variables pour la division
    int resultat, reste; // nos deux variables de résultat

    char reponse = 'O'; //ici, on crée un variable pour boucler le programme

    while (reponse == 'O' || reponse == 'o') //on boucle le programme pour plus de simplicité pour le tester
    {
        //on commence par demander les chiffres à diviser :

        printf("entrez le dividende de la division euclidienne (avec reste)n");
        scanf("%d", ÷ndeMain);
        /*on note ici que le & signifie qu'on prend l'adresse
        et donc que la fonction scanf attend un pointeur !! si elle fonctionnais sans
        pointeur, on aurais du mettre"dividende = scanf("%d");" mais scanf peut retourner
        plusieurs valeurs, comme printf, donc on dois utiliser des pointeurs*/
        printf("entrez maintenant le diviseurn");
        scanf("%d", &diviseurMain);

        divisionAvecReste(dividendeMain, diviseurMain, &resultat, &reste);

        //et on affiche le résultat !! et on demande à l'utilisateur s'il veut recommencer
        printf("le resultat de l'operation est : %dnle reste est : %dnvoulez vous recommencer('O' = oui)n", resultat, reste);

        scanf("%c",&reponse); //ici, on vide le buffer, car il contient encore le caractère entrée du
        //scanf précédent, car entrer est un caractère ^^
        scanf("%c",&reponse); //c'est ici qu'on prend donc réellement le caractère

    }
    return 0;
}

void divisionAvecReste (int dividende, int diviseur, int *resultat, int *reste)
{
    *resultat = dividende/diviseur;
    *reste = dividende%diviseur;
    //et c'est tout !! les variables dans le main serons modifiés directement en utilisant les pointeurs !
}
vendredi 5 aout 2011

muklesur Messages : 746

A ok merci de ton aide ( et surtout de l'intention ) , j'ai pis saisir le truck mais c'est obligé que si on utilise un pointeur dans une fonction ( sauf main ) , cette fonction soit de type " void " ?

vendredi 5 aout 2011

Vanyali Messages : 1298

a, oui, pardon, le void n'est pas obligé, mais dans ce cas c'est le mieux, disons qu'ou sinon, tu dois faire un choix : qu'est ce que tu renvoie et qu'est ce que tu met en pointeur ? là, comme tu a deux truc qui se valent, tu met tout en pointeur mais si tu a un truc super important a renvoyer, ben tu peut renvoyer le plus important et puis le reste que tu veux récupérer, tu utilise les pointeurs. ça dépendra toujours du cas, mais le void n'est absolument pas obligatoire

vendredi 5 aout 2011

muklesur Messages : 746

Ok et grace a l'exemple j'ai enfin pus mieux comprendre ( non pas la théorie mais la pratique ) sur les pointeurs mais moi , pour ce qui est de faire un jeu en 3d , je ne suis que en 3eme , j'ai les connaissances mathématiques ?

samedi 6 aout 2011

Binboy Messages : 129

Lol, non et t'es loin de les avoirs ! Mais après peut être que t'es un surdoué qui peut se faire math sup les yeux bandés

samedi 6 aout 2011

muklesur Messages : 746

Question numérique je suis plus qu'un génie , mais apres géométrie , j'ai même plus envie d'en parler tellement ma prof était chi**te , bon ba je me reconvertirais sur un logiciel mais un jeu comme urban terror ou il y a déjà les codes sources , je peux m'en servir et tout modifier sauf les maps et donc plus besoin de connaissance non ?

samedi 6 aout 2011

Page suivante »