Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1139 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Question pour un portage Win -> OSX

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Question pour un portage Win -> OSX

n°2091277
Amonchakai
Posté le 25-07-2011 à 08:38:39  profilanswer
 

Bonjour,
 
Je suis en train de déterrer du code que j'avais fait il y a quelques années. Il s'agit d'un petit loader 3DS, je ne pense pas que l'on puisse l'appeler autrement...  
 
Toujours est-il que je suis en train de le porter sous OSX. J'ai donc remplacé tout mes appels à l'API Win32 par du GLUT. Le reste étant en OpenGl et un peu de Cg, il n'y a aucun pb :)
 
J'ai donc réussi à tout porter. Mais mon soucis est que j'ai deux comportement différents entre windows et mac sur la gestion de la fenêtre: sous mac le bouton rouge pour fermer la fenêtre est grisé, mais pas sous windows...  
 
Donc je me demandais si quelqu'un avait une idée de quel était le pb :D
 
Pour ceux qui n'ont pas de boule magique, niveau création de fenêtre je prends juste le code de NeHe:

Code :
  1. glutInit            ( &argc, argv ); // Erm Just Write It =)
  2.   init ();
  3.   glutInitDisplayMode ( GLUT_RGB | GLUT_DOUBLE ); // Display Mode
  4.   glutInitWindowSize  ( 500, 500 ); // If glutFullScreen wasn't called this is the window size
  5.   glutCreateWindow    ( "NeHe's OpenGL Framework" ); // Window Title (argv[0] for current directory as title)
  6.   glutDisplayFunc     ( display );  // Matching Earlier Functions To Their Counterparts
  7.   glutReshapeFunc     ( reshape );
  8.   glutKeyboardFunc    ( keyboard );
  9.   glutSpecialFunc     ( arrow_keys );
  10.   glutMainLoop        ( );


Bon j'ai tout encapsulé dans des classes et tout, mais c'est ça qui se déroule. Je cherche donc s'il n'y a pas une callback a définir spécialement pour OSX ou une option par défaut qui aurai été mise sous windows et pas sous OSX. Je pense que cela soit dût au fait que sous mac le fait de fermer une fenêtre principale n'implique pas nécessairement la fermeture de l'application (contrairement à windows).
 
Merci :)
 
[edit] j'ai renommé le topic, car je vais avoir d'autres questions sur le portage de mon application. Et pas seulement sur GLUT


Message édité par Amonchakai le 26-07-2011 à 07:29:13
mood
Publicité
Posté le 25-07-2011 à 08:38:39  profilanswer
 

n°2091424
Amonchakai
Posté le 25-07-2011 à 19:26:10  profilanswer
 

Bon, déjà j'ai vu qu'il fallait utiliser la fonction "atexit( )" qui permet alors d'appeler la fonction pour la fermeture de la fenêtre & cleanup.
 
Cela ne résous pas le pb du bouton grisé, mais au moins cela permet de fermer via pomme+Q sans faire tout planter le système...

n°2091486
Amonchakai
Posté le 26-07-2011 à 07:54:38  profilanswer
 

Bonjour,
 
J'ai nouveau problème de détecté: quand j'écris des données en binaire sous windows, je n'arrive pas a les lire sous OSX...  
 
Exemple: Pour écrire un entier dans un fichier fichier, je faisais:

Code :
  1. // écriture
  2. std::ofstream ofs("toto.dat" );
  3. int i = 50;
  4. ofs.write(reinterpret_cast<const char*>(&i), sizeof(int));
  5. ofs.close
  6. // lecture
  7. std::ifstream ifs("toto.dat" );
  8. int ri = 0;
  9. ofs.read(reinterpret_cast<char *>(&ri), sizeof(int));
  10. ifs.close();


 
Donc tout cela marchait bien sous windows, mais par contre des données écrites sous windows ne sont pas lues correctement sous mac.
Donc j'imagine que c'est un problème dut au fait que un utilise du big endian et l'autre du small endian.  
 
Première question: Il y a-t-il une norme sur l'endianisme (?) quand on écris dans un fichier? Tout dois être en big endian comme pour des données transmises par réseau?  
Deuxième question: Du coup, je fais comment moi ? :o Il y a htons/ntohs, mais je n'écris pas que des entier moi... Et j'imagine que si je planque des float dans des long cela ne va pas marcher... type:

Code :
  1. float f = 3.6f;
  2. long *l = reinterpret_cast<long *>(&f);
  3. long l2network = *l;


Car je suis pas sur que le mac et win vont représenter les float de la même façon :/
 
[edit] Et puis j'imagine que ça va aussi être le drame à cause de mes sizeof(int) qui peuvent retourner tout et n'importe quoi en fonction de la plateforme :/
 
C'est quoi la méthode "propre" pour ce problème?
 
merci :)


Message édité par Amonchakai le 26-07-2011 à 08:29:46
n°2091490
Joel F
Real men use unique_ptr
Posté le 26-07-2011 à 08:43:20  profilanswer
 

utilise une lib de serialization genre boost.serialization.

n°2091519
Amonchakai
Posté le 26-07-2011 à 11:16:20  profilanswer
 

Ok, merci.  
 
J'ai fait un petit test vite fait:  

Code :
  1. #include <boost/serialization/vector.hpp>
  2. #include <boost/serialization/string.hpp>
  3. #include <boost/serialization/version.hpp>
  4. #include <boost/archive/binary_iarchive.hpp>
  5. #include <boost/archive/binary_oarchive.hpp>
  6. #include <vector>
  7. #include <string>
  8. #include <iostream>
  9. #include <fstream>
  10. class SomeOtherClass {
  11. private:
  12.     friend class boost::serialization::access;
  13.     float f;
  14.     template<class Archive>
  15.     void serialize(Archive & ar, const unsigned int version) {
  16.         ar & f;
  17.     }
  18. public:
  19.     SomeOtherClass(float i) : f(i)         {};
  20.     SomeOtherClass() {};
  21.     inline float getF() const             {return f; }
  22.    
  23. };
  24. BOOST_CLASS_VERSION(SomeOtherClass, 1)
  25. class SomeClass {
  26. private:
  27.     friend class boost::serialization::access;
  28.     std::vector< SomeOtherClass >    otherClass;
  29.     std::string                        str;
  30.     template<class Archive>
  31.     void serialize(Archive & ar, const unsigned int version) {
  32.         ar & otherClass;
  33.         ar & str;
  34.     }
  35. public:
  36.     SomeClass() {};
  37.     inline void                  setStr(const std::string &s)    { str = s; }
  38.     inline const std::string &getStr() const                { return str; }
  39.     inline void                     add(const SomeOtherClass &s)        { otherClass.push_back(s); }
  40.     inline const SomeOtherClass &get(size_t i) const                { return otherClass.at(i); }
  41.     inline size_t                 size()    const                        { return otherClass.size(); }
  42. };
  43. BOOST_CLASS_VERSION(SomeClass, 1)
  44. int main(int argc, char **argv) {
  45.     SomeClass sC;
  46.     sC.setStr("toto" );
  47.     for(size_t k = 0 ; k < 10 ; ++k)
  48.         sC.add(SomeOtherClass(sqrtf(static_cast<float>(k))));
  49.     {
  50.         std::ofstream ofs("binaryfile.dat" );
  51.         boost::archive::binary_oarchive oa(ofs);
  52.         oa << sC;
  53.         ofs.close();
  54.     }
  55.     SomeClass sC2;
  56.     {
  57.         std::ifstream ifs("binaryfile.dat" );
  58.         boost::archive::binary_iarchive ia(ifs);
  59.         ia >> sC2;
  60.         ifs.close();
  61.     }
  62.     std::cout << sC2.getStr() << "\n";
  63.     for(size_t k = 0 ; k < 10 && k < sC2.size() ; ++k)
  64.         std::cout << sC2.get(k).getF() << "\n";
  65.     return 0;
  66. }


 
Ca marche bien sous windows. J'ai ensuite essayé de lire le fichier binaire sous linux. Mais a la lecture, je me tape une exception:

Citation :

terminate called after throwing an instance of 'boost::archive::archive_exception'
  what():  input stream error
Aborted


 
Tu aurai une idée du pb?  :??:

n°2091617
Amonchakai
Posté le 26-07-2011 à 21:31:59  profilanswer
 

Bon, je viens de tester sur mon mac. Cela ne marche pas... Mais j'ai une autre erreur...

Citation :

terminate called after throwing an instance of 'boost::archive::archive_exception'
  what():  invalid signature
Abort trap

 

Du coup, pas trop chaud pour le gros refactoring... Vu que cela ne marche pas mieux entre OS :/


Message édité par Amonchakai le 26-07-2011 à 21:38:10

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Question pour un portage Win -> OSX

 

Sujets relatifs
[OSX/Cocoa/ObjC] comment lister les process qui utilisent le réseau[EXCEL/VBA] Masquer fenêtre DOS
Reconnaitre l'ouverture d'une fenetre et la remplir automatiquementAide pour la création d'une fenêtre permettant de traiter des images
lancer un script a la fermeture de firefoxProbleme StringTokenizer et tableau
[Batch] Runas : Executer plusieurs programmes sur invite CMD [Résolu]Centrer DIV dans la fenetre (Chrome-FF : OK .:. IE7 : NOK)
Ouvrir la fenêtre d'impression en pré sélectionnant la page a imprime[C++] Fenêtre SDL ne s'affiche pas [RESOLU]
Plus de sujets relatifs à : Question pour un portage Win -> OSX


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR