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 :

Déclarer des constantes calculées


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 14
    Points : 10
    Points
    10
    Par défaut Déclarer des constantes calculées
    Bonjour,

    Débutant en C (MCC18), j'essaye de calquer ce que je fais en Pascal.
    Je veux déclarer une constante calculée.

    En pascal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Const
      NoCarte = 10;
      AdCarte = NoCarte * 4 + $100;
    En C, j'ai essayé avec Define :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      Define NoCarte 10
      Define AdCarte NoCarte * 4 + $100
    Quand j'utilise AdCarte, le calcul est refait par le code alors qu'en pascal, le calcul est fait par compilateur.

    Est-ce qu'il y a moyen de faire calculer des constantes par le compilateur C ?

    Merci

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Tu peux déclarer des constantes au lieu des macros :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const int NoCarte = 10;
    const int AdCarte = NoCarte * 4 + 100;

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Merci, mais...

    Le compilateur MCC18 me répond :

    Error 1214 : constant expression expected in initializer
    The initializer value for a statically allocated symbol must be a constant expression.


    J'ai lu sur un autre forum que ce type d'écriture, autorisé en C++, n'est pas conforme au C. Les expressions doivent être des constantes et non pas des expressions constantes.

    http://www.microchip.com/forums/tm.aspx?m=334270

    Bref, je n'arrive toujours pas à faire calculer une constante par le compilateur C.

    Bye

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par prodexys Voir le message
    Merci, mais...

    Le compilateur MCC18 me répond :

    Error 1214 : constant expression expected in initializer
    The initializer value for a statically allocated symbol must be a constant expression.


    J'ai lu sur un autre forum que ce type d'écriture, autorisé en C++, n'est pas conforme au C. Les expressions doivent être des constantes et non pas des expressions constantes.

    http://www.microchip.com/forums/tm.aspx?m=334270

    Bref, je n'arrive toujours pas à faire calculer une constante par le compilateur C.

    Bye
    Au temps pour moi....

    Une solution serait de mixer constantes et macro, mais ça n'est pas très propre ; et tu seras limité à deux niveaux. Cela dit, cela peut peut-être répondre à ton besoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define NoCarte 10
    const int AdCarte = NoCarte * 4 + 100;
    Dernière modification par Invité(e) ; 16/12/2010 à 14h20.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Points : 538
    Points
    538
    Par défaut
    Qu'est-ce qui t'empecherait de le faire sur 2 lignes?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const int AdCarte;
    AdCarte =  NoCarte * 4 + 100;
    Sinon je ne pense pas que ce soit possible de le faire comme tu le fais en Pascal.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Merci MABU,

    Géniaaaallllll...

    En tous cas, c'est bon pour moi.


    Merci

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Merci Marvin, mais je ne souhaite pas que le programme calcule mais plutôt le compilateur.

    PS : J'ai ajouté résolu dans l'intitulé du message et je me demande si c'est la bonne solution car mon [résolu] n'apparait pas comme les autres.

  8. #8
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par prodexys Voir le message
    PS : J'ai ajouté résolu dans l'intitulé du message et je me demande si c'est la bonne solution car mon [résolu] n'apparait pas comme les autres.
    Il faut cliquer sur le bouton

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 24
    Points : 34
    Points
    34
    Par défaut
    Peut-être avec un "inline" devant la déclaration de l'int à calculer....

  10. #10
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 947
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Citation Envoyé par prodexys Voir le message
    Merci Marvin, mais je ne souhaite pas que le programme calcule mais plutôt le compilateur.
    Et avec des defines, ça ne marche pas? Il me semble que tout ce qui est resolvable est résolu à la précompilation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
    #define NOCARTE (10)
    #define ADDCARTE (NOCARTE * 4 + 0x100)
     
    int main(void)
    {
        printf("%i\n", ADDCARTE);
        return 0;
    }
    A+

    Pfeuh

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Bonjour Pfeuh

    Eh bien ta contribution m'a fait comprendre autre chose. C'est surement un problème de type de données.

    Si j'écris comme Mabu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define NoCarte 1
    Const int AddCarte = ( NoCarte * 4 + 0x10);
    Alors l'instruction SSPADD=AddCarte est désasemblée comme suit :
    Avec 0x73 contient bien 0x14, ce qui me convient à peu près.

    Si j'écris avec des defines

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define NoCarte 1
    #define AddCarte ( NoCarte * 4 + 0x10);
    Alors la même instruction SSPADD=AddCarte est désassemblée comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    01EC MOVLW 0x14
    01EE SUBWF 0xFC8,W,ACCESS
    01F0 BZ    0x1F6
    01F2 MOVLW 0
    01F4 BRA   0x1F8
    01F6 MOVLW 0x1
    Le compilateur a donc bien trouvé le 0x14 tout seul mais ensuite ne stocke pas la valeur dans SSPADD. Il fait tout autre chose.

    En fait j'aurais aimé trouver :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    01EC MOVLW 0x14
    01F0 MOVWF 0xFC8
    Je pense que ce doit être lié à un type de donnée... que je ne sais pas déclarer.

    Merci à tous.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    @prodexys: Un compilo moderne sur PC (j'ai testé sous Visual Studio en mode Release) fait ça.
    Par contre, sur de l'embarqué...

  13. #13
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 947
    Points : 1 351
    Points
    1 351
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Par contre, sur de l'embarqué...
    Oui, c'est vrai que je bosse essentiellement dans l'embarqué. J'ai fait en son temps ce genre de tests sur les cibles qui en avaient besoin, mais pas sur toutes. C'est également vrai que dans l'embarqué l'optimisation en taille code et nombres de cycles est beaucoup plus poussée que pour un PC. En raison justement de la petite mémoire et la faible vitesse des cibles.

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

Discussions similaires

  1. [Toutes versions] Déclarer des constantes
    Par Sylv3D dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 11/10/2011, 05h21
  2. Déclarer des constantes
    Par Squizzy dans le forum Langage
    Réponses: 2
    Dernier message: 11/08/2009, 10h17
  3. Déclarer des constante dans le makefile
    Par Colbix dans le forum Eclipse C & C++
    Réponses: 2
    Dernier message: 09/03/2009, 17h33
  4. Réponses: 6
    Dernier message: 09/01/2009, 16h04
  5. [Tableaux] Déclarer des constantes
    Par nicoreims dans le forum Langage
    Réponses: 2
    Dernier message: 31/01/2008, 21h54

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