See site in english Voir le site en francais
Website skin:
home  download  forum  link  contact

Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length

Author Topic: [C++] Sauvegardes scenario  (Read 13562 times)

0 Members and 1 Guest are viewing this topic.

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #50 - 13 October 2007, 05:08:40
Mais franchement, ce que je t'avais deja dis: A ta place je commencerais par enlever TOUT les boutons qui ne
servent pas encore. Tu ne garde QUE ceux qui te servent/sont deja en fonction.
Tu vire TOUTES tes variables qui ne servent pas encore !!!

Par exemple:

Code: [Select]
enum
{
CREW_MANAGEMENT_PERFORM_EVA ,
LIFE_SUPPORT_POWER_AIR_FILTER,
LIFE_SUPPORT_POWER_AIR_TEMPERATURE,
LIFE_SUPPORT_POWER_CLIMATISATION,
LIFE_SUPPORT_POWER_RADIATOR ,
LIFE_SUPPORT_POWER_POMPE_AIR,
LIFE_SUPPORT_POWER_WATER_FILTER ,
LIFE_SUPPORT_POWER_WATER_ANALYSE,
LIFE_SUPPORT_AJOUTE_HUMIDITE,
LIFE_SUPPORT_RESCUE_POWER_AIR_FILTER,
LIFE_SUPPORT_RESCUE_POWER_AIR_TEMPERATURE ,
LIFE_SUPPORT_RESCUE_POWER_CLIMATISATION ,
LIFE_SUPPORT_DEPLOY_RADIATOR,
LIFE_SUPPORT_POWER_POMPE_WATER ,
LIFE_SUPPORT_DUMP_WATER ,
LIFE_SUPPORT_ENLEVE_HUMIDITE,
PROBES_RELEASEBUTTON,
BOTTOM_DOCK  ,  
FIN_BOUTON_POUSSOIR,
};

en:

Code: [Select]
enum
{
CREW_MANAGEMENT_PERFORM_EVA ,
BOTTOM_DOCK  ,  
FIN_BOUTON_POUSSOIR,
};

Tu va te retrouver avec 15-20 "Initialise" et 15/20 saverestore. Facile et lisible. Tu repart avec un code clean ou tu ne
bossera PLUS qu'en série.

Je rajoute une bouton "fuel dump" ?

1-declaration dans le tableau
2-intitialisebouton
3-saverestore
4-gestion systeme,poststep

en bref quand tu a fini les "fuel dump" dois marcher completement depuis un spawn par scn vide jusqu'au restore,
dock, en vol etc etc.

Avec tes 257 boutons dont 20 servent a quelques chose plus toutes tes variables inutile meme pour un pro ce serait
casse gueule.

Dan



Message modifié ( 13-10-2007 05:10 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #51 - 13 October 2007, 05:21:32

Ouais :sad:

Je comprend bien cette histoire de série .... je suis un peu têtu.
Je m'étais dit que je passerais au tout en série une fois tout ce qui a été
entamé en parallèlle serait mis à jour, mais je n'avais pas imaginé que
cette remise à niveau doive se faire tout de suite selon tes conseils.

Je pensais gagner du temps en faisant comme ça ... mais ça fait tellement
de trucs à penser en même temps que souvent ... oui ... c'est un problème ...

Donc le temps gagné ... effectivement :siffle:


Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #52 - 13 October 2007, 05:25:02
Je pense a un truc, la tu maintien DEUX liste une pour les initialise, une pour les saverestore, risque d'inconsistance
entre les deux, double boulot, pourquoi ne pas faire d'une pierre deux coup ?

Tu fous les save restore DANS les initialises, et dans les initialises tu rajoute en premier parametre le no de la
variable pour sauvegarde...

Exemple:

Code: [Select]
InitialiseDiode(001,DIODE_CHECK_ELEC,132, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);    
InitialiseDiode(002,DIODE_CHECK_ATMO,171, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);
InitialiseDiode(003,DIODE_CHECK_HYDRO,210, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);
InitialiseDiode(004,DIODE_CHECK_TEMP,249, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);


En rouge ce que j'ai rajouté: (attention j'ai coupé les lignes trop longue, copie/colle pas comme ca)

Code: [Select]
void Irridium::InitialiseDiode(int SaveRestoreNbr,int MotCle....
{
if(SaveRestoreNbr<0||SaveRestoreNbr>999||MotCle<DIODE_CHECK_ELEC......
{
return;  //fait rien
}
static int ResetOk=0;
if(ResetOk!=(int)this)
{
int I;
for(I=0;I<FIN_DIODE_SIMPLE;I++)
memset(&Diode[I],0,sizeof(BOUTON));
ResetOk=(int)this;
}
Diode[MotCle].InitOK=INITBOUTONOK; // fin initialisation
Diode[MotCle].Etat=EtatInitial;
Diode[MotCle].iBmpPosX=SourceBitmapX;
Diode[MotCle].iBmpPosY=SourceBitmapY;
Diode[MotCle].AidPosZoneX=PositionPanelX;
Diode[MotCle].AidPosZoneY=PositionPanelY;
Diode[MotCle].Panel=Panelo;
Scn.SavedVariable(SaveRestoreNbr,&Diode[MotCle].Etat);
}

ATTENTION A BIEN APPELLE LE SCN.INITCLASS AU TOUT DEBUT DE clbkSetClassCAP AVANT TOUT INITIALISE !



Message modifié ( 13-10-2007 05:26 )


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #53 - 13 October 2007, 05:28:25
Avec le code en dessus, tes boutons sont initialisé ET sauvé automatiquement et les structure remise a zéro automatiquement . La liste n'est plus double, le code est plus court et si un bouton est declaré il sera sauvé... gain sur tout les tableaux.

Dan



Message modifié ( 13-10-2007 05:29 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #54 - 13 October 2007, 05:34:13
Ah oui pas bête ... bravo encore!
Je pense pas encore instinctivement à faire ce genre de trucs, appeller
d'autres fonctions à partir d'une fonction déjà appellée depuis une autre.

Sinon, pour certains boutons, j'ai été obligé de créer des "mémoires" temporaires
quand un bouton a des états différents automatisés par un sélecteur par exemple.
D'ou ces boutonneries supplémentaires qui te paraissaient bizarres ;)

Trois chambres .... trois boutons ... neuf variables "mémoire"

   int iOuterDoorButtonState;
   int iChamberButtonState;
   int iInnerDoorButtonState;

Ps .... j'ai bien vu ça ... sinon CTD direct de toutes façons non ?
ATTENTION A BIEN APPELLE LE SCN.INITCLASS AU TOUT DEBUT DE clbkSetClassCAP AVANT TOUT INITIALISE !



Message modifié ( 13-10-2007 05:35 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #55 - 13 October 2007, 05:35:18
Quote
picto a écrit:
Donc le temps gagné ... effectivement :siffle:

Si tu regarde le nombre de fois ou tu reprend reecris tout, effectivement hein... ;)

par contre pour la desactivation commente dans un premier temps avec des  /* et */:


Code: [Select]
enum
{
CREW_MANAGEMENT_PERFORM_EVA ,
/*
LIFE_SUPPORT_POWER_AIR_FILTER,
LIFE_SUPPORT_POWER_AIR_TEMPERATURE,
LIFE_SUPPORT_POWER_CLIMATISATION,
LIFE_SUPPORT_POWER_RADIATOR ,
LIFE_SUPPORT_POWER_POMPE_AIR,
LIFE_SUPPORT_POWER_WATER_FILTER ,
LIFE_SUPPORT_POWER_WATER_ANALYSE,
LIFE_SUPPORT_AJOUTE_HUMIDITE,
LIFE_SUPPORT_RESCUE_POWER_AIR_FILTER,
LIFE_SUPPORT_RESCUE_POWER_AIR_TEMPERATURE ,
LIFE_SUPPORT_RESCUE_POWER_CLIMATISATION ,
LIFE_SUPPORT_DEPLOY_RADIATOR,
LIFE_SUPPORT_POWER_POMPE_WATER ,
LIFE_SUPPORT_DUMP_WATER ,
LIFE_SUPPORT_ENLEVE_HUMIDITE,
                */

BOTTOM_DOCK  ,  
FIN_BOUTON_POUSSOIR,
};

Comme ca si t'en enleve a tort... bonjour l'angoisse si tu les avait supprimé carrement.

Dan


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #56 - 13 October 2007, 05:43:05
Je te rapelle en passant de laisser de la place dans les numéros de saverestore pour pouvoir rajouter des truc, c'est
juste une question de lisibilité...

si tu fait tout +1  (imagine une grosse liste)

Code: [Select]
// diodes
InitialiseDiode(001,DIODE_CHECK_ELEC,132, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);    
InitialiseDiode(002,DIODE_CHECK_ATMO,171, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);

//boutons
InitialiseBouton(003,BOUTON_PROUT,210, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);
InitialiseBouton(004,BOUTON_CACA,249, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);

Quand tu voudra rajouer une diode tu n'aura pas le choix que la mettre a la fin de liste:

Code: [Select]
// diodes
InitialiseDiode(001,DIODE_CHECK_ELEC,132, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);    
InitialiseDiode(002,DIODE_CHECK_ATMO,171, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);

//boutons
InitialiseBouton(003,BOUTON_PROUT,210, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);
InitialiseBouton(004,BOUTON_CACA,249, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);

// Ah euh... diodes encore
InitialiseDiode(233,ENCORE_DIODE,132, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);    
// Ah tient ouais encore une bouton... c'est le foutoir la fin de liste
InitialiseBouton(234,ENCORE_BOUTON,132, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);    

Tandis que si tu laisse de la place dans la numérotation:

Code: [Select]
// diodes
InitialiseDiode(001,DIODE_CHECK_ELEC,132, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);    
InitialiseDiode(002,DIODE_CHECK_ATMO,171, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);

//boutons
InitialiseBouton(050,BOUTON_PROUT,210, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);
InitialiseBouton(051,BOUTON_CACA,249, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);

Tu peu rajouter dans la même section:

Code: [Select]
// diodes
InitialiseDiode(001,DIODE_CHECK_ELEC,132, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);    
InitialiseDiode(002,DIODE_CHECK_ATMO,171, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);
InitialiseDiode(003,ENCORE_DIODE,132, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);    

//boutons
InitialiseBouton(050,BOUTON_PROUT,210, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);
InitialiseBouton(051,BOUTON_CACA,249, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);
InitialiseBouton(051,ENCORE_BOUTON,132, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);

Des ID tu en a de dispo de 0 a 999... les vides eventuel dans la numérotation sont pas grave...



Message modifié ( 13-10-2007 05:48 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #57 - 13 October 2007, 05:51:41
Ouais ... je crois que je vais me décider enfin ... :sick:
Mais le panel sera moins joli pour les testeurs :sad:

Sinon,
Je crois que j'ai compris la boulette sur le memset ...
memset(&PanelDockStatus[REAR_DOCK],0,sizeof(DOCKSTATUS));
dans PanelDockStatus, j'ai 17 variables donc il faut que je fasse un for next comme ça ...

      int I;
      for(I=0;I<17;I++)
         memset(&PanelDockStatus,0,sizeof(DOCKSTATUS));



Message modifié ( 13-10-2007 06:04 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #58 - 13 October 2007, 05:52:15
Quote
picto a écrit:
Ps .... j'ai bien vu ça ... sinon CTD direct de toutes façons non ?
ATTENTION A BIEN APPELLE LE SCN.INITCLASS AU TOUT DEBUT DE clbkSetClassCAP AVANT TOUT INITIALISE !

Pas forcement, ca peut etre plus vicieux que ca, bug bizarre, CTD que dans certains cas et...
arrachage du peu de cheveux qui te reste après boulinium :badsmile:

Dan


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #59 - 13 October 2007, 05:56:02
Quote
picto a écrit:

Ouais ... je crois que je vais me décider enfin ... :sick:
Mais le panel sera moins joli pour les testeurs :sad:

Fais le fameux masque "désactivé" sous photoshop... 2mn...
En tant que testeur je trouve plus boulifiant d'avoir des centaines de boutons sans savoir
lequels marchent/sont a tester... un layer noir transparent avec des trous... tout con




Dan



Message modifié ( 13-10-2007 05:57 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #60 - 13 October 2007, 05:58:09
Quote
Je te rapelle en passant de laisser de la place dans les numéros de saverestore
pour pouvoir rajouter des truc, c'est juste une question de lisibilité...

C'était un peu pour ça que je ne parvenais pas à me décider d'en virer.
Je me disais que je n'avais pas à prnser à conserver de la place en faisant tout d'un coup.
Mais vu ce qui se passe sur chaque système ... :sick:

Genre un sélecteur qui deviens un poussoir ou inversement.
A chaque fois je me retape toutes les listes d'ENUM pour être sûr de pas faire une connerie.
Tout ceci selon l'adage :"Pourquoi faire simple quand on peut faire compliqué ! " :badsmile:


Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #61 - 13 October 2007, 06:08:16
Quote
picto a écrit:
Quote
Je te rapelle en passant de laisser de la place dans les numéros de saverestore
pour pouvoir rajouter des truc, c'est juste une question de lisibilité...
C'était un peu pour ça que je ne parvenais pas à me décider d'en virer.
Je me disais que je n'avais pas à prnser à conserver de la place en faisant tout d'un coup.
Mais vu ce qui se passe sur chaque système ... :sick:

Je te rapelle en passant de ne PAS bosser sur les scenarios maintenant, ca ca vient en dernier.

Meme en laissant des trous avec les changements qui vont intervenir dans le code
(enlever un bouton, modifier) tu va te retrouver avec une numérotation plutot dans le genre a la fin:

Code: [Select]
// diodes
InitialiseDiode(001,DIODE_CHECK_ELEC,132, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);    
InitialiseDiode(005,DIODE_CHECK_ATMO,171, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);
InitialiseDiode(009,ENCORE_DIODE,132, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);  

//boutons
InitialiseBouton(050,BOUTON_PROUT,210, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);
InitialiseBouton(054,BOUTON_CACA,249, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);
InitialiseBouton(056,ENCORE_BOUTON,132, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);

Comme la numérotation ne pose probleme que avec d'ancien scenario, juste avant la release tu renumerote tout:

Code: [Select]
// diodes
InitialiseDiode(001,DIODE_CHECK_ELEC,132, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);    
InitialiseDiode(002,DIODE_CHECK_ATMO,171, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);
InitialiseDiode(003,ENCORE_DIODE,132, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);  

//boutons
InitialiseBouton(050,BOUTON_PROUT,210, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);
InitialiseBouton(051,BOUTON_CACA,249, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);
InitialiseBouton(052,ENCORE_BOUTON,132, 26, XdiodeBmp, YdiodeBmp,Eteint, Panel1);

Tu fait tes scenarios ensuite et tu part super clean avec nickelium 1.0... du code et des scn clean pret
pour nickellium 1.5.

Pour 1.5 tu pourra plus faire ce cleanage a moins de faire que les scenarios ne soient plus
du tout compatible avec 1.0.  C'est possible, les SCN "DGIII et DGIV ne sont pas dans le meme repertoire.
(meme si les III marchent avec le IV quand meme... 20 ans de metier ;) )

Dan



Message modifié ( 13-10-2007 06:09 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #62 - 13 October 2007, 06:16:52
Euh ... oui ... j'en suis pas là.
J'essaye de cleaner Class Cap pour le moment et d'être sûr que
je bosse bien avec des variables pas dangereuses.

As tu vu le post sur memset ?
Je reposte ...

Sinon,
Je crois que j'ai compris la boulette sur le memset ...
memset(&PanelDockStatus[REAR_DOCK],0,sizeof(DOCKSTATUS));
dans PanelDockStatus, j'ai 17 variables donc il faut que je fasse un for next comme ça ...

int I;
for(I=0;I<17;I++)
memset(&PanelDockStatus,0,sizeof(DOCKSTATUS));



Message modifié ( 13-10-2007 06:18 )

Pic

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #63 - 13 October 2007, 06:22:47

Mais non ... c'est pas bon mon histoire ...
Trois tableaux de 17 variables ... :wall:

Si je fais ça, j'initialise un seul tableau
      int I;
      for(I=0;I<17;I++)
      memset(&PanelDockStatus,0,sizeof(DOCKSTATUS));

   memset(&PanelDockStatus[REAR_DOCK]         ,0,sizeof(DOCKSTATUS));
   memset(&PanelDockStatus[CORRIDOR_AIRLOCK]   ,0,sizeof(DOCKSTATUS));
   memset(&PanelDockStatus[FRONT_DOCK]         ,0,sizeof(DOCKSTATUS));


Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #64 - 13 October 2007, 06:24:51
Quote
picto a écrit:
As tu vu le post sur memset ?

Bon ben t'a tes devoirs pour ce week-end. :badsmile:

1-enlever tout ce qui ne marche pas
2-rajouter les saverestore dans les initialise

A la fin de ca faudra des beta teste et testes poussé pour etre sur que tu part clean
(je veux bien revoir ton code a ce moment, deux pairs de zieux valent mieux qu'une)
si c'est ok tu part super clean et après tu rajoute tes brique les une après les autres.

Un mur c'est très dur à monter d'un coup, mais en faisant une brique après l'autre même
un freluquet serais capable de monter la muraille de chine...

SERIE !!!!

Dan



Message modifié ( 13-10-2007 06:25 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #65 - 13 October 2007, 06:28:43

C'est l'heure ou je suis moins étanche :badsmile:
Tout deviens confus ..... d'Oie :)
Je reverrais tout ça après un petit dodo. ;)


Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #66 - 13 October 2007, 06:28:51
Désolé , j'ai pas bien regardé... 'ffectivement c'est pas bon

Ca serait plus juste ???
Code: [Select]
int I;
for(I=0;I<FIN_DOCK_PANELSTATUS;I++)
memset(&PanelDockStatus[I],0,sizeof(DOCKSTATUS));



Message modifié ( 13-10-2007 06:32 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #67 - 13 October 2007, 06:35:43

Ca y est j'ai compris !!!

Le sizeof vide toute la structure ( donc 17 variables en un coup).

typedef struct{
   int iDockingStatus;
... 14 lignes virées
   int iChamberButtonState;
   int iInnerDoorButtonState;
}DOCKSTATUS;


Mais il faut que je lui dise comment s'appellent les trois tableaux.
Vu qu'ils s'appellent comme ça ...

DOCKSTATUS PanelDockStatus[FIN_DOCK_PANELSTATUS];

et qu'ils sont listés comme ça ...

enum
{
   REAR_DOCK,
   CORRIDOR_AIRLOCK,
   FRONT_DOCK,
   FIN_DOCK_PANELSTATUS,
};

il faut lui dire fais trois fois le vidage de cette structure dont voici les noms de tableaux ...
Donc ....

      int I;
      for(I=0;I<FIN_DOCK_PANELSTATUS;I++)
      memset(&PanelDockStatus,0,sizeof(DOCKSTATUS));

C'est bon ?


Pic

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #68 - 13 October 2007, 06:37:20
Ah ben :sad:...
Le temps de faire mon post ... il y a une réponse .
Mais il vaut mieux que j'ai compris moi même que d'avoir encore du tout prémâché ;)



Message modifié ( 13-10-2007 06:38 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #69 - 13 October 2007, 06:41:59
Quote
picto a écrit:
Mais il vaut mieux que j'ai compris moi même que d'avoir encore du tout prémâché ;)

Exact et :applause: pour avoir trouvé tout seul.

Ca marche dans l'autre sens aussi: Quand je post du code essaie de bien le comprendre
et pose des question sinon...

A++

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #70 - 13 October 2007, 06:53:44

J'essaye toujours de comprendre ...
D'abord dans les grandes lignes ...
Par exemple sur les fonctions d'initialisation .

Puis sur les détails ... comme le initBoutonOk avec le memset
qui faisait partie de cette fonction.
Mais chacun sa vitesse. :sick:
Le principal étant que ça rentre petit à petit.
Et surtout que je ne comprenne pas de travers.

Ca c'est plus grave parce que ça fait faire des conneries. Ca fait deux trucs
 importants sur lesquels je m'aperçois en deux jours que je n'avais rien compris. :sad:

Reste ce :fu: This que je ne comprend toujours pas ;)
Mais ça viendra en temps voulu, je sais ce que c'est, instance et tout le
tremblement mais je ne comprend pas encore comment et pourquoi ça fonctionne.


Pic

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #71 - 13 October 2007, 06:58:11
Et en fait, c'est ce que j'avais fait !!! :lol:
Mais il vaut mieux être sûr !




Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #72 - 13 October 2007, 07:26:13
Quote
picto a écrit:
Reste ce :fu: This que je ne comprend toujours pas ;)
Mais ça viendra en temps voulu, je sais ce que c'est, instance et tout le
tremblement mais je ne comprend pas encore comment et pourquoi ça fonctionne.

this c'est le handle de l'instance de la classe ou est le this.

La classe irridium est instanciée par orbiter pour chaque MO dans le scenario,
Orbiter fait probablement un truc dans le genre:

VESSEL hVessel[Nbr]=new Irririum();

Avec deux vessel dans le scenario tu aura donc deux handle (adresse mémoire) par exemple:

MO1: hVessel[0]=0x4567890
MO2: hVessel[1]=0x7435689

"This" c'est ce chiffre la, le handle...

Donc dans le MO1 this donnera par exemple: 0x4567890 et dans MO2 this donnera 0x7435689

comme notre variable "static int ResetOk" est static au contraire des autres elle va retenir
sa valeurs pour toutes les instances.

Dans l'orde d'execution ca ce passera comme cela pour chaque Initialise():

Orbiter charge instancie et execute le clbkSetClassCap de MO1

MO1 Initialise(1):  InitOK!=0x4567890 donc remet à zero la structure de MO1 et donne la valeur InitOK=0x4567890  
MO1 Initialise(2):  InitOK==0x4567890, saute la remise a zero de la stucture
MO1 Initialise(3):  InitOK==0x4567890, saute la remise a zero de la stucture
MO1 Initialise(4):  InitOK==0x4567890, saute la remise a zero de la stucture
MO1 Initialise(5):  InitOK==0x4567890, saute la remise a zero de la stucture


Orbiter charge instancie et execute le clbkSetClassCap de MO2

InitOK est toujours egal a 0x4567890  vu qu'il a gardé la valeur précédente (static)

MO2 Initialise(1):  InitOK!=0x7435689 donc remet à zero la structure de MO2 et donne la valeur InitOK=0x7435689
MO2 Initialise(2):  InitOK==0x7435689, saute la remise a zero de la stucture
MO2 Initialise(3):  InitOK==0x7435689, saute la remise a zero de la stucture
MO2 Initialise(4):  InitOK==0x7435689, saute la remise a zero de la stucture
MO2 Initialise(5):  InitOK==0x7435689, saute la remise a zero de la stucture



C'était un moyen un peu tordu je l'avoue de faire une remise a zero des structure automatique
sans faire appel a une autre fonction genre IniButtonReset() ou un memset ou une variable qu'on aurais
du initialiser avant (donc autant de risque d'oubli que IniButtonReset() ou memset)

En bref on aurrais pu faire ca:

Memset(&bouton,0,sizeof(BOUTTON);
Initialise(1);
Initialise(2);

ou ca:

IniButtonReset())  // memset dedans
Initialise(1);
Initialise(2);

ou ca si on avait mis le memset dans la fonction initialise:

bBoutonResetDone=FALSE;
Initialise(1);  //remise a zero structure et bBoutonResetDone=TRUE
Initialise(2);

Avec le "this" on fait que ca et c'est tout automatique, au premier appel la structure et remise a zéro.
aucun risque d'oubli.

Initialise(1);  // memset de la structure de l'instance
Initialise(2);
Initialise(3);
Initialise(4);

Tordu hein ? :badsmile:

Dan



Message modifié ( 13-10-2007 07:42 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #73 - 13 October 2007, 08:10:53
A relire à tête reposée mais je comprend le principe.

Lire un truc que tu sais être unique et l'utiliser comme test pour faire juste une fois.
Ok, c'est le même pricipe que le FIRST_STEP_INIT_DONE dans post step sur le principe.

Mais ce que je trouvais étrange, c'est que ce This "contient" toutes les autres variables quand je
 regardais dans la fenêtre du bas en debugging sur MSVC. Ca apparaissait donc plus compliqué au
premier abord que ce simple handle d'une case mémoire comme tu expliques plus haut. Donc juste
une valeur.

Faudrait que je teste un scenario avec deux Irridium en debug avec MSVC et
basculer de l'un à l'autre pour mieux voir ce This et voir ce qui se passe dans l'un
et l'autre quand je bascule.



Message modifié ( 13-10-2007 13:50 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #74 - 13 October 2007, 14:21:26
Pas besoin de bascule... Attention le clbkSetClassCap n'est pas executé quand tu bascule (F3)
mais à l'instanciation du vessel, en bref 1X pour chaque vessel quand le scenario démarre
c'est tout. C'est la toute premiere chose qui est executée de ta classe suivi par clbkLoadStateEx
si lancé depuis un scenario. (au lieu d'avec ScN editor) et chacun est executé le nombre de fois
qu'il y a de vessel.

Pour voir InitOK=this en action: deux scenarios, F9 sur "InitOK" et tu regarde... comme
tu a 523 InitBouton tu devra faire 523 F10 avant de voir le InitOK et this changer pour
le deuxieme vessel mais le principe est la.

A++

Dan



Message modifié ( 13-10-2007 14:33 )

« Last Edit: 13 October 2007, 15:09:01 by DanSteph »