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

C Discussion :

Le problème du jour


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut Le problème du jour
    Bonjour à tous,

    Voici un petit problème qui m'arrive...
    Tout d'abord le contexte : jusque là, je travaillais sous MacOsX avec un G5. Mon application fonctionnait parfaitement (Du moins, sans bug). Pour certaines raisons, indépendantes de ma volonté, je me retrouve, toujours sous MacOsX, mais avec un iMac et un processeur Intel...

    Voilà un extrait de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    guint32 chunkSize;
    int n;
    n += fread(&chunkSize, 4, 1, file);
    if (chunkSize < 0)
    	printf ("chunkSize < 0 (%d)\n", chunkSize);
    else 
    	printf("chunkSize >= 0 (%d)\n", chunkSize);
    En gros, je parcours un fichier et lit un entier que je place dans "chunkSize". ("file" est de type FILE* et est correctement ouvert, etc...)
    guint32 est un type de la bibliothèque "GLib" (cf. http://developer.gnome.org/doc/API/2...s.html#guint32)

    Sur ma première machine (G5) tout allait parfaitement bien dans le meilleur des mondes, cependant, sur le Mac-Intel voilà ce que me retourne le "printf" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    chunkSize >= 0 (-1308622848)
    Bon, j'ai tout de suite penser à un problème big/little endian (et je pense toujours que c'est lié à cela)... Cependant, je suis perplexe sur l'affichage du printf : Le programme détecte que chunkSize est positif, cependant à l'affichage il est négatif...

    Qu'en pensez-vous ?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour moi, un guint32 n'est jamais négatif... Je suis surpris que ton compilateur ne t'ait pas donné de warning...
    Donc, oui, c'est bien un problème d'endianness.

    Par chance, les fichiers existants sont enregistrés en BigEndian, ce qui est le format dit "réseau". Tu peux donc corriger le code pour employer les fonctions htonl() avant écriture et ntohl() après lecture.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut
    Ok, merci. Je vais voir cela.
    J'oubliais de préciser une petite chose : le fichier que j'essaie de lire sur le Mac-Intel a été écrit sur le G5...

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Heureusement.
    Dans l'autre sens, le fichier serait en Little-Endian et ce serait plus compliqué à corriger.

    En modifiant le programme, le format du fichier ne changera pas, et la lecture sera adaptée aux deux plate-formes.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Médinoc
    Heureusement.
    Dans l'autre sens, le fichier serait en Little-Endian et ce serait plus compliqué à corriger.

    En modifiant le programme, le format du fichier ne changera pas, et la lecture sera adaptée aux deux plate-formes.
    L'endiannes est une chose, la largeur des types pourrait en être une autre... La compatibilité des données binaires ne se règle pas aussi simplement que ça.

    Soit on utilise un format indépendant comme BER ou XDR, par exemple (euh, bon courage...), soit on passe en mode texte (ASCII, par exemple), ce qui est le plus simple.

  6. #6
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 868
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 868
    Par défaut
    Salut,

    Ton printf en %d n'interprete-t-il pas ta valeur comme une valeur signée ?
    Ne faudrait-il pas utiliser %u ?

    A+

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,
    Citation Envoyé par Fabllot
    Voilà un extrait de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    guint32 chunkSize;
    int n;
    n += fread(&chunkSize, 4, 1, file);
    ...
    Qu'en pensez-vous ?
    J'en pense que tu as eu de la chance que ça marche jusqu'à présent

    Tu ajoutes une valeur à une variable non initialisée, et tu utilises le résultat sans te poser de question.

    Un de mes élèves écrirait ça, il se ferait taper sur les doigts (symboliquement, bien sûr)

  8. #8
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Citation Envoyé par thewho
    Un de mes élèves écrirait ça, il se ferait taper sur les doigts (symboliquement, bien sûr)
    Pourquoi symboliquement ?
    J'avais un prof de maths qui nous disait (en plaisantant bien sûr) :
    Citation Envoyé par le prof de maths psychopathe
    Je vais faire entrer ça dans vos têtes à coups de batte de baseball !
    Ca marchait bien comme technique !

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par le prof de maths psychopathe
    Je vais faire entrer ça dans vos têtes à coups de batte de baseball !

  10. #10
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut
    Citation Envoyé par thewho
    J'en pense que tu as eu de la chance que ça marche jusqu'à présent
    Tu ajoutes une valeur à une variable non initialisée, et tu utilises le résultat sans te poser de question.
    En fait, j'ai réduit le code au minimum pour se concentrer sur le problème BE / LE ... La valeur de "n" est bien initialisé dans mon code...

    Citation Envoyé par mujigka
    Puisque tu utilises la glib, il existe la macro GUINT32_SWAP_LE_BE() (voir http://developer.gnome.org/doc/API/2...WAP-LE-BE:CAPS) permet de réaliser la conversion little-endian/big-endian dans les deux sens. Comme guint32 est conçu pour être portable, je pense que tu devrais parvenir à résoudre tes problèmes avec la doc. Bonne chance!
    Merci pour cette info, cela me parait interressant. Je vais y regarder de plus près.

    Merci à tous pour vos remarques.

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

Discussions similaires

  1. [Calendar] Problème de jour précédent
    Par Amara dans le forum Collection et Stream
    Réponses: 12
    Dernier message: 03/07/2006, 10h54
  2. Réponses: 6
    Dernier message: 29/05/2006, 14h22
  3. Problème mise à jour onglet
    Par auriolbeach dans le forum Access
    Réponses: 1
    Dernier message: 25/12/2005, 13h10
  4. Problème mise à jour vers IE6 sous W2K
    Par lio33 dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 11/10/2005, 11h51
  5. [HTML] Problème mise à jour des fichiers en cache
    Par El Riiico dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 05/09/2005, 17h00

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