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: Mes questions sur VC++ 2005  (Read 25655 times)

0 Members and 1 Guest are viewing this topic.

Offline MrSpock

  • Legend
  • ******
  • Posts: 1593
  • Karma: 0
Reply #25 - 23 July 2010, 17:14:13
Essaye de copier/coller ce truc ...DANS Panel2D.cpp

Quote
#define STRICT // remis ici
#define ORBITER_MODULE //déplacé ici
#include "MaClasseAddon.h"

//déclaration de hDLL dans ce cpp
//HINSTANCE hDLL;
// je vais la nommer bibi
HINSTANCE BIBI_DLL;  //créé ici

bool MonAddon::clbkLoadPanel (int id)
{
   static MFDSPEC mfds_left  = {{ 66, 84,  326, 344}, 6, 6, 31, 38};
   static MFDSPEC mfds_right = {{828, 84, 1088, 344}, 6, 6, 31, 38};

   HBITMAP hBmp = LoadBitmap (BIBI_DLL, MAKEINTRESOURCE(IDB_PANEL1));

   oapiRegisterPanelBackground (hBmp, PANEL_ATTACH_BOTTOM|PANEL_MOVEOUT_BOTTOM, 0xffffff);
   oapiRegisterMFD (MFD_LEFT, mfds_left);
   oapiRegisterMFD (MFD_RIGHT, mfds_right);
   return TRUE;
}

//////////////////////////////////////////////////////////////////
// Rien.cpp
// ---------------------------------------------------------------
// Rien à toucher ici, Orbiter ce sert de ceci pour creer des
// instances de votre classe, oubliez ce source la.
//////////////////////////////////////////////////////////////////
 
// --------------------------------------------------------------
// Vessel initialisation
// --------------------------------------------------------------
DLLCLBK VESSEL *ovcInit (OBJHANDLE hvessel, int flightmodel)
{
   return new MonAddon (hvessel, flightmodel);
}
// --------------------------------------------------------------
// Vessel cleanup
// --------------------------------------------------------------
DLLCLBK void ovcExit (VESSEL *vessel)
{
   if (vessel) delete (MonAddon*)vessel;
}

DLLCLBK void InitModule (HINSTANCE hModule)
{
   BIBI_DLL = hModule;
}

DLLCLBK void ExitModule (HINSTANCE hModule)
{

}

Chez moi, çà compile pas à cause du chemin du bmp manquant....
Quote
.\MonAddon.rc(17) : error RC2135 : file not found: ..\DeltaGlider\Bitmaps\Panel1.bmp
Mais chez toi ... essaye !

autre genre d'obstacle à la compilation ...
Dans MonAddon->Propriétés->Linker->Outpout
Quote
C:\Documents and Settings\Émile\Mes documents\Orbiter2006/ShuttlePB.dll
Bref....C'est tout ce que j'attendais , pas d'meilleur moyen pour apprendre L'IDE ...
TU VAS M'OBLIGER A CREER UN REPERTOIRE EMILE SUR MON DD .:lol:
Je viens de piger le coup du bmp, réparé ( j'lui ai filé un fake !)
Maintenant, il me dit qu'il trouve plus la .lib ! (Normal, il se croit encore sur ton DD) .
Je commence à m'amuser !

Spock



Message modifié ( 23-07-2010 17:50 )

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 #26 - 23 July 2010, 20:30:38
Oh mon Dieu !!! ÇA MARCHE !!!

:merci::merci::merci::merci::merci::merci::merci::merci:

Je crois que le problème était le #define ORBITER_MODULE et STRICT que j'avais placé après #include MaClasseAddon.h. Selon ce que j'ai lu sur Orbiter-Forum, orbitersdk.h contient une fonction qui permet d'exécuter InitModule() mais seulement si ORBITER_MODULE est défini avant.[/b].

Encore une fois :merci: MrSpock et Tofitouf, vous m'avez sauvez des heures à chercher dans un seul .cpp.

Je suis :fou: de joie !

EDIT:

Quote
Mais chez toi ... essaye !

autre genre d'obstacle à la compilation ...
Dans MonAddon->Propriétés->Linker->Outpout
Outpout tu as bien dit ? :badsmile:

Dis donc MrSpock, tu n'as pas VC++ 2005 en français ? Il est toujours disponible sur Clubic. C'est là que j'ai trouvé ma version (parce que Microsoft n'offre plus que la 2008 et bientôt la 2010, si elle n'est pas déjà sorti).

Allez, un petit lien gratos pour te remercier de m'avoir aidé : http://www.clubic.com/telecharger-fiche17875-visual-c-express-edition.html

Par contre, tout réinstaller, ça prend du temps et tu perds beaucoup de tes données.



Message modifié ( 23-07-2010 20:35 )

É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 #27 - 23 July 2010, 20:39:27
YEEEEPEEEEE !!
Ben mon vieux ...
J'étais entrain de me casser la tête à le compiler chez moi !
Je crois que je vais continuer car j'apprends beaucoup sur ce coup là !
Chuis content avec toi !
Et merci pour le lien ... c'est vrai que cet aprés-midi, j'me suis dit :
"Idiot, t'aurais pu le prendre en français ...
Cool , Baba .
Spock.


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

Offline pilote334

  • Sr. Member
  • ****
  • Posts: 300
  • Karma: 5
Reply #28 - 23 July 2010, 20:53:43
la 2010 est sorti pour VC++. Gratuit en version Express, il est quand même pas mal....


Offline MrSpock

  • Legend
  • ******
  • Posts: 1593
  • Karma: 0
Reply #29 - 23 July 2010, 20:56:01
Ok, mais combien ici l'utilisent ?
J'ai éssayé de prendre une compatible avec la majorité !
J'me suis gourré ?
Spock !


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 #30 - 25 July 2010, 01:50:33
C'est la résolution de problèmes puissance 10 ces derniers temps ! Je viens juste de règler mon problème du fichier qui faisait boguer Orbiter car il avait le même nom que ma DLL. Voilà ce que j'ai fait :

Dans Projet > Propriété de [Nom de votre add-on]..., on ouvre Prorpiété de configuration puis Éditeur de liens et finalement, dans Général. Là, il y a Activation des liens incrémentiels. Il faut le mettre à Non (/INCREMENTAL:NO)

Par contre, durant la compilation, VC++ m'écrit :

Code: [Select]
------ Début de la génération : Projet : Sentinel, Configuration : Debug Win32 ------
Édition des liens en cours...
clbkConsumeBufferedKey.obj : warning LNK4075: ' /EDITANDCONTINUE' ignoré à cause de la spécification '/INCREMENTAL:NO'
   Création de la bibliothèque .\Debug/ShuttlePB.lib et de l'objet .\Debug/ShuttlePB.exp
Incorporation du manifeste en cours...
Le journal de génération a été enregistré à l'emplacement "file://c:\Documents and Settings\Émile\ [...]"
Sentinel - 0 erreur(s), 1 avertissement(s)
========== Génération : 1 a réussi, 0 a échoué, 0 mis à jour, 0 a été ignoré ==========

Je n'ai pas encore trouvé de différence entre avant et après pour les fonctions dans clbkConsumedBufferedKey lorsque j'appuies sur une touche dans Orbiter, tout marche comme avant.

Par contre, si vous savez ce que ça veut dire ( et si c'est contagieux :sick: ), ce serait bien apprécié de le savoir :)



Message modifié ( 25-07-2010 01:53 )

Émile

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

- Luc Plamondon

Offline Vladimir2000

  • Hero Member
  • *****
  • Posts: 755
  • Karma: 2
Reply #31 - 25 July 2010, 07:25:58
?



Offline MrSpock

  • Legend
  • ******
  • Posts: 1593
  • Karma: 0
Reply #32 - 25 July 2010, 09:53:43
Salut Bibi_Uncle !
Tu entres dans la partie encore obscure pour moi  de la programmation : LE COMPILATEUR !!
Sous Borland , avec de nombreux fichiers d'entêtes (.h) dans mon projet , il arrivait ( surtout dans les "gros" projets)
que je " fasse des noeuds " avec la logique de Hierarchie de mes fichiers .
 
 Je m"explique :
 Un fichier B.cpp est lié à un fichier A.h .
 Un fichier C.h contient B.h .
 D.cpp est lié à c.h et B.h
 Etc ...

Même en me relisant lentement, c'est difficile de tracer le chemin d'inclusion , et de vérifier les interdépendances .
Donc , il arrive que nous n'arrivions plus à gérer nos interdépendances , et PARFOIS ( je dis bien PARFOIS ) désactiver
la liaison incrémentale résoud le problème .
Que fait le compilateur quand il utilise la liaison Incrémentale ?Moi , j'en sais rien .  Bill le sait !( Source Msdn VC++)
Quote
/INCREMENTAL[:NO]
Notes
L'option /INCREMENTAL contrôle la façon dont l'éditeur de liens gère les liaisons incrémentielles.

Par défaut, l'éditeur de liens s'exécute en mode incrémentiel. Pour substituer un lien incrémentiel par défaut, spécifiez /INCREMENTAL:NO.

Un programme lié de façon incrémentielle équivaut, en termes de fonctionnalités, à un programme lié de façon non incrémentielle. Toutefois, comme ils sont préparés pour des liens incrémentiels à venir, les fichiers exécutables liés de façon incrémentielle (.exe) ou les bibliothèques de liens dynamiques (DLL) présentent les caractéristiques suivantes :

Ils sont plus volumineux qu'un programme lié de façon non incrémentielle du fait du remplissage du code et des données. (Le remplissage permet à l'éditeur de liens d'augmenter la taille des fonctions et des données sans recréer le fichier .exe.)

Ils peuvent contenir des thunks de branchement gérant le réadressage des fonctions vers les nouvelles adresses.

Remarque
Pour s'assurer que la génération de la version release ne contient pas de remplissages ou de thunks, liez votre programme de façon non incrémentielle.
Pour lier par incrément indépendamment de la valeur par défaut, spécifiez /INCREMENTAL. Lorsque cette option est sélectionnée, l'éditeur de liens émet un avertissement s'il ne peut pas lier par incrément, puis lie le programme de façon non incrémentielle. Certaines options et situations substituent l'option /INCREMENTAL.

La plupart des programmes peuvent être liés par incrément. Toutefois, certaines modifications étant trop importantes, quelques options sont incompatibles avec les liaisons incrémentielles. LINK effectue un lien complet si l'une des options suivantes est spécifiée :

L'option Lier par incrément n'est pas sélectionnée (/INCREMENTAL:NO).

/OPT:REF est sélectionné.

/OPT:ICF est sélectionné.

/ORDER est sélectionné.

/INCREMENTAL est implicite lorsque /DEBUG est spécifié.

De plus, LINK effectue un lien complet si l'une des situations suivantes se produit :

L'état incrémentiel du fichier (.ilk) est manquant (LINK crée un nouveau fichier .ilk en prévision des liaisons incrémentielles à venir).

Le fichier .ilk ne possède pas d'autorisation en écriture. (LINK ignore le fichier .ilk et fait des liens non incrémentiels.)

Le fichier de sortie .exe ou .dll est manquant.

L'horodatage du fichier .ilk, .exe ou .dll est modifié.

Une option LINK est modifiée. La plupart des options LINK, lorsqu'elles sont modifiées entre les générations, provoquent un lien complet.

Un fichier objet (.obj) est ajouté ou omis.

Un objet qui a été compilé avec l'option /Yu /Z7 est modifié.
Je pourrais continuer à chercher des sources , mais je pense que Dan -qui arrive à faire fonctionner ensemble 500 fichiers ... - et qui ne doit pas être très loin maintenant sera ( s'il le veut bien  ) le meilleur élément de réponse à ce sujet .
La Vraie Question était : Quelles sont les conséquences que EDITANDCONTINUE soit ignoréé ?
Je ne sais pas ,le format de EDITANDCONTINUE ressemble à un "flag" défini dans un fichier comme suit :
#define EDITANDCONTINUE 202 //par exemple ...
C'est une astuce de programmeur qui permet de changer le comportement du programme au besoin .
Du genre : switch ( EDITMODE){
                                                   case  EDITANDCONTINUE : bla blabla ...;break;
                                                   case  EDITANDSTOP : bla blabla ...;break;

ENfin , c'est une intuition ... Dans ces cas là (toucher au compilateur pour que le programme fonctionne), c'est
peut-être mieux de revoir notre copie !
Sinon , quel était le fichier qui faisait doublon avec ta dll ? Renommer le fichier devrait suffire à corriger le problème
sans toucher aux Options de compil ?

Merci pour ce Post, qui encore une fois fait bien réfléchir !
MrSpock .
       

 

Spock.



Message modifié ( 25-07-2010 09:56 )

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 #33 - 25 July 2010, 10:30:10
Quote
Je ne sais pas ,le format de EDITANDCONTINUE ressemble à un "flag" défini dans un fichier comme suit :
#define EDITANDCONTINUE 202 //par exemple ...
C'est une astuce de programmeur qui permet de changer le comportement du programme au besoin .
Du genre : switch ( EDITMODE){
case EDITANDCONTINUE : bla blabla ...;break;
case EDITANDSTOP : bla blabla ...;break;

Si c'est le cas , cela signifie donc que ce #define esr déclaré dans un .h pour le rendre accessible dans les fichiers
au dessus . Un petit schéma :

             #define EDITANDCONTINUE   500 <--- ------ >A.h ->A.cpp
                                                                            |
                                                                            |  
                                                                            |
                                                                     B.h ->B.cpp ----->include "A.h"
                                                                             |
|
Etc...
|
Etc...

B.cpp dans cet exemple contient l'information EDITANDCONTINUE =500.
Que ce passe t'il si la compilateur rencontre 2 fois cette déclaration ?
Que se passe t-il si une autre valeur genre #define SAVEANDQUIT est égale à 500 ?
Normalement , cela n'arrive pas car dans sa STRATEGIE de programmation , le codeur y
a pensé .
Mais nous qui ne sommes pas au fait de TOUTE LA STRATEGIE devons " Tatonner " pour rester
dans le cadre LOGIQUE PREDEFINI .
Et comme dirait TOFITOUF ( T'es où ?) ,c'est pas de la Tarte .
Conclusion : DANSTEPH est un fin Stratège !!:combat:
Spoiler  :
Aucun bug dans FsPassengers ...
SPock !



Message modifié ( 25-07-2010 10:41 )

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 #34 - 25 July 2010, 15:04:52
Quote
Sinon , quel était le fichier qui faisait doublon avec ta dll ? Renommer le fichier devrait suffire à corriger le problème
sans toucher aux Options de compil ?
Mon fichier était MonAddon et l'Explorateur Windows m'indiquait que c'était un VCEXPRESS.ilk.8.0 et curieusement, ton texte dit :

Quote
De plus, LINK effectue un lien complet si l'une des situations suivantes se produit :
L'état incrémentiel du fichier (.ilk) est manquant (LINK crée un nouveau fichier .ilk en prévision des liaisons incrémentielles à venir).

Donc, c'était bien ça qui fesait boguer Orbiter.

Pour le renommer, oui ça marche mais je devait le faire à chaque fois que je recompilait car à chaque compilation, il en créait un autre. Imagine, je modifie un chiffre pour réaligner mes MFDs, je recompile, je renomme le maudit fichier et je lance Orbiter pour quelques secondes. C'était vraiment emmerdant.

Pour l'histoire des .h incluent plusieurs fois par mauvaise structure, je suis sauver car j'utilise la technique de protection. Avec ça, le compilateur ne chargera jamais 2 deux le même .h dans un fichier. Voilà le code de mes .h :

Code: [Select]
#ifndef __MonAddon_H
#define __MonAddon_H

[Blablabla de code mais on s'en fou car c'est pas ça l'important]

#endif
Vive les préprocesseurs !

Et le #define EDITANDCONTINUE n'est pas de moi. Ça doit être dans les .h d'Orbiter ou d'OrbiterSound35.

Quote
Conclusion : DANSTEPH est un fin Stratège !!
Tout à fait d'accord ! Avec toutes ces histoires de compilateur qui fait si ou ça, les 8 000 000 000 de menus obscurs de VC++, je ne sais pas comment il se débrouille. Le code, c'est pas si mal. Mais ajouter et ignorer des bibliothèques, changer les options de l'éditeur de liens, changer plein d'autres choses, il faut vraiment être un stratège.



Message modifié ( 25-07-2010 15:07 )

É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 #35 - 25 July 2010, 15:14:13
Quote
Pour l'histoire des .h incluent plusieurs fois par mauvaise structure, je suis sauver car j'utilise la technique de protection. Avec ça, le compilateur ne chargera jamais 2 deux le même .h dans un fichier. Voilà le code de mes .h :

#ifndef __MonAddon_H
#define __MonAddon_H

[Blablabla de code mais on s'en fou car c'est pas ça l'important]

#endif

Hey ! Tu viens de m'apprendre un truc, et surement de m'enlever une épine du pied !
J'utilisais de manière systématique ( et irréfléchie ...)#ifndef __MonAddon_H #define __MonAddon_H car Borland
le faisait pour moi à chaque création d'unité (.cpp) .
Je vais étudier la question maintenant !
C'est vrai , difficile de croire que nous puissions programmer sainement sans maitriser l'outil de compilation .
C'est ce qu'a voulu faire Dan , je suppose , en remettant à plus tard ces questions , pour ne pas décourager les
grands débutants .
Mais les petits ont grandi , et le lait maternel ne suffit plus !
En tout cas , les petits partagent leur nourriture .
Merci , Mr SPock .


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 #36 - 25 July 2010, 15:55:19
Quote
Et le #define EDITANDCONTINUE n'est pas de moi. Ça doit être dans les .h d'Orbiter ou d'OrbiterSound35.
C'est ce que je sous-entendais ...Je rejoins cet avis .

Quote
L'état incrémentiel du fichier (.ilk) est manquant (LINK crée un nouveau fichier .ilk en prévision des liaisons incrémentielles à venir).

Le coup de la version .ilk.8.0 générée par un .ilk.5.0 manquant ? j'en reviens pas !
Politique Microsoft ... Tu as une trace de VC++ 2008 dans ta base de registre peut-être ?
Etonnant ... De prévoir les fichiers de Link de la version suivante !
Spock .


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 #37 - 25 July 2010, 17:24:15
Quote
MrSpock a écrit:
Quote
Et le #define EDITANDCONTINUE n'est pas de moi. Ça doit être dans les .h d'Orbiter ou d'OrbiterSound35.
C'est ce que je sous-entendais ...Je rejoins cet avis .

Quote
L'état incrémentiel du fichier (.ilk) est manquant (LINK crée un nouveau fichier .ilk en prévision des liaisons incrémentielles à venir).

Le coup de la version .ilk.8.0 générée par un .ilk.5.0 manquant ? j'en reviens pas !
Politique Microsoft ... Tu as une trace de VC++ 2008 dans ta base de registre peut-être ?
Etonnant ... De prévoir les fichiers de Link de la version suivante !
Spock .


:lol: La version 8 est la version 2005. La version 9 est la version 2008. On s'apprend des choses.


É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 #38 - 25 July 2010, 17:48:12
Ouaip !
0.0a.e1 est la version -1 paradoxale de l'original !
( Ils sont fous ces Romains ...)
:sunk:
Tu me ferais bien plaisir en allant répondre à la question que je pose sur le nouveau Topic :
Un dossier pour une Dll externe .
Le sujet est en rapport avec la procédure d'installation des add-ons .


Mi i i i s terrrr .. .Spock !


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 #39 - 29 July 2010, 16:28:13
J'ai une nouvelle question, mais cette fois, par rapport à la POO.

En regardant l'exemple du ShuttleA de Martin, j'ai remarqué qu'il mettait quelques fonctions (méthodes) en privé. Je sais ce que ça veut dire mais je me demandais, est-ce que c'est vraiment avantageux ? S'il les avait mises publiques, Orbiter les aurait vues et ignorées, non ? Donc, pourquoi les avoir mises en privé alors que ça n'apporte pas grand chose (du moins, je pense :badsmile: ) ?


É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 #40 - 29 July 2010, 17:02:26
Quote
private:
   void DefineAnimations ();
   bool ToggleGrapple (int grapple);
   double payload_mass;
   void ComputePayloadMass();
   ATTACHMENTHANDLE  payload_attachment[6];
.......

Quote
est-ce que c'est vraiment avantageux ?
Tu voulais dire utile ...
Ici , ce n'est pas une question d'avantage mais de protection de données d'une classe ,
en rapport avec sa méthode de création et d'instanciation .

J'ai vu dans le SDK que la méthode d'Initialisation des classes de Vessels liées à un scenario n'a lieu qu'une fois .
Ensuite , c'est un autre mécanisme , qui crée une INSTANCE d'une classe , à partir d'un modèle ( celui définit lors
de l'initialisation ( ou chargement du module ) . A propos des déclarations Globales ( extérieures à la classe) , Martin
précise que TOUTES les instances de cette classe de VESSEL2 (ou 3) l'auront en partage et donc que les variables
ou méthodes doivent être enfermées dans la classe . Cela je pense que tu le sais déjà .
Je remarque que les données " privées " sont caractéristiques à chaque vessel , et ne doivent pas être partagées.
Quote
double payload_mass;
Le fait de rendre privée cette valeur , fait en sorte qu'un vaisseau de même type qui se séparerait d'un réservoir
ne changerait en rien ta propre masse .
Pareil en ce qui concerne l'animation , etc .. etc ..
Maintenant , est-ce une déclaration private " PREVENTIVE " ou " EXECUTIVE " ?
Je n'ai pas eu le temps de le vérifier .
Les objets étant des pointeurs sur une classe , il vaut mieux " cacher " les données sensibles , en cas de faute de
frappe ( OBJA->Masse=OBJB->MASSE ; Si MASSE est private , le compilateur te bloque ...
 

Ce que je sais , c'est que les " fuites de mémoire" ne sont pas rares en programmation .
Des techniques ont donc été imaginées pour y remédier , tout en conservant une simplicité d'utilisation .
Quand j'irais dans les entrailles du SDK ,j'aurais une pensée pour toi .
J'espère que je serais plus précis , mais en attendant mieux ...
MrSPock .
Ps ( merci pour ton "tip") .
Et aussi : ce gentre de pratique correspond au niveau " STRATEGE" du programmeur .
Tu vas devenir un ... empereur ??:lol:



Message modifié ( 30-07-2010 03:03 )

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 #41 - 30 July 2010, 02:02:46
Je ne sais pas si j'ai tout compris ce que tu as écrit mais voilà ce que je sais ( du moins, je crois :badsmile: ) :

-Les fontions/variables déclarées à l'extérieur de la classe sont globales et ne sont initialisées qu'une fois par session, peut importe combien il y a de vaisseaux.

-Les méthodes/attributs déclarés à l'intérieur d'une classe sous l'étiquette public: sont créés pour chaques vaisseaux. Ils seront disponibles à Orbiter. Donc, Orbiter pourra voir et modifier ces méthodes/attributs.

-Les méthodes/attributs déclarés à l'intérieur d'une classe sous l'étiquette private: sont créés pour chaques vaisseaux. Ils seront indisponibles à Orbiter. Donc, Orbiter ne les verras pas et ne pourra pas les modifier. Par contre, les méthodes/attributs à l'intérieur de la classe pourront les voir et les modifier.

Est-ce que j'ai raison ou je suis dans le champ ?


É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 #42 - 30 July 2010, 02:21:12
Quote
Les fontions/variables déclarées à l'extérieur de la classe sont globales
Quote
Oui !
et ne sont initialisées qu'une fois par session, peut importe combien il y a de vaisseaux.
Je crois qu'en fait , les données globales concernent TOUS LES VAISSEAUX d'une même dll, et qu'elles sont ou du moins peuvent être changées à n'importe quel moment par ton code . Orbiter ne les changera pas , à moins que tu utilises
le " == " avec une variable du SDK d'Orbiter ( j'entends qu' Orbiter manipule en interne ), ce qui indiquera au compilateur
que tu désires remplacer la variable interne du SDK par TA VARIABLE .
Exemple :
int i=2 // déclaration de i comme entier initialisé à 2
int j=i // déclaration de j comme entier initialisé avec la valeur ( contenu ) de i .
int z==j // z occupe le même emplacement en mémoire que j .
Tout changement effectué dans j est répercuté dans z !

-
Quote
Les méthodes/attributs déclarés à l'intérieur d'une classe sous l'étiquette public: sont créés pour chaques vaisseaux. Ils seront disponibles à Orbiter. Donc, Orbiter pourra voir et modifier ces méthodes/attributs.

OUI , mais selon les variables ( celles que tu rajoutes à celles de la classe dont tu hérites), Orbiter n'y touchera pas .
C'est à toi , par un choix judicieux, d'utiliser tes variables dans tes fonctions , et de les injecter par exemple dans les variables calculées par Orbiter .Faudrait que j'aie la doc sous les yeux pour te donner un exemple .

Quote
-Les méthodes/attributs déclarés à l'intérieur d'une classe sous l'étiquette private: sont créés pour chaques vaisseaux.
OUi !
Quote
Ils seront indisponibles à Orbiter.

QUi est " ORBITER" ? ;)
Quote
Donc, Orbiter ne les verras pas et ne pourra pas les modifier.
Heu ...
Quote
Par contre, les méthodes/attributs à l'intérieur de la classe pourront les voir et les modifier.
OUI !
Mais tout ceci est vraiment complexe à saisir, enfin , pas plus que d'apprendre à faire du vélo je suppose ,  le problème
étant d'obtenir l'équilibre . Tout ceci concerne la notion d'Héritage en c++ , et il existe d'exellents Sites qui sauront
je pense apaiser ta soif de connaissance . J'avoue que moi-même je suis un peu dépassé , n'ayant que trop peu utilisé  ce système , que tous les pros en revanche utilisent . Mais je persévère ... Mieux vaut pour aller plus loin te référer à des tutos spécialisés . Ma science , c'est l'expérience . Mais la logique et la déduction m'assistent ...
EN tout cas , tu te poses LES BONNES QUESTIONS ... Bravo !
:badsmile:
MrSpock .



Message modifié ( 30-07-2010 02:36 )

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 #43 - 30 July 2010, 03:02:03
WIKI :
Quote
L'encapsulation permet de faire abstraction du fonctionnement interne (c'est-à-dire, la mise en œuvre) d'une classe et ainsi de ne se préoccuper que des services rendus par celle-ci. C++ met en œuvre l'encapsulation en permettant de déclarer les membres d'une classe avec le mot réservé public, private ou protected. Ainsi, lorsqu'un membre est déclaré :
public, il sera accessible depuis n'importe quelle fonction.
private, il sera uniquement accessible d'une part, depuis les fonctions qui sont membres de la classe et, d'autre part, depuis les fonctions autorisées explicitement par la classe (par l'intermédiaire du mot réservé friend).
protected, il aura les mêmes restrictions que s'il était déclaré private, mais il sera en revanche accessible par les classes filles.
C++ n'impose pas l'encapsulation des membres dans leurs classes. On pourrait donc déclarer tous les membres publics, mais en perdant une partie des bénéfices apportés par la programmation orientée objet.
Ce que font les pros ...
Quote
Il est de bon usage de déclarer toutes les données privées, ou au moins protégées, et de rendre publiques les méthodes agissant sur ces données. Ceci permet de cacher les détails de la mise en œuvre de la classe[/b].

Voilà ce qui répond ( OUF...) à ta question des "avantages" .
MrSpock ,:beer:
Ps : Et par pitié , ne me demande jamais de t'expliquer pourquoi j'existe !:lol:



Message modifié ( 30-07-2010 03:09 )

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 #44 - 30 July 2010, 14:33:03
Donc, finalement, je peux tout mettre en public: et laisser tomber le private: car, après tout, ce n'est pas moi qui a créé le main() donc ça ne me dérange pas de laisser tomber une partie de la POO pour ça. Les public:, private: et protected: sont là seulement pour simplifier le principe de Utilisateur/Constructeur de la POO si je comprends bien.

Je vais revoir un peu le tutoriel sur le Site Du Zéros. J'ai lu la partie en C au complet mais la partie en C++, je l'ai faite vite :badsmile:.


É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 #45 - 30 July 2010, 14:54:34
Oui , je penses que tu peux partir sur cette base .
Et puis , si jamais tu t'aperçois que des choses ne fonctionnent pas , tu auras au moins une piste !
Bonne réflexion !
Bonne continuation pour ton projet aussi !
A+ ,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 #46 - 31 July 2010, 01:10:39
Ce fil va devenir Les Questions quotidiennes de Bibi Uncle si je continue comme ça ! :badsmile:

Cette fois, la question n'est plus sur le C++ ou la POO, c'est plutôt par rapport au fonctionnement d'Orbiter.

Je veux créer un trottle (manette des gaz) dont les extrémités sont rondes plutôt d'être carré comme une bitmap standard. Comme je sais qu'on peut définier une couleur d'invisibilitée dans Orbiter, j'ai choisi le blanc pûr (comme les exemples de Martin). Ça marche impec avec le panel du fond. Par contre, lorsque je mets une partie de mon bitmap du trottle en blanc pûr, Orbiter me fait un joli trou dans le panel à l'endroit où les coins sont. Mais ce trou, il passe complètement à travers le panel. Donc, je vois l'extérieur.

Ce que je voudrais, c'est un trou dans le bitmap du trottle qui s'arrête sur le panel du fond. Je tiens à préciser que le fond où sera mon trottle n'a pas une couleur uniforme. Donc, je ne peux pas colorier les coins avec une couleur identique au panel du fond car la couleur n'est jamais identique.

Merci d'avance :)



Message modifié ( 31-07-2010 01:11 )

É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 #47 - 31 July 2010, 02:04:10
Quote
Je veux créer un trottle (manette des gaz) dont les extrémités sont rondes plutôt d'être carré

Ok ....
Quote
Comme je sais qu'on peut définier une couleur d'invisibilitée dans Orbiter, j'ai choisi le blanc pûr (comme les exemples de Martin)
J'en déduis que ton bitmap "throttle" est du genre carré Blanc avec un cercle coloré au centre .
L'ideal serait que tu puisses associer une couleur de transparence par surface , materiaux , objet ...
Une couleur de transparence pour le throttle , une autre pour le panneau .

Je serais toi , je chercherais dans ce sens ( dans le sdk d'abord). Désolé , là , je n'ai pas l'info . Ce que je sais , c'est que c'est possible , sous Orbiter j'imagine que oui , mais il faut vérifier.

Orbiter utilise l'API DirectX7 , qui permet d'attribuer si je me souviens bien une couleur de transparence par objet .
Mon souvenir est trop vague ...Par contre , tu peux toujours regarder comment fonctionne DIrectX7 , et surtout l'Interface Direct3Drm , qui est un moteur 3D en Kit .

C'est dans ce genre de Doc externe que tu apprendras ce qu'il est/serait possible de faire avec le moteur graphique d'Orbiter . Maintenant , Martin a trés bien pu limiter l'accés à certaines fonctions , comme en rajouter puisque tout cela est digéré par son code , et le SDK est notre Interface avec ce dernier ( le code, donc).

Quelle est la fonction qui definit cette couleur de transparence dans Orbiter, et quand est-ce que tu l'invoques ?
Par chronologie , tu pourrais jouer même avec une couleur unique ( attribuer la transparence->Dessiner le panneau->changer la transparence->dessiner le throttle) .

Envoie un extrait de code ?:bave:
A+ , et désolé pour ce paquet de mots qui ne t'aident guère .
Mais pourtant je suis sûr que la solution est toute bête.
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 #48 - 01 August 2010, 02:51:40
Salut bibi !
Comme je traine dans le SDK , je pense à toi ...
J'ai trouvé ceci dans GraphicsAPI.h :

Quote
/// \defgroup bltflag Bit flags for blitting operations
/// @{
#define BLT_SRCCOLORKEY 0x1 ///< Use source surface colour key for transparency
#define BLT_TGTCOLORKEY 0x2 ///< Use target surface colour key for transparency
/// @}

Ce sont donc bien des flags permettant déjà de définir quelle surface tu veux utiliser pour la transparence .
Quand j'en sais plus je reedit !

Quote
/**
    * \brief Set transparency colour key for a surface.
    * \param surf surface handle
    * \param ckey transparency colour key value
    * \default None, returns false.
    * \note Derived classes should overload this method if the renderer
    *   supports colour key transparency for surfaces.
    */
   virtual bool clbkSetSurfaceColourKey (SURFHANDLE surf, DWORD ckey) { return false; }
C'est bien ce que je pensais ...
Cette méthode attribue une couleur de transparence à un SURFHANDLE .
J'ai vu des fonctions qui permettent de récupérer ces SURFHANDLE  , attends ...
Quote
/**
    * \brief Create an offscreen surface from a bitmap
    * \param hBmp bitmap handle
    * \return surface handle, or NULL to indicate failure
    * \default Creates a surface of the same size as the bitmap, and
    *   uses clbkCopyBitmap to copy the bitmap over.
    * \note The reference counter for the new surface is set to 1.
    * \sa clbkIncrSurfaceRef, clbkReleaseSurface
    */
   virtual SURFHANDLE clbkCreateSurface (HBITMAP hBmp);
Voici déjà une méthode qui te permet d'en créer une à partir d'un BMP.
Bon, j'ai pas trop le temps ... J'ai survolé le fichier et c'est HALLUCINANT tout ce que le SDK permet de faire .
Jusqu'à redéfinir entièrement le procédé de REndu ...
Hallucinant .
Je te conseille d'examiner ce fichier, c'est une mine .
Pour ce qui est de te dire comment on fait , faudra que je m'y mette avant !
Là, je vais sur MFDApi ...A+
Spock


A+ , Spock



Message modifié ( 01-08-2010 03:14 )

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 #49 - 01 August 2010, 14:22:03
Merci MrSpock ! :) Je savais que c'était faisable car j'avais vu dans NASSP qu'ils utilisent le magenta pour la transparence de leur objets. J'avais essayé de regarder leurs codes mais il y a tellement de trucs dans un même .cpp que je me suis donné mal à la tête :sick:. Avec ces infos, je devrait me débrouiller.

:merci:


Émile

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

- Luc Plamondon