:: PlayerAdvance.org ::  

Précédent   :: PlayerAdvance.org :: > :: Développement Amateur :: > Autres > Aide au développement

Aide au développement Aide au développement amateur sur d'autres supports

Publicité

Réponse
 
Outils de la discussion Modes d'affichage
Vieux 14/04/2006, 14h26   #1
sensei
Membre confirmé
 
Date d'inscription: 14/02/2006
Messages: 271
Par défaut Reset ou redémarrage d'un programme ?

SAlut,

j'ai un programme qui commence très classiquement par :

"int main(void){"

Comment je peux faire pour reseter ou relancer ce programme ? il faut refaire un appel à la fonction ?

Merci
sensei est déconnecté   Réponse avec citation

Publicité

Vieux 14/04/2006, 15h15   #2
Gwoin
Membre confirmé
 
Date d'inscription: 10/11/2005
Localisation: Lille
Messages: 212
Par défaut

le but du reset c'est de relancer le jeu n'est-ce pas?

Tu peux alors creer une fonction du genre "InitGame()" qi contient toute l'initialisation de ton jeu.

Dans ton main tu fais appel à cette fonction une permiere fois pour initialiser ton jeu et à chaque fois que tu désires reseter ton jeu, tu refais appel à cette fonction.

Code:
int main()
{
    InitHardWare();
    InitGame();

    while (1)
    {
         ...
    }
}

bool InitGame()
{
    m_iLevel = 0;
    m_iScore = 0;

    InitBackgrounds();
    InitSprites();

    ...
}
C'est juste un exemple, mais c'est tout ce que tu peux faire.
Tu ne peux pas relancer le programme à proprement dit. Donc tu relances les phases de jeu avec une petite réinitialisation
__________________
Gwoin, un surnom comme ça, on le vit bien!
Gwoin est déconnecté   Réponse avec citation
Vieux 14/04/2006, 15h37   #3
birslip
Membre confirmé
 
Date d'inscription: 10/11/2005
Messages: 353
Par défaut

Oui, je pense que ton soucis est un faux problème, fait comme gwoin dit ça se passera sûrement très bien.
Aussi, grâce au bios tu peux faire un "soft reset", mais je doute que ce soit ce dont tu as besoin
Code:
asm volatile("swi 0x00");
__________________
Mon super blog!
birslip est déconnecté   Réponse avec citation
Vieux 14/04/2006, 17h58   #4
sensei
Membre confirmé
 
Date d'inscription: 14/02/2006
Messages: 271
Par défaut

EUh m'a l'air bien compliqué tout ca

En fait oui, c'est juste pour recommencer unepartie quand celle ci se termine. Comme au début du programme je déclare toutes mes varialbles ( et donc 0 pour le score, level...) ait je vraiment besoin d'une fonction init ?

Pour le soft reset, je pense pas que c'est dont j'ai besoin
sensei est déconnecté   Réponse avec citation
Vieux 14/04/2006, 18h25   #5
Nesgba
Membre confirmé
 
Date d'inscription: 10/11/2005
Messages: 830
Par défaut

Citation:
Envoyé par sensei
EUh m'a l'air bien compliqué tout ca

En fait oui, c'est juste pour recommencer unepartie quand celle ci se termine. Comme au début du programme je déclare toutes mes varialbles ( et donc 0 pour le score, level...) ait je vraiment besoin d'une fonction init ?
int main (void){
unsigned char jemesuisfaittuer=0 ;
rebelotte:
InitJeu();
while(1){
if(jemesuisfaittuer) goto rebelotte ;
updateJeu() ;
updateSprites() ;
updatenimportnawaktoutefaconcpourexpliquer();
}}

ps: (je sais meme pas si ca marche d'ailleur)
pss: me gueulez pas dessu je ne l'utilise pas Oo
Nesgba est déconnecté   Réponse avec citation
Vieux 14/04/2006, 18h43   #6
Japi
Membre confirmé
 
Date d'inscription: 14/12/2005
Messages: 558
Par défaut

ouais, moi j'utilise un truc similaire à l'exemple de Nes et ça marche bien.
__________________
Make it work then fix it! [I2] [Double S-kiv]
Japi est déconnecté   Réponse avec citation
Vieux 14/04/2006, 21h08   #7
Gwoin
Membre confirmé
 
Date d'inscription: 10/11/2005
Localisation: Lille
Messages: 212
Par défaut

Citation:
Envoyé par sensei
EUh m'a l'air bien compliqué tout ca

En fait oui, c'est juste pour recommencer unepartie quand celle ci se termine. Comme au début du programme je déclare toutes mes varialbles ( et donc 0 pour le score, level...) ait je vraiment besoin d'une fonction init ?

Pour le soft reset, je pense pas que c'est dont j'ai besoin
ho, y'a rien de bien compliqué la dedans
Le fait de faire une fonction, ca te permet de l'appeler n'importe quand (quand le joueur appuie sur START en cours de jeu, quand le joueur perd la partie et en recommence une, au tout début du jeu, ...).

Il te suffit de déclarer tes variables en globale (en dehhors et au dessus du main).

Comme ça tu mets toute l'initialisation de tes variables dans cette fonction et tu es tranquille : tu réinitialises tout en un seul appel à une seule fonction

Le code de NesGBA doit très certainement fonctionner aussi, mais il connaît mon aversion pour les GOTO
Par contre tu ne peux pas appeler le GOTO en dehors du main.

Mais en dehors de ce probleme, tu vas devoir te familiariser avec les fonctions.
C'est tellement pratique de compartimenter son code. Ca permet de rappeler tout une partie de code en un seul appel et donc de le modifier aussi à un seul endroit...
__________________
Gwoin, un surnom comme ça, on le vit bien!
Gwoin est déconnecté   Réponse avec citation
Vieux 14/04/2006, 21h16   #8
Kyros
Membre
 
Date d'inscription: 10/11/2005
Localisation: Grenoble
Messages: 38
Question Avec pointeurs de fonctions ... ?

Bonjour tout le monde ,

Ma façon de faire est dans le même ordre d'idée que celle de Nes et Gwoin sauf que j'utilise des pointeurs de fonctions ... ça donne quelque chose comme ça :

Déclaration du pointeur de fonctions :
Code:
void (*in_game)(void);

/** Dans cette exemple toutes les fonctions "pointée" ne retourne rien (le premier void) et n'ont aucun paramètre (deuxième void). **/
Code:
void initialisation_menu(){
/** on efface tout de la mémoire puis chargement en mémoire des maps , palettes ,sprites , ect ... **/

// une fois tout chargé en memoire on passe à la gestion des evenements/actions qui auront lieu dans le menu .
in_game = &dans_le_menu;
}
Code:
void dans_le_menu(){
/** ici on fait tout ce qu'on pourrait faire dans un menu , par exemple déplacer un curseur , choix d'un mode de jeu ... **

// si on appuie sur la touche A , on lance le niveau 0 .
if( appuie(TOUCHE_A) ){ in_game = &initialisation_niveau0; }
}
Code:
void initialisation_niveau0(){
/** on efface tout de la mémoire puis on charge les perso , les méchants , les maps , les palettes , ect ... **/

// une fois tout chargé en memoire on passe à la gestion des evenements/actions qui auront lieu dans le niveau0 .
in_game = &dans_le_niveau0;
Code:
void dans_le_niveau0(){
/** on fait bouger les méchants , on bouge le perso si on appuie sur les touches ... **/

// Si on appuie sur la touche SELECT , on retourn au menu :
if( appuie(TOUCHE_SELECT) ){ in_game = &initialisation_menu; }

//Autre exemple d'utilisation :
if( atteint_fin_du_niveau0 ){ in_game = &initialisation_niveau1 ; }
Bon j'arrete là pour les exemples , ca doit être assez lourd à lire en plus .
Pour ceux qui connaissent , ca ressemble assez à un automate ...

Sinon pour finir , l'inclusion de tout ça dans le main() :
Code:
int main(void){
ham_Init();
in_game = &initialisation_menu;
while(TRUE){
if( VBLANK ){
/** blabla **/

in_game();

/** blabla **/
} return 1;
}
Wala wala , j'espère que ca pas était trop long et surtout que ca été compréhensible ... sinon j'essayerais des répondre aux questions .
Après pour un vrai reset il sauffit d'étendre l'exemple de initialisation_menu() ... mais j'pense que c'est largement faisable ... j'espère juste que ca sera pas trop compliqué à comrpendre .
Kyros est déconnecté   Réponse avec citation
Vieux 14/04/2006, 21h27   #9
sensei
Membre confirmé
 
Date d'inscription: 14/02/2006
Messages: 271
Par défaut

Bon ok... je croyais être passé de developpeur débutant à développeur débutant confirmé, mais quand je lis vos posts, je me rends compte que je suis une sous merde de développeur...

Voici mon code :


int main(void){
rebelotte:
Déclaration de toutes mes variables
Boucle principale
if...
if...
if...
if je me fais toucher alors goto rebelotte
}

Mais ca marche pas désolé...
sensei est déconnecté   Réponse avec citation
Vieux 14/04/2006, 22h52   #10
Kyros
Membre
 
Date d'inscription: 10/11/2005
Localisation: Grenoble
Messages: 38
Wink

J'sais pas trop comment marche le goto en C (peut etre pareil qu'en ARM ... faudra que je regarde ) ... mais on me l'a toujours déconseiller en cours ...sinon sans utiliser de pointeurs je dirais :

Déclaré une variable global reset :
Code:
u8 reset;
Fonction d'initialisation / de reset :
Code:
void initialisation_du_jeu(){
J'efface tout de la memoire;
J'affecte des valeurs à mes variables;
Je charge mes maps,tiles,sprites,palette en mémoire;
reset=0;
}
Ensuite pour le main :
Code:
int main(void){

reset=1 ; // pour initialiser une première fois le jeu .

while(TRUE){ //Boucle principale
if( reset==0 ){ // Gestion du jeu .
if...
if...
if...
if je me fais toucher alors reset = 1;
}else{ // On fait reset du jeu .
initialisation_du_jeu();
}
}
Juste une idée comme ça , ca me semble pas trop mal , j'ai pas testé donc j'suis pas sur que ca marche exactement comme tu le demande .

Après relecture du sujet , j'crois bien que c'est la même chose que proposait Gwoin ... déclare tes variables avant le main pour les "rendre" globales (si j'ai bien suivi tu utilise qu'un seul fichier ... ) comme ca tu pourra accéder à ces variables depuis toutes tes fonctions ( alors que quand tu déclare une variable dans le main() , tu ne pourra pas y accéder depuis une autre fonction ... ) .

Bon j'sais pas si j'suis super clair quand meme , pas l'habitude de poster , et surtout pas l'habitude d'essayer d'aider .
Kyros est déconnecté   Réponse avec citation
Vieux 14/04/2006, 23h04   #11
Japi
Membre confirmé
 
Date d'inscription: 14/12/2005
Messages: 558
Par défaut

Pour info, le goto n'est pas une mauvaise chose.
Il faut juste l'utiliser là où il est necessaire.

Par exmple, si ya moyen de faire avec un for, un while ou un if, on utlise pas le goto pour faire des boucles, ou alors remonter de partout et faire des codes incomprehensibles.

Par contre, si on veut sortir d'une double double imbriqué, là, c'est bien.

For (blablabla)
For (blablabla)
if (machinchose == ça) goto LABA;
FINfor
FINFor

LABA:

parce que sans goto, ben sortir des deux boucles d'un coup, ça fait faire des trucs moches.

voilà, c'est un truc de base du CPU le goto et donc c'est pas forcement le diable, mais faut juste l'utiliser sans abuser.

enfin, c'est mon avis.
__________________
Make it work then fix it! [I2] [Double S-kiv]
Japi est déconnecté   Réponse avec citation
Vieux 14/04/2006, 23h09   #12
Kyros
Membre
 
Date d'inscription: 10/11/2005
Localisation: Grenoble
Messages: 38
Thumbs up

Ok je note merci pour la réponse rapide Japi ... c'est vrai que dans cette situation , ca l'air d'être une bonne solution .

J'y penserais dorénavant .
Kyros est déconnecté   Réponse avec citation
Vieux 14/04/2006, 23h55   #13
sensei
Membre confirmé
 
Date d'inscription: 14/02/2006
Messages: 271
Par défaut

Merci pour vos explications mais désolé c'est trop complexe pour moi... j'arrive a faire la boucle goto mais ca marche pas mieux...
sensei est déconnecté   Réponse avec citation
Vieux 15/04/2006, 00h05   #14
Yodajr
Administrateur
 
Date d'inscription: 09/11/2005
Messages: 3 750
Par défaut

Citation:
Envoyé par sensei
Merci pour vos explications mais désolé c'est trop complexe pour moi... j'arrive a faire la boucle goto mais ca marche pas mieux...
Quand tu dis que ca ne marche pas, ca fait quoi exactement ?

Au pire poste cette partie de code, ca sera plus simple...
Yodajr est déconnecté   Réponse avec citation
Vieux 15/04/2006, 00h29   #15
sensei
Membre confirmé
 
Date d'inscription: 14/02/2006
Messages: 271
Par défaut

Alors comme j'ai dit plus haut :

nt main(void){
rebelotte:
Déclaration de toutes mes variables
Boucle principale
if...
if...
if...
if je me fais toucher alors fin du jeu et Si Stylus touche l'ecran alors goto rebelotte
}

Et quand je touche lecran avec le stylet, il ne se passe rien... PAr contre je ne fai saucun vidage de mémoire nul part...
sensei est déconnecté   Réponse avec citation
Vieux 15/04/2006, 01h13   #16
Kyros
Membre
 
Date d'inscription: 10/11/2005
Localisation: Grenoble
Messages: 38
Question Et comme ça ^^ ?

Vue ton code , et j'ai tester vite fais goto ( et non GOTO il reconait pas , bref , note à moi même ) ... je dirais que ton code devrait plutot être :
Code:
  Déclaration de toutes mes variables;
  // u8 var_1; par exemple .

int main(void){
  rebelotte:
  Affectations de valeurs aux variables précédement déclarées .
  // var_1 = 7; par exemple .
  Boucle principale
  if...
  if...
  if...
  if je me fais toucher alors fin du jeu et Si Stylus touche l'ecran alors goto rebelotte
}
Pour le if je me fais toucher et tout , ca j'sais pas par contre si c'est juste ou pas .
Mais déjà j'pense qu'il y a un problème dans ton code car en utilisant goto vers le label rebelotte tu demande au programme de re-déclarer des variables ayant le même nom que celle déjà déclarées ( ... oula phrase bancal ... ) :

Code:
int main(void){
   rebelotte:
   u8 var_1=7;
   goto rebelotte;
}
, me donne une erreur ( j'utilise le compilateur fourni avec HAM toujours , et dans ce cas là ça compile pas ) . Alors que :
Code:
  u8 var_1;
int main(void){
  rebelotte:
  var_1=7;
  goto rebelotte;
}
, est juste .

Cherche de ce coté là , c'est à dire , déclare tes variables avant le main() ... sinon pour ce soir , si c'est pas ça ... j'ai plus d'idée pour l'instant .

J'espère que tu t'en sortiras .

---
Mouais , après relecture du post de Nes , en fait t'es pas obligé de déclarer tes variables hors du main() , mais déclare les tout de même avant le rebelotte: et fais les affectations après (comme dans l'exemple de Nes , ni plus ni moins).

Dernière modification par Kyros ; 15/04/2006 à 01h29. Motif: "bancal" et non "bacal" ... faut justifier forcément les modif' ^^ ?
Kyros est déconnecté   Réponse avec citation
Vieux 15/04/2006, 02h10   #17
mastertop101
Membre confirmé
 
Date d'inscription: 14/11/2005
Messages: 346
Par défaut

personnelement je fais qqch comme :

if(jemesuisfaittuer)
{
var1=0;
var2=0;
var3=0;
loadbg(...);
setspritexy(...);
}
mastertop101 est déconnecté   Réponse avec citation
Vieux 15/04/2006, 02h31   #18
Nesgba
Membre confirmé
 
Date d'inscription: 10/11/2005
Messages: 830
Par défaut

tu code toujours kyros ? ca fesai un bail tu nous sort un ptit projet un de ces jours ?
Nesgba est déconnecté   Réponse avec citation
Vieux 15/04/2006, 12h01   #19
sensei
Membre confirmé
 
Date d'inscription: 14/02/2006
Messages: 271
Par défaut

Merci pour vos propositions, j'essaierais ce soir
sensei est déconnecté   Réponse avec citation
Vieux 15/04/2006, 15h52   #20
Japi
Membre confirmé
 
Date d'inscription: 14/12/2005
Messages: 558
Par défaut

ouais, le truc sur la declaration des valriables, c'est de les declarer de mettre ton label puis de les affecter comme ça quand tu fais ton goto, tu ne les redéclare pas, tu les reaffecte juste.
__________________
Make it work then fix it! [I2] [Double S-kiv]
Japi est déconnecté   Réponse avec citation
Vieux 15/04/2006, 23h34   #21
sensei
Membre confirmé
 
Date d'inscription: 14/02/2006
Messages: 271
Par défaut

Ma fonction goto ne marche pas je crois...

j'ai juste ecris :

rebelotte:
...
...
...
goto rebelotte;

La synthaxe est elle bonne ?
rien d'autre à déclarer ?
sensei est déconnecté   Réponse avec citation
Vieux 16/04/2006, 00h04   #22
Nesgba
Membre confirmé
 
Date d'inscription: 10/11/2005
Messages: 830
Par défaut

la syntaxe est bonne, concernant la redeclaration d'une variable c'est pas un probleme si tu compille du c
exemple:
Code PHP:
Start:
signed short hello =0;
goto 
Start 
cette syntaxe cause une erreur lors de la compillation pour du c++ a moin que tu mette un test conditionnel.
Code PHP:
Start:
if (
initcompteursigned short hello =0;
goto 
Start 
on peut eviter l'utilisation du goto dans pas mal de cas (fin d'une double boucle anticipée par exemple) on peut le remplacer par un "return;" dans une fonction mais a mon sens si tu doit rajouter un test pour eviter le goto je prefere encore l'utiliser.

et y'en a vraiment marre des gens qui detestent le goto alors qu'ils savent meme pas a quoi il sert, dans le style : "a ben j'ai vu un gars qui avai l'air de pas mal toucher sa bille en c qui a dit que le goto c'est mal alors je vais dire pareil que lui j'ai moin de chance de me manquer" ca c'est bien une facon de penser a la con. utilise ce qui te sert, tu t'en fou de ce qu'en pensent les autres.

Dernière modification par Nesgba ; 16/04/2006 à 00h13.
Nesgba est déconnecté   Réponse avec citation
Vieux 16/04/2006, 13h28   #23
Gwoin
Membre confirmé
 
Date d'inscription: 10/11/2005
Localisation: Lille
Messages: 212
Par défaut

Citation:
Envoyé par Nesgba
et y'en a vraiment marre des gens qui detestent le goto alors qu'ils savent meme pas a quoi il sert, dans le style : "a ben j'ai vu un gars qui avai l'air de pas mal toucher sa bille en c qui a dit que le goto c'est mal alors je vais dire pareil que lui j'ai moin de chance de me manquer" ca c'est bien une facon de penser a la con. utilise ce qui te sert, tu t'en fou de ce qu'en pensent les autres.
Reste zen Nesgba. Pour ma part, je n'utiliserai clairement jamais de goto car un programme bien structuré et bien compartimenté en fonctions (ou classes) reste pour moi la meilleur solution.

Je n'ai jamais attendu que quelqu'un me dise que le goto était mal ou bien.
Et sans vouloir ramener ta remarque à moi, au boulot je développe un logiciel en C++ qui contient plus de 250 fichiers sources et plus de 100 000 lignes de code, que je développe seul de A à Z et jamais je n'aurais pu faire un logiciel propre et qui ne plante pas avec des goto.
J'ai une architecture logiciel qui ne peut pas se permettre une fuite mémoire ou un mauvais adressage parce qu'un goto mal placé aura réinitialisé une variable ou utilisé un pointeur qui aura était libéré. On pe peut pas gérer un aussi gros programme sans savoir exactement ce qu'on fait.

Et cette facon de programmer me permet de faire des programmes qu'on peut rapidement et facilement mettre à jour (un simple appel à une fonction est quand même plus simple à écrire/comprendre/mettre en place que des retours en arrières ou en avant dans le code)

Mais bon, tu as raison, il faut que Sensei utilise ce qui lui sert et apprenne lui même ce qu'il prefere utiliser pour coder.

Apres tout, certains preferent passer plus de temps à debugguer et essayer de comprendre pourquoi leur code ne fonctionne pas plutot que de tout prévoir à l'avance.
C'est une question de point de vue... je ne pense pas que le mien soit plus con qu'un autre.
__________________
Gwoin, un surnom comme ça, on le vit bien!
Gwoin est déconnecté   Réponse avec citation
Vieux 16/04/2006, 13h41   #24
Japi
Membre confirmé
 
Date d'inscription: 14/12/2005
Messages: 558
Par défaut

Si tu prevois bien en avance comme tu dis, ton goto ne provoquera ni erreur, ni reinit de variable ni rien d'autres puisque tout sera bien fait.

Enfin bon, on le prone pas, jusque des fois, ça evite 5 lignes de code de plus avec des conditions en plus et que derriere, ça sera transformer en asm avec des sauts to label de partout que t'en mettes ou pas.
__________________
Make it work then fix it! [I2] [Double S-kiv]

Dernière modification par Japi ; 16/04/2006 à 13h55.
Japi est déconnecté   Réponse avec citation
Vieux 16/04/2006, 15h51   #25
Brunni
Super Modérateur
 
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 226
Par défaut

Clair, parfois les gens s'embêtent avec des structures de boucles à la con (enfin c'est mon avis) alors qu'un goto, continue, exit ou return serait tellement plus adapté et compréhensible, mais non "un bon l33t de programmeur n'utilise jamais les goto"...
Par contre un abus de goto dans tous les sens peut effectivement rendre le programme moins lisible et favoriser les bugs, mais c'est pareil pour les boucles imbriquées avec des conditions pas toujours claires du style l_bSuccess, l_bQuit et j'en passe.
Brunni est déconnecté   Réponse avec citation
Réponse

Liens sociaux

Publicité



Utilisateurs regardant la discussion actuelle : 1 (0 membre(s) et 1 invité(s))
 
Outils de la discussion
Modes d'affichage

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 12h59.


Édité par : vBulletin® version 3.7.2
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Tous droits réservés.
Version française #16 par l'association vBulletin francophone
Design par Ass-Itch, DJP et Dr.Vince