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

Bibliothèques, systèmes et outils C Discussion :

Réécriture sous 64 bits de fonction bas niveau utilisant une struct FILE


Sujet :

Bibliothèques, systèmes et outils C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2017
    Messages : 7
    Par défaut Réécriture sous 64 bits de fonction bas niveau utilisant une struct FILE
    Hello,

    Une fonction a été écrite en C sous 32 bits en utilisant non pas les fonctions standards genre fgets() mais les pointeurs bas niveau sur une structure de type _FILE.
    Or il semble que ce fonctionnement ne soit plus disponible sur un environnement 64 bits. Comment réécrire la fonction suivante svp ?

    Merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    int machin(char *Buf, int Lg, FILE *Fic) {
          char *PtBuf;
          char Car;
          char *FinBuf;
     
          if (feof(Fic)) return(0);
          PtBuf = Buf;
          FinBuf = PtBuf + Lg - 1;
          do {
                if(Fic->_cnt == 0) {
                      _filbuf(Fic);
                      if(feof(Fic)) return(PtBuf - Buf);
                      if(Fic->_ptr != Fic->_base) {
                            Fic->_cnt += Fic->_ptr - Fic->_base;
                            Fic->_ptr = Fic->_base;
                      }
                }
                PtBuf[0] = Car = Fic->_ptr[0];
                Fic->_ptr ++;
                Fic->_cnt --;
                PtBuf ++;
          }
          while ((Car != '\n') && (PtBuf < FinBuf) && !feof(Fic));
          PtBuf[0] = 0;
          return(PtBuf - Buf);
    }

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Soit c'est du code interne de la bibliothèque standard, et dans ce cas, c'est déjà du travail de niveau gourou (implémenteur du langage)
    Soit c'est du code "normal", c'est à dire venant de n'importe où d'autre, et dans ce cas, la struct FILE n'a pas de définition officielle, donc, tu ne devrais pas t'en servir.

    Ma question est donc: pourquoi te retrouves-tu avec ce problème?

    Je note qu'il y a quelque chose de bizarre: l'usage de feof alors que le reste de la fonction n'utilise aucune fonction sur le fichier.
    feof se contente de regarder si le flag eof est défini dans le fic.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2017
    Messages : 7
    Par défaut
    Réponse: C'est dans une application écrite par je-ne-sais-qui en Pro*C et C pendant les années 90, et les serveurs expirent.
    Problème, on ne trouve plus que des serveurs 64 bits, et cinq programmes principaux de l'application à migrer invoquent des fonctions et des pointeurs de bas niveau qui ne fonctionnent plus en 64 bits.
    Voir : https://technet.microsoft.com/sr-lat...%28v=vs.100%29

  4. #4
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Des pointeurs « qui ne fonctionnent qu'en 32 bits », ça ne veut pas dire grand chose. Comment as-tu constaté le dysfonctionnement ? Que doit faire cette fonction ? Qu'est-ce qui empêche de la remplacer par un appel à fread ?

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2017
    Messages : 7
    Par défaut
    Le dysfonctionnement n'a pas été encore constaté, car le portage n'a pas encore eu lieu. Les renseignements préalables que je prends sur le net et ailleurs m'amènent à dire que l'on a de bonnes raisons de penser que l'écriture sous 64-bits de programmes utilisant la structure _FILE et les invocations de _ptr _base ou _cnt, ainsi que la manipulation de fichiers de plus de 2 Go vont amener des plantages et/ou des erreurs de compil.
    Me trompé-je ?
    Par ailleurs, je découvre ces programmes et n'ai pas l'information détaillée sur ce que font les fonctions en fait...

  6. #6
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Tu nous demandes comment réécrire une fonction dont tu ne connais pas le rôle.. ça risque d'être compliqué.

    FILE est une structure opaque de la bibliothèque standard. Comme l'a dit ternel tu n'es pas sensé la manipuler directement, à moins d'utiliser ta propre libc.

    Il faut nous en dire plus sur ce programme. Quel est le contexte ? S'exécute-t-il en espace utilisateur (y'a-t-il un système d'exploitation derrière) ?

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    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 398
    Par défaut
    De plus, ton code contient un appel à une fonction _filbuf(FILE*) qui n'est pas définie ici.
    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.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2017
    Messages : 7
    Par défaut
    On dirait que c'est en relation avec cet article : http://www.linuxjournal.com/article/2811
    Je poursuis mes investigations.
    On est dans une appli industrielle, mais pas système.

  9. #9
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    L'article dit "il y a le standard, mais comme ce n'est pas parfait, passent outre". Tu en paies le prix.

    Ne pas respecter le standard, c'est prendre un risque à chaque changement: au changement de système, c'est sûr, mais aussi à chaque mise à jour de n'importe quel composant non respecté. Et pire, de chaque composant logiciel se servant du composant violé.

    Imagine que tu change le fonctionnement "pour toi" d'un des membres de FILE*, il peut y avoir une bibliothèque, ailleurs, qui dépendant du fonctionnement initial.
    Paf, ca fait des bugs complètement intraçables.

    Quitte à migrer, reviens vers les fonctionnalités du standard, ou utilise une bibliothèque réputée qui fait le travail.

    En résumé: ne tolère jamais l'utilisation de comportemenst indéfinis.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2017
    Messages : 7
    Par défaut
    Oui, il semble que ce soit une réécriture de la fonction fgets() un peu gourou, on va revenir au standard.

    Sinon vous connaissez un lien vers un sujet qui traite de la question suivante svp : en ayant un exécutable, comment savoir les différents .o qui ont servi à la constitution de celui-ci après éditions de liens ?

    ldd est assez peu causant.

    Merci

Discussions similaires

  1. [XL-2003] fonction mscomm1.input utilisable une seule fois?
    Par Elfstat dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/04/2009, 13h02
  2. Réponses: 4
    Dernier message: 27/08/2007, 02h54
  3. Formatage bas niveau
    Par wareq dans le forum Composants
    Réponses: 5
    Dernier message: 09/05/2005, 16h00
  4. formatage de bas niveau ??
    Par vbcasimir dans le forum Windows XP
    Réponses: 11
    Dernier message: 06/05/2005, 18h45
  5. Programmation bas niveau de la carte vidéo !!
    Par Invité dans le forum Assembleur
    Réponses: 3
    Dernier message: 03/03/2005, 11h05

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