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: [tutorial] Posez vos question sur les DLL C++  (Read 84034 times)

0 Members and 1 Guest are viewing this topic.

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
29 June 2007, 02:29:15
NOTE: Ce fil est maintenant fermé car il fait 18 pages, vous pouvez trouvez le nouveau fil "posez vos questions sur les dll" ici: http://orbiter.dansteph.com/forum/index.php?topic=6478.msg98607#msg98607
 




Ce post sera listé dans dans la série "tutorial DLL pour Orbiter"dispo ici:
http://orbiter.dansteph.com/forum/index.php?topic=6335.msg95352#msg95352

Vos questions et nos réponses (on peut etre plusieurs à répondre) serons
donc immortalisée et peut être utile à d'autres qui auront eu les mêmes
questions/probleme que vous.

Questions sur le C++,sur la SDK orbiter ou sur VC++ bienvenue.

Rappellez vous, y a pas de questions con, mais essayez d'éviter le off-topic
et les blabla pour garder le post assez informatif. A terme j'effacerais un peu
les post blablas pour garder le truc avec un max d'informations par m2

A vos claviers !

Dan



Message modifié ( 14-05-2008 02:30 )


Offline Momo

  • Legend
  • ******
  • Posts: 2682
  • Karma: 1
Reply #1 - 30 June 2007, 09:41:52
bon aller je commence:

comment s'y prendre pour crée un payload sur une DLL, configuré de la même façon que le spacecraft3...

il faut crée une seul dll avec 2 vessels?
gérer le tous par un "statut" pour que la dll se souvienne du jettison?

je dirais bien que j'ai ma petite idée, mais je n'en suis pas sure... :)



Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #2 - 30 June 2007, 13:46:53
wow, tu commence par du lourd :trucdeouf:

Tout d'abord j'ai aucune idée comment marche spacecraft
ne l'utilisant pas moi-même. Avant de faire trois pages
de réponses inutile il va falloir qu'on précise un peut le truc.

Le but suivis est de pouvoir configurer dans un scenario
quel payload notre vessel va emporter et de pouvoir
le lancer à un moment donné ? (Le DGIV le fait)

C'est un truc a 300 lignes de codes ca... 8o

-Visible ou invisible dans ta fusée le mesh du payload ?
-Tu vois ca comment toi ? (grande lignes)

Dan



Message modifié ( 30-06-2007 14:01 )


Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #3 - 30 June 2007, 14:54:55
Quote
Tout d'abord j'ai aucune idée comment marche spacecraft
ne l'utilisant pas moi-même. Avant de faire trois pages
de réponses inutile il va falloir qu'on précise un peut le truc.

La méthode spacecraft est assez simple. Par exemple, pour le CTV qui est composé
d'un module de service et d'une capsule, j'ai mon module de service comme vaisseau
principal et ma capsule en charge utile.
La charge utile d'un spacecraft est forcément visible (à part si on triche avec un mesh
particulier).

Tout se passe au niveau d'un fichier ini (qui configure la dll):
; == le vaisseau en question ==
[CONFIG]
MESHNAME=ARD-CTV\CTV-LEO-SSA
SIZE=12
....
....
; == la charge utile ==
[PAYLOAD_0]
MESHNAME=ARD-CTV\CTV-LEO4-CM
NAME=CTV-LEO4-CM
OFF=(0,0,2.7)
MASS=0                                              ; reportée sur SSA
MODULE=Spacecraft\Spacecraft3
SPEED=(0,0,1)
ROT_SPEED=(0,0,0)

Il n'est pas nécessaire de mettre cette charge utile dans le scénario car dès lors qu'on y met
"le vaisseau en question", il apparait tel que défini par le fichier ini et donc avec sa charge.
La charge n'existe vraiment que lorsqu'elle sera relachée auparavant "elle n'apparait que visuellement".

Dans le cas de spacecraft, il ne s'agit pas de déclarer la charge dans le scénario.
On n'a pas le choix, on ne peut utiliser que la charge définie dans l'ini.
Je suppose que le but de Momo est de faire à l'identique mais directement dans sa dll et sans
passer par un ini.


------------

no matter.

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #4 - 30 June 2007, 17:07:34
Un problème plus basique, mais je ne m'en sors pas.
C'est sur l'exemple Shuttle.pb de Orbitersound.sdk.
Le chemin vers Orbiter.lib est bien indiqué sur MSVC mais rien à faire lors de la compile ...
Alors que j'ai bien vérifié dans l'explorateur de solutions ( fenêtre en haut à gauche ) qu'Orbiter.lib
se trouve bien dans le dossier lib ....  :doubt:




Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #5 - 30 June 2007, 17:09:17
Quote
picto a écrit:
Un problème plus basique, mais je ne m'en sors pas.
C'est sur l'exemple Shuttle.pb de Orbitersound.sdk.

Essaie de l'enlever de lib (select Orbiter.lib et delete) et regarde si il le retrouve.
Le template mieux foutu en francais avec pleins de commentaires et OrbiterSound
arrive dans une heure max.

Dan



Message modifié ( 30-06-2007 17:10 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #6 - 30 June 2007, 17:16:22
Ok merci .... c'était ça mais ça donne .... 135 erreurs LNK2001 et LNK2019 sur OrbitersoundSDK35.lib :badsmile:
Si je comprend bien c'est un conflit entre une organisation de dossier définie sur un projet et les chemins définis pour la recherche de répertoires de MSVC .... si oui .... c'est vicieux !



Message modifié ( 30-06-2007 17:38 )

Pic

Offline Apofis

  • Sr. Member
  • ****
  • Posts: 349
  • Karma: 0
Reply #7 - 30 June 2007, 18:14:42
pour momo je pense que tu peu trouver ton bonheur sur l'exemple d'atlantis. je sais s'est po l'exemple le plus lisible...
regarde dans le code de la séparation des booster et du tank.

je pense que tu peu appliquer la même méthode. avant la séparation le booster est juste représenté par son mesh. une fois la
séparation il utilise "oapiCreateVesselEx". en gros il crée le booster(l'engin physique) que a la séparation.

pour une fusée tu utilise le mesh lors de la séparation de la coife et l'oapiCreateVesselEx lors de la séparation du playload.

je pense qu'il dois y avoir un coup a joué par la


"Oups c quoi se bruit" Fred Haise, apollo 13 :P

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #8 - 01 July 2007, 12:34:19
Question de méthode sur les sauvegardes incrémentales des projets.
Lors d'une sauvegarde de projet, MSVC ne crée pas de nouveaux cpps.
Si je veux revenir en arrière est ce le projet qui garde une trace des anciens sources ? ( avant modif )


Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #9 - 01 July 2007, 14:43:57
Non, dès que tu quitte le projet tu n'a plus d'undo.
Par contre tu peut commenter des parties entieres avec  /* */
pratique pour garder du code sans qu'il soit "actif"

Exemple:

/*
int salutPicto=0;
int SalutLesGars=0;
SalutLesGars+=salutPicto;
*/


Sinon j'ai un prog perso "VcBackup" qui sert aux sauvegardes incrementale,l'avantage
c'est que tu peu exclure les fichiers temporaires de compilation qui sont énorme et ne
servent a rien. (je veux dire a part pour compiler)

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #10 - 01 July 2007, 15:59:19

Et on peut le trouver quelque part ce programme ?  :siffle:

Code: [Select]

int MerciDan=0;
int PictoContent=0;
     PictoContent+=MerciDan


Pic

Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #11 - 01 July 2007, 19:50:38
Quote
Momo a écrit:
bon aller je commence:
comment s'y prendre pour crée un payload sur une DLL, configuré de la même façon que le spacecraft3

Je suis dessus Momo, j'ai réussi à placer mon mesh mais je n'ai pas encore mis en place le détachement.

dans le header:
const VECTOR3 pos = {x,y,z}; // x,y et z sont les coordonnées de ton mesh relatives au
mesh principal.

dans le .cpp:
AddMesh ("MonMesh",&pos);

Ensuite, je n'ai pas encore testé mais je pense qu'il faut créer une nouvelle fonction du style:
void MonVaisseau:SeparatePayload (){...}
avec un oapiCreateVesselEx() pour créer le nouveaux vaisseau à la position voulue avec
une vitesse relative au vaisseau dont il se sépare et deuxièmement, un DelMesh() afin de
supprimer le mesh en trop.
Tu attribues la fonction à une combinaison de touche du style CTRL+J comme tu le ferais pour une
animation et le tour est joué. Le CTV vient de franchir une étape vers le passage au C++ (prévu
pour 2024, un mardi :) )


------------

no matter.

Offline Momo

  • Legend
  • ******
  • Posts: 2682
  • Karma: 1
Reply #12 - 01 July 2007, 20:05:53
Merci no-matter, sa recoupe mon idée de base... j'ai pas eu le temps devant moi pour me penché sur la question...

j'ai pensé a un code qui ressemblerai a sa:

Quote
const VECTOR3 OFS_payload = { X,Y,Z};

void vessel::clbkSetClassCaps (FILEHANDLE cfg)
{
...../....
addMesh ("vessel" ) ; //pour vessel
addMesh ("payload" ) , (OFS_payload); //pour le payload + sa position
}


void vessel::jettison()
   {
   VESSELSTATUS2 vs;
   
   memset (&vs, 0, sizeof(vs));
   vs.version = 2;
      
   GetStatus (&vs);
   oapiCreateVesselEx ("payload", "payload", &vs);
        delMesh ("payload");
        }

int vessel::clbkConsumeBufferedKey (DWORD key, bool down, char *kstate)
   {
   if (!down)
      return 0; // seulement touches enfoncées

         switch (key)
            {
            case OAPI_KEY_J:      // Jettison du payload
               jettison();
               return 1;
   
      return 0;
   }
}

c'est juste une idée non développé, non testé, juste de tête...



Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #13 - 01 July 2007, 21:29:04
Quote
no matter a écrit:

Ensuite, je n'ai pas encore testé mais je pense qu'il faut créer une nouvelle fonction du style:
void MonVaisseau:SeparatePayload (){...}
avec un oapiCreateVesselEx() pour créer le nouveaux vaisseau à la position voulue avec
une vitesse relative au vaisseau dont il se sépare et deuxièmement, un DelMesh() afin de
supprimer le mesh en trop.

Le principe est bon mais
Attention Addmesh rajoute un mesh en incremental, le premier addmesh dans le slot 0 le deuxieme dans le slot 1 etc
etc... Si vous essayez de les manipuler en utilisant le no de slot ca va planter.

Utilisez plutot insertmesh que addmesh (voir exemple tuto dans clbkSetClassCap)

Je vous le met la:
Code: [Select]
// TRUC: on peut loader d'autres meshes et les faires apparaitre/disparaitre
// au cours de la simulation. Utile pour par exemple afficher le mesh des
// astronautes suivant si ils sont en cabine ou pas. Par exemple la ligne ci-dessous insere
// un mesh "MesAstronautes.msh" dans le slot "2" et le fait apparaitre
// SetMeshVisibilityMode(InsertMesh(oapiLoadMeshGlobal ("MonAddon\\MesAstronautes"),2),MESHVIS_EXTERNAL);
// Plus tard dans votre code ceci le fait disparaitre: SetMeshVisibilityMode(2,MESHVIS_NEVER);
// et ceci le fait apparaitre : SetMeshVisibilityMode(2,MESHVIS_EXTERNAL);
// (Notez le "2" est l'index du slot ou le mesh a été chargé)

Meme pour le mesh principal on peut utiliser insertmesh comme cela on a le controle sur le slot...
insertmesh *remplace* aussi dans le no de slot, sur DGIV le slot 4 est utilisé pour les astro dans la cabine,
je load au choix le mesh 1,2,3 ou 4 astronauts dans ce slost avec insertmesh.

Si vous utilisez un handle pour manipuler les mesh n'oubliez JAMAIS d'initialiser ce handle a NULL et de le tester avant toute manipulations:

if(MonHandle!=NULL)

Ceci est valable pour tout les handles, utiliser des handles non valide sont la premiere cause de CTD.
Si on le fait pas dès le départ bonjour pour le faire quand on a 10'000 lignes de code.

Dan



Message modifié ( 01-07-2007 21:36 )


Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #14 - 02 July 2007, 01:50:27
Merci Dan, justement je trouvais Addmesh un peu limite car il ne précise pas de handle ou de numero de slot.

la fonction jettison testée:

void vessel::jettison()
{
   VESSELSTATUS2 vs;
   memset (&vs, 0, sizeof(vs));
   vs.version = 2;
   GetStatusEx (&vs);                    // GetStatusEx because VESSELSTATUS2
   Local2Rel (OFS_payload, vs.rpos);     // sinon le vaisseau va apparaitre dans le mesh principal

   oapiCreateVesselEx ("payload", "payload", &vs);
   DelMesh (1);                          
}
(Momo j'ai repris les noms que tu utilise afin de ne pas introduire de doute)

DelMesh sera donc a remplacer en fonction de ce qu'indique Dan et je ne sais pas comment attribuer une vitesse
de libération
:sad:


------------

no matter.

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #15 - 02 July 2007, 02:17:57
Quote
no matter a écrit:
 je ne sais pas comment attribuer une vitesse de libération :sad:

Regarde dans atlantis a "SeparateBoosters" sinon je te filerais le code DGIV pour ca.

Quote
no matter a écrit:
DelMesh sera donc a remplacer

Si je me souvient bien delmesh utilise justement le no de slot, charge le main dans 1 le payload dans 2 et delmesh
le 2 quand tu largue... je jette un oeil sur payload DGIV pour confirmer...

Ouais c'est ca: DelMesh(noSlot);

Oublie pas d'ajuster la masse à vide SetEmptyMass après jettison.

A++

Dan


Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #16 - 02 July 2007, 02:34:39
Ouaip, Delmesh utilise bien le numéro de slot.

Pour l'exemple Atlantis, justement je suis un peu perdu. J'ai bien compris le coup du local2rel pour la position (rpos)
mais je ne suis pas sûr du tout pour la vitesse, elle me semble en tout cas donnée par le moteur de chaque SRB
(vs.thruster = &thrust; vs.nthruster = 1; ??).
De mon côté, j'ai bien tenté d'utiliser rvel mais evidemment çà ne donne pas ce que je souhaite ( impossible d'obtenir
une libération qui se fait simplement dans l'axe des z comme souhaitée)

Un autre truc que je n'ai pas compris c'est memset (&vs, 0, sizeof(vs)); . C'est nécessaire mais je n'ai rien trouvé dans
le sdk d'orbiter, je me suis donc contenté de recopié bêtement.


------------

no matter.

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #17 - 02 July 2007, 02:35:15
Quote
DanSteph a écrit:
Sinon j'ai un prog perso "VcBackup" qui sert aux sauvegardes incrementale,l'avantage
c'est que tu peu exclure les fichiers temporaires de compilation qui sont énorme et ne servent a rien. (je veux dire a
part pour compiler)
Dan

Quote
picto a écrit:
Et on peut le trouver quelque part ce programme ?  :siffle:


VC Backup - backup projets Visual C++

Ici: http://orbiter.dansteph.com/download/VC_Backup.exe




Bien lire la doc (boutton help)

Le principe: tout ca c'est trop important pour faire le con avec donc ca fait en gros une copie
du repertoire, la nouveauté c'est que ca donne un chiffre incremental de répertoire+description

Admettons que vous avez donné comme repertoire destination D:\MesBackup
ca donnera ce genre la:

Code: [Select]
D:\MesBackup\001_Debut_projet
D:\MesBackup\002_Cool_j'ai_rajouté_le_mesh_VC
D:\MesBackup\003_avant_modif_importante_boutons_VC
D:\MesBackup\004_ok_modif_marche

VC Backup s'occupe automatiquement du chiffre incremental et de transformer votre texte en nom de
répertoire valide exemple "J'ai encore fais le singe avec le code" en "004_jai_encore_fait_le_singe_avec_le_code"

Les GROS avantages de VC backup sur une copie manuelle:

-Une fois le premier backup fait les suivant ce font en une seconde juste le temps de donner un texte
 car VC backup ce souvient de vos derniere sauvegarde et il n'y a plus besoin de rentrer le rep source
et destination. (peut ce souvenir des dix dernier backups)

-Avec une copie manuelle on serait obligé à chaque fois de deleter les sous-rep debug et release
qui contiennent pour plusieurs mb de fichiers temporaire inutiles

-VC backup lui donne l'option d'exlure automatiquement ces fichiers temporaires (.ilk .obj .ncb etc etc)

GROS avantages sur backup avec d'autres utilitaires:

Comme les repertoires sont simplement copié et non compressé ou manipulé il suffit d'aller dans un vieux
repertoire backup pour pouvoir ouvrir le projet VC++, copier du code, comparer etc etc.

Pour FsPassengers j'ai fini avec 350 backups en l'utilisant, il m'a sauvé plusieurs fois:




Et n'oubliez pas cette maxime très importante dès lors qu'on crée quelque chose
qu'on ne pourra jamais re-acheter ou re-installer d'un CD:
si tu backup pas (en plus sur un autre hd) t'est mort ! ;)

Dan



Message modifié ( 02-07-2007 02:53 )


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #18 - 02 July 2007, 03:02:59
Quote
no matter a écrit:
Un autre truc que je n'ai pas compris c'est memset (&vs, 0, sizeof(vs)); . C'est nécessaire mais je n'ai rien trouvé
dans le sdk d'orbiter, je me suis donc contenté de recopié bêtement.

memset comme sont nom l'indique "met à une valeur toute une zone mémoire"
le premier parametre est l'adresse: & ou & signifie "l'adresse en mémoire
de cette variable, structure, bidule" le deuxieme c'est la valeur qu'on veut attribuer
à cette mémoire (0) et le troisieme c'est le nombre de bytes à mettre à cette valeur
en partant de l'adresse de variable.

Dans ce cas ca te mets toute la structure VS à zéro, bien plus pratique que le faire
un par un pour les 15 variables que contient cette structure.

Pour plus d'explications sur les structures voir l'exemple VC++ du tuto. "donneesimulation.h"

pour le reste je regarde demain ;)

Dan



Message modifié ( 02-07-2007 03:04 )


Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #19 - 02 July 2007, 03:05:42
Ok merci, il est temps que j'ailles dormir ;)


------------

no matter.

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #20 - 02 July 2007, 03:12:33
Attention aussi pour vos payload, comme vous voulez (en principe) le faire depuis un scenario
ca ce fera depuis clbkLoadStateEx après avoir récupéré le nom du vessel à loader en payload

Exemple DGIV:
Code: [Select]
GL-01:DeltaGliderIV
CargoPayload DGIVMTKSSAT

Ca dépend en fait si vous voulez un truc souple ou en "dur" dans le code, si vous voulez
un truc qui marche avec pleins d'autres addons et est très souple comme le DGIV ca doit
taper dans les 100-300 lignes. (le controle de toutes les c... eries que peuvent faire
les utilisateurs prend en général une tapée de code ;) ) Si vous ne chargez que VOS payload
(vous savez à quoi vous attendre) vous pouvez faire plus simple.

Sinon si vous n'avez qu'un choix de deux trois payload tous les votres un simple chiffre
fais l'affaire depuis le scenario:

CargoPayload 1

Et dans le code:

switch(NoPayload)
0=rien
1=satellite TV - load mesh TVSAT
2=Satellite Telecom - load mesh COMSAT

Dan



Message modifié ( 02-07-2007 05:15 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #21 - 02 July 2007, 03:26:02
Magnifique ! Merci again :wor: J'ai tellement pris cette manie avec Max et Tochope que j'étais déçu
de ne pas pouvoir faire de même avec MSVC ... J'ai l'impression que l'on peut rapidement foutre la zone dans un
projet avec ces "pelotes" qui se dévident ... Je suis sûr que ça va être adopté par beaucoup ici ;)

Assez causé ... au téléchargement ... euuuhhh .... en fait, je rame sur un truc basique je crois ... plusieurs heures que
je tourne en rond.
J'essaye d'ajouter l'horizon artificiel du Deltaglider dans le VC .... en dévidant la pelote, je me retrouve face à
Horizon.cpp du Deltaglider.  Je l'incorpore donc au projet en cours ainsi que math.h . Jusque là pas de soucis ... :siffle:

Je crois qu'il y a un truc que je n'ai pas encore bien compris sur les déclarations de "variables"
F7 ...
1>d:\10_orbiter_dev\orbitersdk\samples\monaddon\cockpit.cpp(45) : error C3861: 'RedrawPanel_Horizon' :
identificateur introuvable

Je ne sais pas comment la déclarer ... ClbkPostStep ? ( chaque image )
Ni comment l'initialiser .... clbkSetClassCap.cpp ?
Est ce une variable de classe ?
J'ai essayé plein de trucs ... mais là je sèche un peu :sad:
Pareil sur l'initialisation des callbacks Orbiter, je cherche encore. ( je ne trouve pas ça très clair sur le tuto :sad: )
Ca va venir ;)


MaClasseAddon.h

   
Code: [Select]
bool clbkVCRedrawEvent (int id, int event, SURFHANDLE surf);

Cockpit.cpp

Code: [Select]
bool MonAddon::clbkVCRedrawEvent (int id, int event, SURFHANDLE surf)
{
int i;

switch (id) {

case AID_HORIZON:
RedrawPanel_Horizon (surf);
return true;
}

return false;
}

Horizon.cpp

Code: [Select]
#include "MaClasseAddon.h"
#include <math.h>

extern GDIParams g_Param;

void MonAddon::RedrawPanel_Horizon (SURFHANDLE surf)
{
POINT pt[4];
static double prange = RAD*30.0;

...........



Message modifié ( 02-07-2007 03:28 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #22 - 02 July 2007, 03:53:34
La fonction 'RedrawPanel_Horizon' doit etre aussi déclaré dans ta classe, regarde
dans le projet DeltaGlider il est aussi dans le h. (probablement "void RedrawPanel_Horizon (SURFHANDLE surf);")

Topo sur les fonctions:

A l'endroit ou tu appelle cette fonction elle est inconnue, elle n'est pas globale, ni déclarée
un peu avant dans le même CPP donc il ne sait pas de quoi tu parle.

Globale ce serait une fonction declarée dans un header que tous les CPP verrais:

Delcaration dans MonHeader.h
void SalutLesGars(void);

Le code proprement dis de la fonction va dans un cpp (implementation)

void SalutLesGars(void)
{
    code ici
}

Dans tous les CPP ou le "monHeader.h" est #include ca marchera car il "verrons" cette fonction.

A ne jamais utiliser dans Orbiter pour cause d'instance (multiple copie de votre classe en mémoire)


Autre solution fonction "locale" a un cpp:

void SalutLesGars(void)
{
    code ici
}

void Autrefonction(void)
{
    SalutLesGars();  // appelle de la fonction listée un peut avant dans le cpp
}

Autrefonction() vois la fonction SalutLesGars() car elle est avant dans le cpp.
Elle ne sera vue QUE par ce CPP à moins que tu la declare dans un header commun.

A ne jamais utiliser dans Orbiter pour cause d'instance (multiple copie de votre classe en mémoire)


Dernier possibilité: une fonction de classe:

Declaration Dans le header:
class monAddon :VESSEL2
{
   void SalutLesGars(void);
}

implementation dans un cpp:

void MonAddon::SalutLesGars(void)
{
 le code ici
}

Celle la sera vue par toutes les fonctions de ta classe "MonAddon::" veut dire "membre de cette classe.


Ca marche a peut près pareil pour les variables mais attention a ne pas confondre variables
et fonctions, les variables contiennent des valeurs, les fonctions c'est du code. Le code ne
s'initialise pas :prof:

Dan



Message modifié ( 02-07-2007 04:12 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #23 - 02 July 2007, 05:24:21
Ok, merci ...

J'ai essayé ça ...
Code: [Select]
void RedrawPanel_Horizon (SURFHANDLE surf)(void) ;dans MaClasseAddon.h
Et à la compile, j'ai obtenu ça.
error C2091: fonction retournée par la fonction


Dans Deltaglider.h
c'est écrit comme ça ...

Code: [Select]
class DeltaGlider: public VESSEL2 {
public:
DeltaGlider (OBJHANDLE hObj, int fmodel);
~DeltaGlider ();

void RedrawPanel_Horizon (SURFHANDLE surf);  


Là ça compile, c'est vicieux ce truc. Pourquoi pas de (void) derrière :doubt:


Plus que deux erreurs ... :badsmile: Je ferais mieux de dormir tiens ...
Faut vraiment que je relise, mais tout se ressemble tellement.
Quand je vois  .... int i;

là dedans
Code: [Select]

bool MonAddon::clbkVCRedrawEvent (int id, int event, SURFHANDLE surf)
{
int i;

switch (id) {

case AID_HORIZON:
RedrawPanel_Horizon (surf);
return true;
}

return false;
}

 

Je me dis :" C'est une déclaration de variable "
Et ben non ! raté
warning C4101: 'i' : variable locale non référencée
Pourtant quand j'essaye avec atteindre définition et déclaration ( sur l'original deltaglider ) ça ne bouge pas ....


Et pourtant sur le template MaClasseAddon.h, je trouve ça dans le coin EXEMPLE VARIABLE :doubt:
int    iTempDeSimulationTotal;   
Et celle là fonctionne :wall:



Message modifié ( 02-07-2007 14:21 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #24 - 02 July 2007, 11:40:59
Quote
picto a écrit:
J'ai essayé ça ...
Code: [Select]
void RedrawPanel_Horizon (SURFHANDLE surf)(void) ;dans MaClasseAddon.h
Et à la compile, j'ai obtenu ça.
error C2091: fonction retournée par la fonction

Normal (la fatigue?) ;) essaie ca (dans le header):

void RedrawPanel_Horizon (SURFHANDLE surf);

Les () d'une fonction c'est l'endroit ou on lui passe des parametres, il ne doit y avoir
qu'une paire de (), si tu veux passer plusieurs paramètres il sont simplement
séparé par une ",".

pour "int i" c'est une variable locale, ell est déclarée dans la fonction donc ne "vivra"
que le temps de la fonction.

Dan