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 15161 times)

0 Members and 1 Guest are viewing this topic.

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 258
  • Hein, quoi !?
    • FsPassengers
Reply #25 - 06 October 2007, 01:17:50
Les idées sont bonnes, c'est juste un manque de connaissance sur les détails.
Et en prog les détails.... y a que ca ! :badsmile:

Dan


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 258
  • Hein, quoi !?
    • FsPassengers
Reply #26 - 06 October 2007, 01:35:41
pour éviter la merde de quoi qu'on causait tout a l'heure (en mp pour ceux qui espionnent ;) )

Change LogError comme suis:


Code: [Select]
/////////////////////////////////////////////////////////////////
// LogError
/////////////////////////////////////////////////////////////////
void SaveRestoreScenario::LogError(char* Valeur)
{
    #ifdef _DEBUG
        MessageBox(NULL,Valeur, "LogError SaveRestore",MB_OK);
    #endif
}

quoi que t'est ce ?

les directive qui commence par "#" sont des directives de compilation, si tu regarde dans tes propriétés d'irridium
tu verra qu'en debug il défine ce mot clé: "_DEBUG"

Ces lignes vont dire au compilateur:
    #ifdef _DEBUG
        MessageBox(NULL,Valeur, "LogError SaveRestore",MB_OK);
    #endif

"Compile la ligne entre if/endif QUE si le mot clé _DEBUG est présent.

En bref la fameuse ligne t'envoie une messagebox d'erreur si il y a une merde avec saverestore
a l'execution (le fameux ISP l'aurait declenché)

pourquoi on ne la met QUE en debug cette messagebox ?
Pasque'une messagebox en fullscreen c'est blocage et redemarrage de l'ordi si le gars a pas l'idée
de faire ALT tab et cliquez ok a l'aveuglette. Donc que pour toi pour eviter les erreurs genre "ISP"
ou autre et pas en release pour les testeur ou utilisateurs.

Ca reste du controle d'erreur basique... j'ai pas poussé vu que saverestore a été ecrite en deux heure...

A++

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #27 - 06 October 2007, 01:37:27
J'ai toujours su que j'aurais dû être chef!
Je sais pas de quoi :lol: mais chef  :badsmile:
Le chef :"Fais ci .... fais ça ... "
L'autre:"Comment ? "
Le chef :"Démerde toi !"
L'autre:"T'es sûr que c'est une bonne idée ?"
Le chef :"Oui !!!"


Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 258
  • Hein, quoi !?
    • FsPassengers
Reply #28 - 06 October 2007, 01:37:46
Essaie après modif de remettre "ISP" tu verra mieux de quoi qu'on cause.

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #29 - 06 October 2007, 01:49:04

J'ai regardé sur MSVC ce qu'est une MessageBox.

Je tombe sur un define de winuser.h, j'en déduis donc que c'est
une macro qui permet d'ouvrir une nouvelle fenêtre windows.

Quand au Debugging sur MSVC, j'ai encore énormément de mal
à savoir QUOI regarder quand j'ai une erreur. Face à l'afflux d'infos,
si ce n'est pas clairement identifiable et en rapport avec l'idée que je
me suis fait au préalable de la source possible d'erreur, je n'y arrive pas.


Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 258
  • Hein, quoi !?
    • FsPassengers
Reply #30 - 06 October 2007, 01:54:28
Faut toujours revenir au source du probleme...

1-J'ai une erreur... un code que j'ai ecrit ne fait pas ce qu'il doit...
2-quel est ce code ?


Voila LA question...

Pas de poussée, c'est soit le define des moteurs, soit le carburant, donc on check en premier les fonctions et les
parametres passé a ces fonctions en debug "break"... tient ? zéro ? ah ben voila....

3-pourquoi la valeur est à zéro?... et hop la pelote...dévide toussa

"1-J'ai une erreur 2-quel code devrait faire marcher ce truc correctement? 3-controle du code en question"

1-Pas de save de la valeur ISP
2-Quel code ? le saverestore !
3-Trace du saverestore de l'ISP.

Code: [Select]
Scn.SavedVariable("ISP", &Loaded_ISP);
Dan



Message modifié ( 06-10-2007 01:56 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #31 - 06 October 2007, 02:06:39

Encore un truc ou j'ai du mal tiens .... :doubt:

C'est quand je lis un synopsis comme celui ci, j'ai encore du
mal à voir que le compilo me réclame une écriture de ce type ...

MessageBox(
    HWND hWnd,
    LPCTSTR lpText,
    LPCTSTR lpCaption,
    UINT uType
    )

MessageBox(NULL,Valeur, "LogError SaveRestore",MB_OK);


Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 258
  • Hein, quoi !?
    • FsPassengers
Reply #32 - 06 October 2007, 02:19:36
Quote
picto a écrit:
MessageBox(
    HWND hWnd,
    LPCTSTR lpText,
    LPCTSTR lpCaption,
    UINT uType
    )

Chierie de doc MS, pas toujours évident c'est vrais... pour pas te faire ch...
tu cherche dans les news groupes (usenet)...

"MessageBox win32"  (le win32 c'est pour éliminer les autres plateform comme linux et autre des fois je
rajoute "C++" pour eviter d'autre language suivant les résultats)

En bref ca donne ca:
http://groups.google.fr/groups?hl=fr&q=MessageBox%20win32&oe=UTF-8&um=1&ie=UTF-8&sa=N&tab=wg

Deuxieme réponse tu à un exemple pratique:

Code: [Select]
MessageBox(NULL, "wnd message loop", "caption", MB_OK);
Après on sait mieux de quoi on parle, la doc devient plus claire, on peut raffiner la recherche ou trouver
d'autres exemples plus explicites...


Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #33 - 06 October 2007, 02:37:03

Oki, toujours le même truc quoi :)

Tu n'as pas la science infuse .... mais la bonne méthode.
Il faut que ça devienne un automatisme.
Bah .... ça va bien finir par venir .... avec  de la persévérance.

J'ai fait quelques petits progrès, en lisant des synopsis de l'oapi je
parviens à remplir des appels de fonctions qui compilent .... ça se
termine souvent par des CTD finalement mais c'est toujours mieux que rien :badsmile:


Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 258
  • Hein, quoi !?
    • FsPassengers
Reply #34 - 06 October 2007, 02:49:58
Après rien ne vaut l'experience personelle, je vois pas mal de truc que tu fait faux
ou j'avais pourtant dis comment faire. Le prob c'est que ca rentre jamais aussi bien
que quand on est confronté au probleme et rame pour une solution.

Si on pouvait apprendre a conduire en lisant des posts d'un forum ca ce saurait ;)

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #35 - 06 October 2007, 03:01:52
Sur quel genre de trucs je fais de grosses boulettes ? :sad:



Message modifié ( 06-10-2007 03:15 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 258
  • Hein, quoi !?
    • FsPassengers
Reply #36 - 06 October 2007, 03:16:37
Exemple: Les SavedVariable éparpillés un peux partout dans SetClassCap.... pas glop, bordélique... risque d'erreurs.
Visiblement ca vient de la confusion et de la non-compréhension de comment le save restore marche exactement.

Sur le moment les SavedVariable ne font.... rien, ni save, ni load ni quoi que ce soit, ca enregistre seulement
que "cette variable sera a sauver/recharger" ... mais plus tard, après le clbkSetClassCap.

Comme t'en a des chiées qui "polluent" la lisibilité de ton clbkSetClassCap, je les mettrais
carrement toutes dans une fonction séparée qui serait appellée au début de SetClassCap.

Comme c'est tout a fait à propos je mettrais cette fonction dans le cpp "SavRestore.cpp"

Donc au début de saverestore.cpp

Code: [Select]
void DeclareVariableASauver()
{
     Scn.InitClass(); //Toutes les sauvegardes de variables
     // compressed variable
     for(int id=DIODE_CHECK_ELEC;id < FIN_DIODE_SIMPLE;id++)
         Scn.SavedVariable(id, &Diode[id].Etat);
 
      ..... TOUT les "Scn.SavedVariable" ICI
}

Et au début de clbkSetClassCap()

Code: [Select]
DeclareVariableASauver();

Tu me dira que c'est pas grave, il y a deux problèmes toutefois:
1-la lisibilité, risque de déclarer deux fois la même (et combat au restore vu qu'elle ce feron ch.. l'une l'autre)

2-Le fait que cette ecriture demontre que tu n'a pas pigé/integré vraiment le principe de "SavedVariable"
ce qui peux t'amener à de faux raisonnements et a ramer comme une bete car tu crois que ca marche
d'une certaine maniere alors que non.

Et c'est pas très beau en plus question organisations... ;)

Dan


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 258
  • Hein, quoi !?
    • FsPassengers
Reply #37 - 06 October 2007, 03:19:44
Sinon j'ai pas tellement regardé, juste vu quelques indentations mal faite (je supporte pas ca personellement)
mais j'ai pas poussé plus loins... me suis juste occupé du "CG problem" et "variable"

Dan



Message modifié ( 06-10-2007 03:22 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #38 - 06 October 2007, 03:20:10
Ah oui ... ça ... je m'en suis rendu compte .
Je n'avais rien compris sur le save restore.
Je pensais vraiment que le RESTORE se faisait sur la ligne :sick:
Donc oui, je vais faire du ménage ... je l'ai dit hier ou avant hier.
C'est même sur ce thread d'ailleurs ( au milieu de la page 1 )



Message modifié ( 06-10-2007 03:28 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 258
  • Hein, quoi !?
    • FsPassengers
Reply #39 - 06 October 2007, 03:23:52
reposte:

Et plus haut ce n'est pas une critique hein...
Juste une constatation, comme je disais à pagir hier la prog c'est comme l'anglais,
on le parle très vite mais pour le maitriser totalement faut du temps... ;)

faut du temps, et pas mal de conneries et d'erreurs... :badsmile:

Dan



Message modifié ( 06-10-2007 03:29 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #40 - 06 October 2007, 03:31:21
Quote
Et plus haut ce n'est pas une critique hein...

Ben oui, je sais bien ... je n'ai pas la prétention de penser qu'en trois mois
on peut maitriser un tel truc.
J'aime bien l'image de l'Anglais ... vu comment je le baragouine :badsmile:

Ca le travaille le Pagir, cette histoire de prog ! :)

Quote
reposte:

??? :wonder: ???



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

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 258
  • Hein, quoi !?
    • FsPassengers
Reply #41 - 06 October 2007, 03:37:06
Quote
picto a écrit:
Quote
reposte:
:wonder: ???

posté en même temps, j'ai reposté nouveau pour etre sur que tu vois... ;)

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #42 - 13 October 2007, 03:57:53
Petite question sur les initialisations.
Malgré le initOK sur les fonctions d'initialisation  des boutons,
est ce qu'un petit memset sur les structures pourrait sécuriser encore le bidule ?
Je veux pas dire une mise à zéro sur CHAQUE VARIABLE  hein :badsmile: sinon, chuis pas rendu ... mais sur la structure, ou bien est ce totalement inutile ?
                  
   BOUTON Bascule[FIN_BOUTON_BASCULE];            
   BOUTON Selecteur[FIN_BOUTON_SELECTEUR];
   BOUTON Poussoir[FIN_BOUTON_POUSSOIR];
   BOUTON DiodeA[FIN_DIODE_A];
   BOUTON DiodeAA[FIN_DIODE_AA];
   BOUTON Diode[FIN_DIODE_SIMPLE];
   BOUTON Display[FIN_DISPLAY];
   BOUTON RedrawNever[FIN_BOUTON_REDRAW_NEVER];

J'oublie les init par tableaux aussi ... ce n'est pas suffisamment lisible.
J'imagine au bout de quelques mois quand on veut ajouter une
nouvelle couche à un addon.

Alors que des trucs comme ça restent lisibles même au bout de quelques mois je pense.


   memset(&Probe[FUELPROBE1],0,sizeof(PROBESTATE));
   memset(&Probe[FUELPROBE2],0,sizeof(PROBESTATE));
   memset(&Probe[FUELPROBE3],0,sizeof(PROBESTATE));
   memset(&Probe[FUELPROBE4],0,sizeof(PROBESTATE));



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

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 258
  • Hein, quoi !?
    • FsPassengers
Reply #43 - 13 October 2007, 04:22:23
Mémoire de poisson rouge ? :lol:

Code: [Select]
static int ResetOk=0; // initialise tout le tableau si premier appel à cette fonction pour cette instance
if(ResetOk!=(int)this)
{
int I;
for(I=0;I<FIN_DIODE_SIMPLE;I++)
memset(&Diode[I],0,sizeof(BOUTON));
ResetOk=(int)this;
}

Nan je rigole, tout ce qu'on n'a pas "pensé/reflechi/créé" sois-même est dur à retenir, c'est pour
ca que les aides "code-fourni" sont à double tranchant, sans elles tu n'y arriverais pas ou
difficilement mais du coup tu n'apprend/ne retient pas vraiment.

En bref si tu a deja ca sur toutes les fonctions "Initialise" c'est bon, remise à zero des structures
au début. (au premier "Initialise*****")

pour répondre à ta question: OUI une remise à zero des structures est essentielle avant utilisation,
sinon impossible de "proteger" le code.

Dan


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 258
  • Hein, quoi !?
    • FsPassengers
Reply #44 - 13 October 2007, 04:24:53
PS: pour que cette fonction de remise a zéro des structures marche correctement il est impératif que tout les
initialise*** soient appellés dans clbkSetClassCap (ou dans une fonction appellée par clbkSetClassCap)

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #45 - 13 October 2007, 04:31:01
:sad: Personne ne m'avais jamais traité de poisson rouge :sad: :blop: :bulles: :blop: Ouais, bon ... c'est fait donc ...
Faut dire que le commentaire n'est pas super clair non plus ! On sait pas trop ce que fait cette ligne du coup !
// initialise tout le tableau si premier appel à cette fonction pour cette instance :lol:

 Dernière question sur ces initialisations ( pour voir si j'ai bien compris )

Même si je fais ça dans ClassCap

      Portes.dPorte_status            = CLOSED;
      Portes.dAnimPorte_proc         = 0.0;
      Portes.dPorte_CLOSED            = CLOSED;
      Portes.dPorte_OPEN            = OPEN;
      Portes.dPorte_CLOSING         = CLOSING;
      Portes.dPorte_OPENING         = OPENING;

Il est important que j'ai fait un memset là dessus avant ?

PORTE Portes[FIN_PORTES];

Porte par porte ... autant de fois qu'il y a de portes dans le enum.
Comme ça quoi ...




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

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 258
  • Hein, quoi !?
    • FsPassengers
Reply #46 - 13 October 2007, 04:45:27
Quote
picto a écrit:
J'oublie les init par tableaux aussi ... ce n'est pas suffisamment lisible.
J'imagine au bout de quelques mois quand on veut ajouter une
nouvelle couche à un addon.

Tu veux parler d'initialise par boucle for/next plutôt ?

Code: [Select]
for(int id=DIODE_CHECK_ELEC;id < FIN_DIODE_SIMPLE;id++)
Scn.SavedVariable(id, &Diode[id].Etat);

Pourtant c'est pratique et plus lisible que 123 lignes de code à peu près pareil. Dur de voir une erreur avec la dernier
methode. Faut juste etre TRES stricte avec les boucle FOR/NEXT !

IMMENSEMENT STRICTE !!!!

Si tu n'est pas sur d'y arriver vaut mieux faire une ligne par variable effectivement au prix d'avoir des centaines de
lignes. Envore une fois a mon avis l'erreur c'est de ne pas avoir fait en série, tu a commencé par faire tout les boutons
du panel avec une sauvegarde monstrueuse alors que tout ces boutons ne servent encore a rien et changent
constamment au fur et a mesure que tu avance dans les systemes. Boutons desactivés, inutiles, qui changent,
rajouté= foutoir dans les save des variables.

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #47 - 13 October 2007, 04:50:49
Euh oui les for next ... désolé pour le vocabulaire ...

Je les ai virés ...
Ca marchait sur les boutons parce que j'avais fait ça super concentré,
mais tant pis, je préfère voir au premier coup d'oeil ou j'en suis de l'utilisation
des Id pour éviter d'avoir de nouveaux chevauchements.

J'avais un id utilisé trois fois :badsmile:

Là j'ai 257 lignes pareilles à peu près, mais aucun trou dans les Ids et surtout
je sais au premier coup d'oeil que j'en suis à 257.

Et surtout, comme parfois je manque de concentration, il m'est arrivé d'ajouter
un nouveau bouton dans le enum .... MAIS sur une position stratégique pour
la lecture des boucles ... J't'explique pas le bordel que ça avait foutu et le temps
que j'avais mis à réparer :sick:



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

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 258
  • Hein, quoi !?
    • FsPassengers
Reply #48 - 13 October 2007, 04:57:29
Tu peux me renvoyer les derniers sources que je jette un oeil voir si je peux te conseiller ?

Dan



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


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #49 - 13 October 2007, 05:02:47


Mais je comprend tout de travers ... :wall: J'étais sûr de mon coup sur les memsets.

Ce ne sont pas des variables boutons mais des variables pour les
affichages de trucs dynamiques sur les displays genre la pression
qui monte ou qui descend ... ce genre de trucs.


Pic