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 :

structure globale en début de code


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Invalidité
    Inscrit en
    mai 2019
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Invalidité

    Informations forums :
    Inscription : mai 2019
    Messages : 69
    Points : 20
    Points
    20
    Par défaut structure globale en début de code
    Bonjour ,
    J'ai un peu de mal a suivre le cheminement de ce code avec cette declaration de structure globale en debut de code . A vrai dire , je pige que dalle .. Dans quelle situation , il est intéréssant , peut etre meme indispensable de procéder ainsi ?

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    #define SIZE 5
     
    struct bot {
        int xpos;
        int ypos;
    };
     
    struct bot initialize(struct bot b);
     
    int main()
    {
        struct bot robots[SIZE];
        int x;
     
        srand((unsigned)time(NULL));
     
        for(x=0;x<SIZE;x++)
        {
            robots[x] = initialize(robots[x]);
            printf("Robot %d: Coordinates: %d,%d\n",
                    x+1,robots[x].xpos,robots[x].ypos);
        }
        return(0);
    }
     
    struct bot initialize(struct bot b)
    {
        int x,y;
     
        x = rand();
        y = rand();
        x%=20;
        y%=20;
        b.xpos = x;
        b.ypos = y;
        return(b);
    }
    Je crois que la fonction srand((unsigned)time(NULL)); permet d'obtenir un nombre aleatoire en se basant sur l'horloge et que : %= divise deux valeurs et stocke le reste dans la variable , mais pour le reste..

  2. #2
    Expert éminent
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    mai 2010
    Messages
    2 712
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : mai 2010
    Messages : 2 712
    Points : 8 321
    Points
    8 321
    Par défaut
    Tu es toujours obligé de déclarer tes structures en globale , mais en général en le met dans un .h
    Et aussi ce genre de code ne se fait jamais , 99% des codes en C utiliser le typedef avec les structures.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Invalidité
    Inscrit en
    mai 2019
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Invalidité

    Informations forums :
    Inscription : mai 2019
    Messages : 69
    Points : 20
    Points
    20
    Par défaut
    Ok merci . Il n'y a pas une fonction qui renvoie une structure dans ce code a un moment donné ?

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    ...
    Inscrit en
    juin 2009
    Messages
    4 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : ...

    Informations forums :
    Inscription : juin 2009
    Messages : 4 282
    Points : 12 760
    Points
    12 760
    Billets dans le blog
    1
    Par défaut
    struct bot initialize(struct bot b) { ... } ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Invalidité
    Inscrit en
    mai 2019
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Invalidité

    Informations forums :
    Inscription : mai 2019
    Messages : 69
    Points : 20
    Points
    20
    Par défaut
    Ha bon ?? Il y a le mot clé struct devant pourtant ! C'est une structure ou une fonction ?😯😕

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    février 2008
    Messages
    2 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : février 2008
    Messages : 2 098
    Points : 4 084
    Points
    4 084
    Billets dans le blog
    4
    Par défaut
    La fonction porte le nom initialize(); et renvoie une donnée de type struct bot.

    L'utilisation de typedef permet de reposer nos petits cerveaux dans ce cas là.

    Si tu déclares ta structure de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct {
        int xpos;
        int ypos;
    }s_bot;
    Tu peux ensuite écrire le prototype de la fonction comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s_bot initialize(s_bot b);
    Cette fois-ci tu ne te poses plus là question .
    Utilisation de Glade avec Gtk+ - N'oubliez pas de consulter les FAQ Gtk et les cours et tutoriels Gtk

  7. #7
    Membre à l'essai
    Homme Profil pro
    Invalidité
    Inscrit en
    mai 2019
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Invalidité

    Informations forums :
    Inscription : mai 2019
    Messages : 69
    Points : 20
    Points
    20
    Par défaut
    Ok . Donc ce type de fonction par rapport a une fonction classique permet d'utiliser des types de variable different ?

  8. #8
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    février 2008
    Messages
    2 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : février 2008
    Messages : 2 098
    Points : 4 084
    Points
    4 084
    Billets dans le blog
    4
    Par défaut
    Il n'y a pas à proprement parlé différents types de fonctions. Elles ont toutes la même syntaxe : "objet renvoyé" "nom de la fonction" "(paramètres transmis)".

    Certains diront qu'il existe deux types. l'un ne renvoyant rien (void) et l'autre renvoyant un objet.

    Donc, pour répondre directement, oui si ca te permet de comprendre qu'il est possible de créer de nouveaux types en C grâce aux structures et à typedef.
    Utilisation de Glade avec Gtk+ - N'oubliez pas de consulter les FAQ Gtk et les cours et tutoriels Gtk

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    ...
    Inscrit en
    juin 2009
    Messages
    4 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : ...

    Informations forums :
    Inscription : juin 2009
    Messages : 4 282
    Points : 12 760
    Points
    12 760
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par chris7522 Voir le message
    Ha bon ?? Il y a le mot clé struct devant pourtant ! C'est une structure ou une fonction ?😯😕
    Quand je vois ce genre de question, je pense qu'il faudrait ouvrir un cours de C et réviser les bases :
    - qu'est ce qu'une fonction
    - qu'est qu'une structure
    - comment créer et utiliser son propre type
    - à quoi sert typedef


  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    juin 2010
    Messages
    6 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 6 150
    Points : 27 442
    Points
    27 442
    Billets dans le blog
    2
    Par défaut
    Tu es en C, le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct bot {
        int xpos;
        int ypos;
    };
    déclare un type struct bot et non bot.
    Dans ce code bot n'existe pas. Si tu essayes d'utiliser bot, le compilateur te le rappelera.

    Si tu veux un type bot, la syntaxe serait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct /*bot*/ {
        int xpos;
        int ypos;
    } bot;
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Invalidité
    Inscrit en
    mai 2019
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Invalidité

    Informations forums :
    Inscription : mai 2019
    Messages : 69
    Points : 20
    Points
    20
    Par défaut
    Bien compris . Je vais reprendre les chapitres précédent. Le forgeron n'a pas encore assez forgé ou il n'a pas les bons outils ☺

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    7 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 7 692
    Points : 21 867
    Points
    21 867
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Kannagi Voir le message
    Tu es toujours obligé de déclarer tes structures en globale
    Pas toujours. Certes une structure qui est utilisée dans tout le programme (ce qui est très souvent le cas) sera alors déclarée globalement mais il m'est arrivé, pour un travail local dans une fonction, de déclarer une structure dédiée à ce travail dans la fonction.
    En fait, comme pour les variables, les déclarations de structures et de type permettent aussi de se faire en local...

    Citation Envoyé par chris7522 Voir le message
    Dans quelle situation , il est intéréssant , peut etre meme indispensable de procéder ainsi ?
    Chaque fois que tu devras manipuler des données hétérogènes de façon simultanée. Si par exemple tu dois stocker un nom+prénom, tu auras tout avantage à regrouper le nom et prénom ensemble dans une structure.
    Alors je sais que c'est chiant. On a envie de vite coder pour arriver au résultat et faut d'abord se coltiner l'écriture de la structure. Et je t'assure que même pour moi ça reste tout autant chiant aujourd'hui qu'au premier jour (la seule différence c'est qu'ensuite quand je me suis motivé, l'écriture de la structure va très vite).
    Mais ça offre plusieurs avantages
    • tu veux passer le nom et prénom à une fonction, tu ne passes qu'un truc (la structure) et non deux
    • demain tu veux rajouter un age, tu le rajoutes à un seul endroit (la structure) et tu recompiles => tout ce qui utilise la structure y aura alors instantanément accès

    Bref c'est du travail chiant au début mais qui t'offre ensuite une rapidité de développement et d'évolution.

    Citation Envoyé par chris7522 Voir le message
    Je crois que la fonction srand((unsigned)time(NULL)); permet d'obtenir un nombre aleatoire en se basant sur l'horloge
    Pas exactement. Ca initialise le générateur aléatoire. Et ça l'initialise effectivement sur l'horloge machine. Ainsi, tu es sûr qu'en exécutant ton programme à différent moments, tu auras des nombres aléatoires différents. Et inversement tu peux très bien l'initialiser sur une valeur fixe si tu veux (dans le cadre de tests spécifiques) avoir toujours la même suite de nombres qui sort.
    Accessoirement moi je préconise srand(time(NULL) ^ getpid()). Le pid est ton numéro de processus. Comme la fonction time() est calée à la seconde, si ton code est lancé plusieurs fois en même temps (Unix/Linux est multitaches) l'initialisation basée sur cette unique fonction sera la même. En combinant la valeur du temps machine sur le pid (toujours différent à chaque processus), tu es certain d'avoir toujours une graine différente dans toutes les situations

    Citation Envoyé par chris7522 Voir le message
    et que : %= divise deux valeurs et stocke le reste dans la variable
    Règles des opérateurs avec affectation (niveau basique). x op= y est un raccourci équivalent à x=x op y. Avec "op" pouvant valoir n'importe quel opérateur binaire du C, à savoir "+-*/%&|^".
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  13. #13
    Membre à l'essai
    Homme Profil pro
    Invalidité
    Inscrit en
    mai 2019
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Invalidité

    Informations forums :
    Inscription : mai 2019
    Messages : 69
    Points : 20
    Points
    20
    Par défaut
    Merci beaucoup de ton aide .

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

Discussions similaires

  1. structure global : multiple definition
    Par darkhades dans le forum C
    Réponses: 3
    Dernier message: 12/05/2012, 19h37
  2. Récupérer structure d'entité dans le code
    Par julien_fauquereau dans le forum Entity Framework
    Réponses: 4
    Dernier message: 15/06/2011, 20h24
  3. Besoin d'un début de code pour entrevoir l'avenir.
    Par metadon dans le forum VB.NET
    Réponses: 7
    Dernier message: 08/04/2011, 09h42
  4. Réponses: 4
    Dernier message: 30/09/2010, 23h58
  5. Imprimer la structure d'une base sans code vba
    Par steph141 dans le forum Access
    Réponses: 2
    Dernier message: 06/04/2006, 23h30

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