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 :

Accès a un tableau dans une structure


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Accès a un tableau dans une structure
    Bonjour, voici mon problème :
    Je voudrai accéder au tableau suivant dans la structure

    *****Fichier registre.h*****
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    struct Registre
    {
        int PIRval[3];
     
     
     
    };
    ****Fichier main.c*****
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "Includes/Registres.h"
     
    volatile struct Registre reg_main;
     
    int main(void)
    {
           reg_main.PIRval[1] = 0x23;
     
    };
    Mais impossible de compiler.
    Sauriez-vous m'expliquer pourquoi ?

    Merci d'avance

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Si ton compilateur ne veut pas compiler, c'est mieux de nous donner le ou les messages d'erreur pour t'expliquer pourquoi.

    Tu peux essayer de mettre 'typedef' devant 'struct' dans le .h ?

    Edition :
    *****Fichier registre.h*****
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "Includes/Registres.h"
    Erreur lors de la rédaction du message ou erreur dans le code ?

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2014
    Messages : 46
    Points : 108
    Points
    108
    Par défaut
    Effectivement sans message dur de savoir quelle est l'erreur sur laquelle on vous pointe en premier.

    A tout hasard si ce n'est pas fait, pensez à mettre un retour de valeur du même type que celui de votre fonction. Ici votre main doit renvoyer une donnée de type entier (int), il faut donc lui spécifier comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "Includes/Registres.h"
     
    volatile struct Registre reg_main;
     
    int main(void)
    {
           reg_main.PIRval[1] = 0x23;
     
           return (42);
     
    }<s>;</s>

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 62
    Points : 162
    Points
    162
    Par défaut
    Bonjour,
    Il faut aussi enlever le ';' après l'accolade fermante du main.

  5. #5
    Membre averti
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Points : 411
    Points
    411
    Par défaut
    Citation Envoyé par Omalab Voir le message
    Effectivement sans message dur de savoir quelle est l'erreur sur laquelle on vous pointe en premier.

    A tout hasard si ce n'est pas fait, pensez à mettre un retour de valeur du même type que celui de votre fonction. Ici votre main doit renvoyer une donnée de type entier (int), il faut donc lui spécifier comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "Includes/Registres.h"
     
    volatile struct Registre reg_main;
     
    int main(void)
    {
           reg_main.PIRval[1] = 0x23;
     
           return (42);
     
    }<s>;</s>
    terminer avec return 0; est la façon standard de terminer un programme en C et d'informer le système d'exploitation que le programme s'est terminé sans erreurs.

    par ailleurs, return n'étant pas une fonction, les parenthèses autour du chiffre sont inutiles.

    Comme cela a été dit, le ; à la fin de l'accolade fermante de main est à supprimer aussi.

    Cela dit, ces problèmes ne devraient pas être à l'origine d'erreurs de compilation, mais seulement d'éventuels warnings.

    Le code suivant, chez moi, compile sans erreurs ni warnings avec gcc -Wall :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    struct Registre
    {
      int PIRval[3];
    };
     
    volatile struct Registre reg_main;
     
    int main(void)
    {
      reg_main.PIRval[1] = 0x23;
     
      return 0;
    }
    S'il y a une erreur dans ta compilation de scarabdore, elle est probablement à mon sens due à la façon dont le header est inclus (faute de frappe, usage de majuscules / minuscules inapproprié, mauvais emplacement désigné), mais sans le message d'erreur, on est dans le brouillard, comme cela a été dit.

    Sinon, pourquoi définir la struct comme étant volatile ?


    Eks

  6. #6
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2014
    Messages : 46
    Points : 108
    Points
    108
    Par défaut
    Citation Envoyé par -Eks- Voir le message
    terminer avec return 0; est la façon standard de terminer un programme en C et d'informer le système d'exploitation que le programme s'est terminé sans erreurs.

    par ailleurs, return n'étant pas une fonction, les parenthèses autour du chiffre sont inutiles.

    Comme cela a été dit, le ; à la fin de l'accolade fermante de main est à supprimer aussi.
    Merci pour votre synthèse. Les parenthèses sont mises par habitude étant donné qu'il est souvent plus intéressant et rapide de renvoyer une expression plutôt qu'une variable. Elle sont ici inutiles mais je doute qu'elles puissent induire en erreur un débutant au point qu'il soit crucial de le souligner.

    En parlant de choses inutiles, les "Comme cela a été dit" sont un peu luxueux. Sur un sujet de 4 posts, l'auteur prendra certainement le temps de tous les lire, il n'y a pas de honte à faire une réponse courte pour proposer une idée .

    -Omalab

  7. #7
    Membre averti
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Points : 411
    Points
    411
    Par défaut
    Salut Omalab,

    Les parenthèses autour d'une valeur suivant l'instruction return ne sont pas plus nécessaires autour d'un littéral, qu'autour d'une expression devant être évaluée. Elles le sont éventuellement dans les éléments qui composent l'expression elle même. Par exemple, vous n'écrivez pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int n = (12 * (5 - 2));
    mais :

    Il n'y aucune raison de faire autrement avec return, qui est une simple instruction, et non une fonction.

    Quant à vos considérations sur le "luxe" de ma réponse, vous avez le droit d'avoir une opinion, et je n'épiloguerai pas.

    Je pensais plutôt faire réagir scarabdore ou le forum sur le fond de ma réponse et sur ma dernière question.

    Par exemple sur le fait que la variable soit "volatile", que le nommage évoque un registre et que le membre de la structure contienne "PIR" (qui pourrait se référer à un Pyroelectric ou Passive InfraRed sensor ou capteur PIR : un capteur détecteur de mouvement), auquel cas l'environnement auquel est destiné le programme source pourrait ne pas être un système d'exploitation, mais une carte, ce qui signifie que le prototype de main n'est peut-être pas approprié, et sans doutes un return 0; ou autre n'aurait pas de sens dans ce contexte.

    Si scarabdore veut bien s'exprimer maintenant, peut-être peut-il clarifier s'il programme pour de l'embarqué ou pas, et quel est son compilateur, outre les questions qui lui sont posées sur les messages d'erreur.


    Eks

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Je pense qu'il est bien de savoir que return n'est pas une fonction mais un mot-clé du langage / instruction et que les parenthèses sont inutiles. Ce sont ce genre de détails qui mis bout à bout donne une meilleure connaissance et donc compréhension du langage.

    Puisqu'on parle du return, renvoyer 0 quand cela ne se passe bien n'est qu'une convention (Unix ?), on renvoie ce qu'on veut. De plus, depuis C99, le compilateur rajoute automatiquement un "return 0" à la fin du main() si le développeur n'en met pas. (http://gradot.wordpress.com/2013/12/...-de-main-en-c/ --> dernier paragraphe, point 2)

  9. #9
    Membre averti
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Points : 411
    Points
    411
    Par défaut
    Merci de cette précision, je ne connaissais pas ce point de C99 concernant l'ajout implicite du return 0;

    Citation Envoyé par Bktero Voir le message
    (...)
    Puisqu'on parle du return, renvoyer 0 quand cela ne se passe bien n'est qu'une convention (Unix ?), on renvoie ce qu'on veut. De plus, depuis C99, le compilateur rajoute automatiquement un "return 0" à la fin du main() si le développeur n'en met pas. (http://gradot.wordpress.com/2013/12/...-de-main-en-c/ --> dernier paragraphe, point 2)
    A mon sens, c'est bien dans le standard depuis C89, pour ce que le standard appelle les "hosted environments" (où un système d'exploitation est présent, par opposition aux "freestanding environments"), où il est précisé en 2.1.2.2 :

    "Program termination"

    A return from the initial call to the main function is equivalent
    to calling the exit function with the value returned by the main
    function as its argument.
    et où, s'agissant de exit (qui, elle, est bien une fonction), il est précisé :
    4.10.4.3 The exit function

    Synopsis

    #include <stdlib.h>
    void exit(int status);
    (...) If the value
    of status is zero or EXIT_SUCCESS , an implementation-defined form of
    the status successful termination is returned. If the value of status
    is EXIT_FAILURE , an implementation-defined form of the status
    unsuccessful termination is returned. Otherwise the status returned
    is implementation-defined.

    Eks

  10. #10
    Candidat au Club
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Problème de compilation tableau dans structure
    Merci pour toutes vos réponses.


    Je viens de régler le problème en mettant à jour mon IDE. Maintenant tout compile sans problème.

    Merci beaucoup

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Merci de cliquer sur le bouton en bas de page dans ce cas

Discussions similaires

  1. Utilisation d'un tableau dans une structure
    Par Angelique64 dans le forum VB.NET
    Réponses: 2
    Dernier message: 27/06/2009, 11h05
  2. allocation d'un tableau dans une structure
    Par Klaine dans le forum Débuter
    Réponses: 3
    Dernier message: 02/04/2008, 23h51
  3. Problème de tableau dans une structure
    Par zarbiman dans le forum Réseau
    Réponses: 5
    Dernier message: 15/12/2007, 18h21
  4. Réponses: 6
    Dernier message: 12/09/2007, 15h58
  5. Tableau dans une structure
    Par Elstak dans le forum C
    Réponses: 3
    Dernier message: 25/04/2007, 11h45

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