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 :

Code Portable


Sujet :

C

  1. #1
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut Code Portable
    Je developpe du code C qui doit tourner sur au moins deux architectures differentes:
    - sparc/Solaris
    - x86/Linux

    Pour les problemes d'endian, j'ai recours a des macros du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #if __BYTE_ORDER == __LITTLE_ENDIAN...
       [...]
    #else ...
    Cependant, sur sparc __BYTE_ORDER n'est defini nulle part.

    Je voulais donc savoir, s'il existait un "standard" ou du moins un truc
    assez respecter, qui puisse me dire sur quelle machine/architecture
    je suis, genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #if (linux) 
    #else
    Dans ce cas ou trouver les differents types existants...

    Si quelqu'un a deja rencontre et contourne ce probleme ce serait cool...
    (ou si quelqu'un a des idees)

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Il existe un test pour connaitre la plate forme :

    #if defined(linux) : linux
    #if defined(_Windows) : Windows
    #if defined(__MSDOS__) : DOS

    Le probleme c'est que ca differencie l'OS et non la palte forme (dont depend l'endianness). De plus j'ignore le defined correspond a Solaris.

    Sinon pour svoir le type d'endianness, enregistre dans un fichier un int de valeur 1, puis lis le caracteres, si il faut 0x01 les poids faible sont en tete, si il vaut 0x00, les poids forts sont en tete. Attention toutefois cette methode fais certaines supposition en partculiers sur la taille des types et sur l'ordre des bits dans un octet, elle n'est pas totalement portable mais devrait fonctionner sur les architectures qui t'interessent.

    Pour les détails, lis les cours et tutoriels pour bien apprendre le langage C : http://c.developpez.com/cours/

  3. #3
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    En fait je voulais savoir ou ces parametres etaient definis : linux, _Windows, __MSDOS__, etc, pour pouvoir trouver le bon pour sparc.
    Est-ce qu'il sont definis par le compilateur ou dans un .h

    Mais c'est vrai que si y'a pas de vraie methode propre qui marche a tous les coups, j'utiliserais la methode dynamique.

    Rq: pour les types, en fait sont definis dans inttypes.h les variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int16_t, uint16_t ... int64_t, uint64_t
    C'est pratique pour etre sur des types sur lequels on travaille.

  4. #4
    Membre émérite

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    Points : 2 717
    Points
    2 717
    Par défaut
    Le mieux c'est de mettre les endians dans un fichier à part (Endian.h par ex) que tu vas générer AVANT la compilation par un programme/script (comme automake/autogen ou autre).

    @+ Haypo

  5. #5
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Sous Borland _Windows_ est defini dans windows.h, donc sous solaris c'est pa gagner pour trouver le correspondant. De plus si tu utilise cette methode du nom tu vas avoir des problemes avec Solaris sous x86 et Linux sous Sparc.

    La methode d'Haypo me semble etre preferable et tres facilement extensible a d'autre plateforme

  6. #6
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    bah fais des
    __sparc__
    ca marche bien.
    sinon y a __alpha__, ...

  7. #7
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Merci ! Je vais finalement faire un mix d'un peu tout : generation conditionnelle + detection dynamique.

    Finalement, apres maintes recherches et mot cles essayes sous google, j'ai trouve :
    http://predef.sourceforge.net/
    ou tous les types sont definis.

  8. #8
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Tres interessant cette page

  9. #9
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Citation Envoyé par gl
    Tres interessant cette page
    Oui, mais j'ai l'impression que ce n'est pas tout a fait, tout a fait vrai:
    je ne sais plus quel gcc j'ai d'installe, mais la macro C99 (ou le truc qui dit que c'est C99 compliant) n'est pas defini alors que __USE_ISOC99__ l'est, et cela correspond au meme

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2002
    Messages : 19
    Points : 25
    Points
    25
    Par défaut
    salut

    un de mes amis a deja fais un programme portable solaris/linux, et il a utiliser les ./configure. il ma donne un tutorial sur comment faire, mais je n'ai pas eu le temp de lire. si ca peut t'aider.

    http://www.cnedra.org/doc/form_autoconf.html#intro

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

Discussions similaires

  1. Comment rendre un code portable ?
    Par kalkuta dans le forum jQuery
    Réponses: 2
    Dernier message: 25/02/2009, 03h23
  2. DLL C++ - Code portable
    Par etranger dans le forum C++
    Réponses: 4
    Dernier message: 20/10/2007, 18h26
  3. Utilisation de 'cout' et code portable ??
    Par LaVaZza dans le forum SL & STL
    Réponses: 3
    Dernier message: 05/12/2005, 20h05
  4. Code portable pour ping
    Par SteelBox dans le forum C
    Réponses: 4
    Dernier message: 03/11/2005, 23h56
  5. [Hardware portable] Comment entrer un code Ascii?
    Par l.sage dans le forum Ordinateurs
    Réponses: 13
    Dernier message: 11/08/2005, 14h04

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