IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Outils Discussion :

qmake et #pragma pack(1) [Compilation]


Sujet :

Outils

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut qmake et #pragma pack(1)
    Bonjour,

    J'ai un programme C++ qui lit des fichiers binaires qui contiennent des structures. Je le compile avec MingW32, je suis sous Windows.
    C'est structures m'imposent d'avoir un alignement 8 bits, j'ai donc ajouté la directive "#pragma pack(1)" qui fonctionne bien.

    Par contre, quand je veux monter mon programme console avec une interface Qt4, le programme de l'interface ne fonctionne plus dès que j'ajoute la ligne "#pragma pack(1)" ?!

    Pour compiler mon programme j'utilise la séquence suivante :
    qmake -project
    qmake -o Makefile MonProg.o
    mingw32-make

    Vous auriez une idée pour l'alignement 8 bits fonctionne avec un programme d'interface Qt ?

    Si j'ajoute que la ligne "#pragma pack(1)" dans mon programme Qt, j'obtiens un exécutable qui produit ce message :
    L'instruction à "0x004fd3ff" emploie l'adresse mémoire "0xed907b68". La mémoire ne peut pas être "read".

    Si j'enlève juste cette ligne, mon interface fonctionne bien.

    Vous pourriez faire l'essai juste en ajoutant la ligne "#pragma pack(1)" dans un de vos programme Qt ?

    Vous auriez une idée comment forcer l'alignement des données à 8 bits avec Qt ?

    Merci.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Il suffit de "fermer" le "#pragma pack(1)" par "#pragma pack()" autour de la structure à aligner et ça fonctionne...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #pragma pack(1)
    struct toto {
       ...
    };
    #pragma pack()

  3. #3
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Bonjour,

    Citation Envoyé par Kaji Voir le message
    Si j'ajoute que la ligne "#pragma pack(1)" dans mon programme Qt, j'obtiens un exécutable qui produit ce message :
    L'instruction à "0x004fd3ff" emploie l'adresse mémoire "0xed907b68". La mémoire ne peut pas être "read".

    Si j'enlève juste cette ligne, mon interface fonctionne bien.
    Il y a un bug dans ton code, qmake / Qt n'y est pour rien. Verifie tes allocations memoire, ton utilisation de sizeof(), etc...

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel Voir le message
    Il y a un bug dans ton code, qmake / Qt n'y est pour rien. Verifie tes allocations memoire, ton utilisation de sizeof(), etc...
    Comme il as précisé, il as besoin de modifier l'alignement pour un structure. Ce qui fait avec #pragma pack(1). Seulement, s'il ne reviens pas en arrière, la compilation va continuer avec cette alignement et Qt va planter du à un problème d'alignement.
    Il as donc bien rajouté #pragma pack() pour continuer la compilation avec le bon alignement. Ce qui as résolue sont problème.

    Pour toi le problème est ailleurs?

  5. #5
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Lol, j'avais pas vu qu'il avait solutionne lui meme son probleme (=> tagger resolu!)

    ce que je voulais dire c'est que Qt n'y est pour rien, et encore moins qmake, mais que le probleme vient de son code, meme s'il se manifeste ailleurs. Je suppose qu'il inclue sa structure toto avant d'inclure les headers Qt.

    Une autre maniere de gerer la sauvegarde/restauration du context pack est via push/pop:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #pragma pack(push, 1)
    struct toto {
       ...
    };
    #pragma pack(pop)
    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 24/06/2014, 15h39
  2. [Débutant] #pragma pack(1) en VB.net
    Par neoangelo5 dans le forum VB.NET
    Réponses: 8
    Dernier message: 09/11/2011, 16h08
  3. que signifie la directive #pragma pack(1)
    Par xweb-10 dans le forum C++
    Réponses: 6
    Dernier message: 07/11/2010, 22h28
  4. directive #pragma pack()
    Par philippe V dans le forum C++
    Réponses: 3
    Dernier message: 06/06/2005, 18h27
  5. Qu'est-ce que Packed Record ?
    Par - Robby - dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2003, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo