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: [cpp] Est-ce qu'UMMu est allergique à oapiTriggerPanelRedrawArea() ?  (Read 2486 times)

0 Members and 1 Guest are viewing this topic.

Offline Bibi Uncle

  • Legend
  • ******
  • Posts: 2264
  • Country: Canada ca
  • Karma: 17
02 August 2010, 14:54:55
Salut à tous !

Je n'ai pas écrit cette question sur Mes questions sur VC++ 2005 car c'est une question d'importance qui pourra aider beaucoup de gens.

Dans mon add-on, j'ai un RTG. J'ai une fonction spécifique à lui que je fait exécuter dans le clbkPostStep(). Dans cette fonction, je cacule la puissance du RTG et je rafraichi manuellement le panel si la puissance a diminué de 1. Je déclenche le redraw avec oapiTriggerPanelRedrawArea().

J'ai testé avec un UMMu et/ou UMMu Turbopack et j'ai un CTD. Et c'est seulement avec ces deux-là. J'ai fais mes devoirs en faisant beaucoup de déboguage. J'ai découvert que le CTD a toujours lieu lorsque je suis dans le UMMu ou UMMu Turbopack et que le oapiTriggerPanelRedrawArea() et exécuté. Pensant que l'erreur était dans clbkPanelRedrawEvent(), j'y ai jeté un coup d'oeil et tout est parfait. Même que j'ai tous mit en commentaires et le bug avait toujours lieu.

Donc, c'est le oapiTriggerPanelRedrawArea() qui ne fonctionne pas avec les UMMu. Mais pourquoi ?

Je vous présente des extraits de codes :

PuissanceRTG() :
Code: [Select]
#include "MaClasseAddon.h"

void Sentinel::PuissanceRTG(void)
{
// ------------------------------------------------
// Calcul la puissance du RTG selon le temps écoulé
// ------------------------------------------------
double dNombreDeJours = Data.dTempsSim / 86400;
int i;

Sys.dPuissanceRTG = pow(0.995003367, dNombreDeJours)*113000;
if (Sys.dPuissanceRTG < 0.2) Sys.dPuissanceRTG = 0;
sprintf(Sys.sRTGText, "%.0f", Sys.dPuissanceRTG);
if (strcmp (Sys.sOldRTGText, Sys.sRTGText))
{
oapiTriggerPanelRedrawArea(0, AID_RTG);

for (i = 0 ; i < 10 ; i++)
Sys.sOldRTGText[i] = Sys.sRTGText[i];
}
}

RedrawPanel_RTG() (qui est appelé par clbkPanelRedrawEvent()dans lequel je stipule de toujours retourné true) :
Code: [Select]
void Sentinel::RedrawPanel_RTG (SURFHANDLE surf)
{
if (!Pan.bRTGProtection)
oapiBlt (surf, srf[1], 0, 0, 100, 0, 100, 30);
else if (Pan.bRTGProtection)
oapiBlt (surf, srf[1], 0, 0, 0, 0, 100, 30);

HDC hDC = oapiGetDC(surf);
SelectObject(hDC, g_Param.hFont[1]);
SetBkMode(hDC, TRANSPARENT);
SetTextColor(hDC, RGB(217, 118, 1));
TextOut(hDC, 0, 0, Sys.sRTGText, strlen(Sys.sRTGText));
oapiReleaseDC(surf, hDC);
}


Émile

Pluton, Saturne et Jupiter
Entendez-vous monter vers vous le chant de la Terre?

- Luc Plamondon

Offline Bibi Uncle

  • Legend
  • ******
  • Posts: 2264
  • Country: Canada ca
  • Karma: 17
Reply #1 - 02 August 2010, 15:53:20
J'ai fait une petite recherche Google et j'ai trouvé ça :

http://orbiter.dansteph.com/forum/index.php?topic=6405.msg97125#msg97125

Est-ce que c'est la seule solution ? C'est plutôt weird que Martin ait fait une fonction qui marche une fois sur 2. Je crois qu'il y a quelque chose qui nous échappe...



Message modifié ( 02-08-2010 19:04 )

Émile

Pluton, Saturne et Jupiter
Entendez-vous monter vers vous le chant de la Terre?

- Luc Plamondon

Offline MrSpock

  • Legend
  • ******
  • Posts: 1593
  • Karma: 0
Reply #2 - 04 August 2010, 00:03:05
Salut bibi ! Il te manque quelques notions sur le déboguage ...il me semble.
Quote
faisant beaucoup de déboguage
Moins tu débogues , plus ton déboguage est efficace .
Pour cela , il ne suffit pas de mettre un point d'arrêt sur une fonction , il faut surtout examiner les registres des variables,
et voir comment elles se comportent .
Typiquement , si ton programme plante lors d'un appel de fonction , tu dois commencer à vérifier l'état des variables
passées en paramètre à cette fonction .
Exemple :

struct BIGCASH
{
int numerodecompte ;
float cash ;
}


Soit une fonction BIGCASH * GiveMeMoneyPlease ( int howmuch , int tva) ;
définition :
//cette fonction renvoie un POINTEUR sur une structure qui doit être initialisée
//à moins qu'il soit prévu qu'elle renvoie NULL .
BIGCASH * GiveMeMoneyPlease ( int howmuch, int tva)
{
//déclaration d'un nouveau compte
BIGCASH monCash;
//calcul
int nouveau=howmuch-tva ;
//remplir le compte
 monCash.cash=nouveau;
//renvoi du pointeur , mon cash est détruit mais son contenu est transmis !
return &monCash ;
}
//Tout parait ok ! Ok ?
//Et bien non ...
//car si tu examines la structure de type BIGCASH , elle contient une valeur "numerodecompte" qui n'a pas été
initialisée !
DOnc ,si tu l'utilises avec une fonction qui exige que numerodecompte EXISTE , les résultats sont imprévisibles !
Et au moins, un crash t'indique qu'il y a un problème immédiat . Le pire , c'est quand le programme ne plante pas et que ses données sont ... corrompues !
SOus Borland , je sais comment faire un suivi de variable ( tu connais sa valeur pendant qu'elle traverse ton code ).
SOus vc2005 , j'ai utilisé les fenêtres en bas en gauche pour examiner le contenu des variables PENDANT LE POINT D'ARRET .

DONC : Cherche une variable NULL pour commencer ...
Fast-toch m'a conseillé d'utilise Ummu , donc je vais finir par te rattraper et serais d'une meilleure aide , j'espère !
Je vais étudier MAINTENANT l'extrait de code que tu as envoyé. .
A+



Message modifié ( 04-08-2010 00:04 )

Mr Spock ,
Consultant de VULCAN TECH INDUSTRY.
( et accessoirement chatouilleur de PLAYMOBILS@tm )
http://kenai.com/projects/spacetechs-mecanos

Offline MrSpock

  • Legend
  • ******
  • Posts: 1593
  • Karma: 0
Reply #3 - 04 August 2010, 00:18:13
Quote
if (Sys.dPuissanceRTG <; 0.2) Sys.dPuissanceRTG = 0;
Tiens ?
Tu n'as pas eu un warning du compilateur ?
Vieux , les warnings comme leur nom l'indique PREVIENNENT d'une possible anomalie !
le point-virgule (;) indique au compilateur UNE FIN d'instruction , dans ce cas Sys.dPuissanceRTG = 0;
est PUREMENT IGNORE puisque aprés un " if " qui pose une condition .
Dans ton cas, elle est toujours vrai (ou fausse) .
Ce qui est étrange , c'est que tu puisses compiler sans la 2eme parenthèse ( qui ferme l'instruction) .
REEDIT : Ah ...non, en fait, l'absence de données derrière "<" peut vouloir dire ( dans le langage machine...)
si " Sys.dPuissanceRTG dans ce contexte , le " ; "  fait sauter le compilateur à la condition suivante et non pas la prochaine instruction .


Dans les options de VisualStudio, tu dois pouvoir paramétrer les messages du compilateur et lui demander d'être
PLUS SEVERE avec toi !!
Ou alors , lis aussi les WARNINGS !!
;)

REEDIT
Quote
for (i = 0 ; i <; 10 ; i++)
Hum....
Quote
Je n'ai pas écrit cette question sur Mes questions sur VC++ 2005 car c'est une question d'importance qui pourra aider beaucoup de gens.
Le copier/coller ... DAN avait quand même précisé que si c'est une tare de ne pas être fainéant , le copier/coller n'est
éfficace que quand on le comprend . TOUJOURS COMPRENDRE CE QUE L'ON COPIE ! Copié ?;)



Message modifié ( 04-08-2010 00:49 )

« Last Edit: 04 August 2010, 02:54:45 by MrSpock »
Mr Spock ,
Consultant de VULCAN TECH INDUSTRY.
( et accessoirement chatouilleur de PLAYMOBILS@tm )
http://kenai.com/projects/spacetechs-mecanos

Offline MrSpock

  • Legend
  • ******
  • Posts: 1593
  • Karma: 0
Reply #4 - 04 August 2010, 00:55:40
A propos d'UMMu ...
Une petite recherche sur google , j'arrive sur http://prenoms.doctissimo.fr :

Quote
Statistiques du prénom UMMU :

Age moyen des personnes portant le prénom UMMU : 19 ans
Pic du siècle du prénom UMMU : 1979
Tendance du prénom UMMU : Stable
UMMU est un prénom : Très rare
Stable , dit le docteur !!
Pas de souci de ce coté là , DONC !
Félicitation aux parents !!
:bebe:


« Last Edit: 04 August 2010, 02:54:45 by MrSpock »
Mr Spock ,
Consultant de VULCAN TECH INDUSTRY.
( et accessoirement chatouilleur de PLAYMOBILS@tm )
http://kenai.com/projects/spacetechs-mecanos

Offline MrSpock

  • Legend
  • ******
  • Posts: 1593
  • Karma: 0
Reply #5 - 04 August 2010, 01:13:01
Quote
RedrawPanel_RTG() (qui est appelé par clbkPanelRedrawEvent()dans lequel je stipule de toujours retourné true) :
void Sentinel::RedrawPanel_RTG (SURFHANDLE surf)
{
   if (!Pan.bRTGProtection)
      oapiBlt (surf, srf[1], 0, 0, 100, 0, 100, 30);
   else if (Pan.bRTGProtection)
      oapiBlt (surf, srf[1], 0, 0, 0, 0, 100, 30);

   HDC hDC = oapiGetDC(surf);
   SelectObject(hDC, g_Param.hFont[1]);
   SetBkMode(hDC, TRANSPARENT);
   SetTextColor(hDC, RGB(217, 118, 1));
   TextOut(hDC, 0, 0, Sys.sRTGText, strlen(Sys.sRTGText));
   oapiReleaseDC(surf, hDC);
}

Ton code utilise plusieurs fois "SURFHANDLE surf" , mais jamais tu ne vérifies que surf !=NULL .
Que se passe t'il si tes fonctions qui attendent une surface valide pour dessiner dessus reçoivent un NULL ?
Dans le meilleur des cas , rien , dans le pire boucle infinie , écriture sans fin dans le disque dur , épuisement des ressources systèmes et mauvaise humeur pour combler le tout .
Pareil pour ton HDC hDC = oapiGetDC(surf); , tu supposes qu'il est valide , mais tu n'en es pas sûr !
En péride de debug , il est sage de vérifier TOUTES LES DONNEES ENTRANTES dans les fonctions .
Tu utiliseras  alors if( HDC==NULL -vérifie ce que renvoie la fonction oapiGetDCdans le sdk  , et agis selon-) MessageBOX(NULL, " Quel idiot je fais !" , " encore un bug ", MB_ICONEXCLAMATION) ;
:lol:



Message modifié ( 04-08-2010 01:17 )

« Last Edit: 04 August 2010, 02:54:45 by MrSpock »
Mr Spock ,
Consultant de VULCAN TECH INDUSTRY.
( et accessoirement chatouilleur de PLAYMOBILS@tm )
http://kenai.com/projects/spacetechs-mecanos

Offline MrSpock

  • Legend
  • ******
  • Posts: 1593
  • Karma: 0
Reply #6 - 04 August 2010, 01:31:57



« Last Edit: 04 August 2010, 02:54:45 by MrSpock »
Mr Spock ,
Consultant de VULCAN TECH INDUSTRY.
( et accessoirement chatouilleur de PLAYMOBILS@tm )
http://kenai.com/projects/spacetechs-mecanos

Offline Bibi Uncle

  • Legend
  • ******
  • Posts: 2264
  • Country: Canada ca
  • Karma: 17
Reply #7 - 04 August 2010, 02:34:40
Pour le :
Code: [Select]
if (Sys.dPuissanceRTG <; 0.2) Sys.dPuissanceRTG = 0;Je ne sais pas du tout pourquoi ça s'est retrouvé là. J'ai vérifier et mon projet n'a pas de ";". Erreur de copier-coller ? :???:

Je n'ai qu'un seul warning et c'est à cause de l'INCREMENTAL que j'ai retiré (voir Mes questions sur VC++ 2005). Sinon, j'ai souvent ma variable itest qui n'est pas référencé mais c'est normal car c'est pour des tests donc je la retire son utilisation de mon code souvent mais pas sa définition.

Pour l'histoire de la variable surf, je ne peux pas te dire quelle valeur elle a, le programme plante lorsqu'Orbiter lit la ligne oapiTriggerPanelRedraw(). Il n'a pas le temps de se rendre au callback de rafraîchissement du panel 2D. Donc, la variable surf n'a jamais le temps de s'exécuter.

Tiens, je ne savais pas qu'il y a des gens qui s'appellent UMMU. En passant, pourquoi MMu ? C'est Martin qui a donné le nom et Dan a ajouté U pour Universal. Peut-être pour MonstreMutant ? :badsmile:

Par contre, je crois avoir trouvé la solution avec le fil que j'ai ressortie. C'est comme si Orbiter exécutait tout de même le refresh même si le focus n'est pas sur Sentinel. Et ça, seulement lorsque c'est un UMMu ou UMMu Turbopack. En faisant ma propre fontion de refresh qui test si le focus est sur Sentinel, je réussi à enlever le bug.

Quote
Mr Spock a dit :
Quote
Bibi Uncle a dit :
Je n'ai pas écrit cette question sur Mes questions sur VC++ 2005 car c'est une question d'importance qui pourra aider beaucoup de gens.

Le copier/coller ... DAN avait quand même précisé que si c'est une tare de ne pas être fainéant , le copier/coller n'est
éfficace que quand on le comprend . TOUJOURS COMPRENDRE CE QUE L'ON COPIE ! Copié ?

Je ne vois pas le lien entre ma phrase et le copier-coller ? :???:


« Last Edit: 04 August 2010, 02:54:45 by Bibi Uncle »
Émile

Pluton, Saturne et Jupiter
Entendez-vous monter vers vous le chant de la Terre?

- Luc Plamondon

Offline MrSpock

  • Legend
  • ******
  • Posts: 1593
  • Karma: 0
Reply #8 - 04 August 2010, 02:43:42
Quote
Je ne vois pas le lien entre ma phrase et le copier-coller ?
Ne te vexe pas stp !
Je voulais dire que c'est vite fait de copier/coller , et c'est vite fait de coller un ";" sans le faire exprès ...
Je crois que beaucoup de gens suivent les conseils de base de Dan , et ils font bien .
Il n'en reste pas moins des failles , et le manque d'attention est la plus grande de toutes .
Je ne voulais pas t'offenser ...
On fait la paix ?
;)


« Last Edit: 04 August 2010, 02:54:45 by MrSpock »
Mr Spock ,
Consultant de VULCAN TECH INDUSTRY.
( et accessoirement chatouilleur de PLAYMOBILS@tm )
http://kenai.com/projects/spacetechs-mecanos

Offline Bibi Uncle

  • Legend
  • ******
  • Posts: 2264
  • Country: Canada ca
  • Karma: 17
Reply #9 - 04 August 2010, 02:50:38
On a jamais été en guerre ! Je disais ça simplement parce que je ne comprenais pas le lien.

Sinon, je crois avoir trouvé le problème du ";" de trop. En écrivant mon dernier post, j'ai copier-coller ton post précédent. Mais la syntaxe du forum a ajouté un autre ";". Même en EDIT, je n'ai qu'un seul ";". Un petit bug dans le code du forum ?

En passant, je ne sais pas si tu savais mais il y a les tags [ cpp ] et [ /cpp ] (sans les espaces) pour écrire du code C++ tout coloré. Très pratique.


« Last Edit: 04 August 2010, 02:54:45 by Bibi Uncle »
Émile

Pluton, Saturne et Jupiter
Entendez-vous monter vers vous le chant de la Terre?

- Luc Plamondon

Offline MrSpock

  • Legend
  • ******
  • Posts: 1593
  • Karma: 0
Reply #10 - 04 August 2010, 02:54:45
Pour le code cpp:
Je ne savais pas , j'essaierais à l'occasion .
Merci !
Et donc tu as résolu le problème UMMU.
Il me reste à comprendre comment .
J'avais commencé à suivre le fil que tu a remonté, mais comme j'avais vu ce " ; " dans ton code , il me semblait plus urgent de te le signaler .
A+


« Last Edit: 04 August 2010, 02:54:45 by MrSpock »
Mr Spock ,
Consultant de VULCAN TECH INDUSTRY.
( et accessoirement chatouilleur de PLAYMOBILS@tm )
http://kenai.com/projects/spacetechs-mecanos