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: Soucis avec le codage  (Read 2889 times)

0 Members and 1 Guest are viewing this topic.

Offline mahzel

  • Full Member
  • ***
  • Posts: 127
  • Karma: 0
01 June 2006, 13:45:03
Bon, dans mon module (dont je tairais pour le moment l'utilitée) j'ai quelques petits soucis.

Logiquement, un appui sur un des boutons du mfd (prenons l'exemple du premier bouton) fiat changer l'affichage via la
fonction updtae je détaille :
int ConsumeButton(int bt, int event)
{
    if(event == PANEL_MOUSE_LBDOWN)
    {
               tab[bt] = (char*)getVesselHandleByIndex(bt);
     }
               return bt;
}

bon la fonction est un peu plus complète mais bon, globalement c'est ça.
La fonction update

void Update (HDC hDc)
{
    TextOut(hDc, 10, 100, tab[bt], sizeof(tab[bt]);
}

Sachant que tab est déclaré comme suit :

char** tab = new char* [10]
for(int i = 0; i<10;i++)
{
   tab = new char [10];
}



Choses que j'aimerais savoir :
-1 : est ce que l'allocation dynamique de mon tableau est bonne?
-2 : est ce que le handle est convertible en char* ? (à mon avis l'erreur est là)
-3 : peux-être un problème sur la sortie texte, mais ca marche très bien avec les entrées d'origine du tableau.

Merci d'avance


"La Passion domine la Raison"
3eme leçon du sorcier

Offline laserpithium

  • Legend
  • ******
  • Posts: 1473
  • Karma: 0
Reply #1 - 01 June 2006, 19:22:16
Perso, je ne m'y connais pas assez en C++ (je suis plutot java) pour être sur de ce que je dis, mais:

J'ai des gros doutes sur
tab[bt] = (char*)getVesselHandleByIndex(bt);

J'ai pas la SDK en tête, mais d'après le nom de la fonction, getVesselHandleByIndex renvoie le handle du vaisseau, c'est à
dire un objet du type OBJHANDLE. J'ai du mal à voir comment en transformant ce OBJHANDLE en tableau de caractere Orbiter peut
s'y retrouver.

Deuxième piste : comment est définie ta variable bt ?Tu l'utilises en effet dans la fonction d'update, mais est-elle définie
à l'extérieure de cette routine ?

Pour la routine graphique, à priori pas de problème. Perso, j'utilise strlen plutôt que sizeof, mais si ça compile, c'est que
ça doit marcher.

Bon courage !



La sagesse me cours après, mais je suis plus rapide
Si Dieu existe, butons-le !

Offline mahzel

  • Full Member
  • ***
  • Posts: 127
  • Karma: 0
Reply #2 - 01 June 2006, 21:02:22
oui en fait la routine d'affichage est une boucle for(int bt=0;bt < 12; bt++)

Le problème vient biens du OBJHANDLE je pense aussi, le problème c'est comment récupérer le nom du vaisseau en char alors?
(ou alors j'ai mal lu l'API)


"La Passion domine la Raison"
3eme leçon du sorcier

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #3 - 01 June 2006, 21:19:27
'Fectivement c'est pas bon du tout la ca retourne un OBJHANDLE regarde la doc.

Tu doit avoir des fonction GetVesselName ou GetObjName
ca dépend de ce que tu veux faire je vois pas ou tu veux en venir
avec ce code. Qu'a tu besoin quand on presse la souris ?

Pour l'allocation perso j'évite comme la peste les alloc dynamic c'est
un truc à avoir des trous dans la mémoire si tu oublie le delete
du tableau.

non dynamique ca donnerait un truc qui ressemble à ca (j'ai pas la SDK en tete non plus):
char NomVaisseau[255]={0};    //global
Handle->GetObjName(&NomVaisseau,255);

Y a pleins de manière ca dépend de ou tu est dans le code
et de ce que tu veux faire.

A++

Dan



Message modifié ( 01-06-2006 21:23 )


Offline mahzel

  • Full Member
  • ***
  • Posts: 127
  • Karma: 0
Reply #4 - 01 June 2006, 23:40:20
le problème c'est que c'est un tableau de noms de vaisseaux (vala pourquoi je m'arrache les cheveux.) Et j'ai bien relu la
doc, et j'ai trouver la fonction qu'il me falait pour le nom!
Merci merci merci...

Pour le tableau, t'inquiete pas je le delete proprement ;)

Le principe est de récupérer tous les vaisseaux présent dans orbiter et de les stocker dans un tableau pour réutilisation
future...


"La Passion domine la Raison"
3eme leçon du sorcier

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #5 - 01 June 2006, 23:54:02
oki si tu a encore un problème j'ai les routines qu'il faut pour ca.

Reste que je persiste à dire que pour ce genre de truc les
alloc dynamique sont une mauvaise idée...
La mémoire est à profusion et en dynamique c'est
très facile d'oublier et d'avoir des memory leak.

Mais bon... question de style ;)

Dan


Offline mahzel

  • Full Member
  • ***
  • Posts: 127
  • Karma: 0
Reply #6 - 02 June 2006, 09:39:31
ah ben je veux bien les routines que tu as "pour voir" est pourquoi pas les réutiliser.....
Ah un moment je pensais utiliser des listes mais ca fait un bout de temps que j'ai plus fait de C++ ^^


« Last Edit: 02 June 2006, 11:05:46 by mahzel »
"La Passion domine la Raison"
3eme leçon du sorcier

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #7 - 02 June 2006, 11:05:46
Ca donne un truc comme ca:


Code: [Select]
// GLOBAL
char cVesselNameList[150][51]={0}
int  iNbrVesselListed=0;

//////////////////////////
// Get all vessel name
//////////////////////////
int GetAllVesselName(void)
{
int I=0;
for(I=0;I<150;I++)
{
memset(cVesselNameList[I],0,50);
}
iNbrVesselListed=oapiGetVesselCount();
iNbrVesselListed=min(149,iNbrVesselListed);
if(iNbrVesselListed>0)
{
for(I=0;I<iNbrVesselListed;I++)
{
oapiGetObjectName(oapiGetVesselByIndex (I),cVesselNameList[I],50 );
}
}
return iNbrVesselListed;
}

A++

Dan

« Last Edit: 02 June 2006, 11:05:46 by DanSteph »