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 :

Structure et fonction?


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Janvier 2013
    Messages : 10
    Points : 9
    Points
    9
    Par défaut Structure et fonction?
    Bonjour à tous, je tente de bien comprendre les structures en C mais je me heurte à un petit problème c'est la raison pour laquelle je viens ici..

    Code fonctionnel :

    main.c:

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "main.h"
     
    int main(int argc, char *argv[])
    {
        Caracteristiques cara;
        char proc[] = "Intel";
        char os[] = "Windows";
        strcpy(cara.Processeur, proc);
        strcpy(cara.OS, os);
        printf("Processeur: %s\nOs: %s", cara.Processeur, cara.OS);
        return 0;
    }
    main.h:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #ifndef MAIN_H_INCLUDED
    #define MAIN_H_INCLUDED
     
    typedef struct Caracteristiques Caracteristiques;
     
    struct Caracteristiques {
        char Processeur[64];
        char OS[32];
    };
     
    #endif // MAIN_H_INCLUDED
    Lorsque je veux créer une fonction faisant exactement la même chose sa ne fonctionne pas..

    Code bugger:

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "main.h"
     
    void remplir(Caracteristiques cara, char *proc, char *os){
        strcpy(cara.Processeur, proc);
        strcpy(cara.OS, os);
    }
     
    int main(int argc, char *argv[])
    {
        Caracteristiques cara;
        char proc[] = "Intel";
        char os[] = "Windows";
        remplir(cara, proc, os);
        printf("Processeur: %s\nOs: %s", cara.Processeur, cara.OS);
        return 0;
    }
    Le main.h étant toujours le même.

    J'ai penser à mettre ma variable cara en tant que pointeur ou envoyé l'adresse mémoire à la place de la variable directement (ce qui me semble plus plausible mais le code présenté peut build au moins).

    Des idées?

    EDIT: Résolu:

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "main.h"
     
    void remplir(Caracteristiques *cara, char *proc, char *os){
        strcpy((*cara).Processeur, proc);
        strcpy((*cara).OS, os);
    }
     
    int main(int argc, char *argv[])
    {
        Caracteristiques cara;
        char proc[] = "Intel";
        char os[] = "Windows";
        remplir(&cara, proc, os);
        printf("Processeur: %s\nOs: %s", cara.Processeur, cara.OS);
        return 0;
    }
    Mais je me pose une autre question, comment faire pour déclarer ma variable cara en tant que pointeur pour ne pas envoyé d'adresse a ma fonction?
    Du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Caracteristiques *cara;
    remplir(cara, proc, os);
    Tout se passe bien jusqu'au printf ! Pourquoi le printf plante?

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

    Passer un pointeur est effectivement la solution, car tu te retrouves sinon avec une copie. Et modifier cette copie n'a aucune incidence sur l'originale.

    Pour ce qui est de ta nouvelle question, tu as deux façon de faire :
    • Ne pas utiliser de pointeur, et passer l'adresse de la variable :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      Caracteristiques cara;
      remplir(&cara, proc, os);
    • Utiliser un pointeur : il faudra alors faire attention à l'initialiser afin qu'il pointe vers une zone mémoire valide. Dans ton cas, tu ne l'as pas initialisé.
      On pourra soit le faire pointer vers l'adresse d'un objet Caracteristiques existant :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      Caracteristiques cara;
      Caracteristiques *pCara = &cara;
      remplir(pCara, proc, os);
      Ceci équivaut strictement au cas précédant.
      Soit vers une adresse allouée avec malloc :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      Caracteristiques *pCara = malloc( sizeof *pCara );
      remplir(pCara, proc, os);
      // utilisation ...
      free(pCara);  // puis libération de la mémoire allouée

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Janvier 2013
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Ta seconde solution revient au même problème au niveau du printf.. Mais merci quand même !
    La première fonctionne car "cara" est une variable et non un pointeur mais c'est 'inutile' de créer une variable et son pointeur dans le cas présent.. Il me faudrait juste un pointeur comme dans la seconde solution ! Une idée?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Je t'ai donné les trois seules formes possibles. S'il reste un problème cela vient de ton code.
    Comme je te l'ai dit, si tu souhaites utiliser un pointeur, fais-le pointer vers une zone mémoire valide qui contient soit un objet Caracteristiques déjà existant, soit de la mémoire allouée avec malloc.
    Tu ne peux pas juste déclarer un pointeur Caracteristiques *cara et espérer t'en servir comme un objet normal, il faut l'initialiser sans quoi tu pointes vers n'importe quoi.

Discussions similaires

  1. Probleme avec structures et fonctions
    Par isaac727 dans le forum Débuter
    Réponses: 2
    Dernier message: 31/03/2008, 23h01
  2. Passage d'une structure en fonction
    Par god_enel dans le forum C
    Réponses: 11
    Dernier message: 15/04/2007, 20h55
  3. structures et fonctions
    Par olivier1209 dans le forum C
    Réponses: 11
    Dernier message: 10/12/2006, 14h53
  4. Structure et fonction
    Par progfou dans le forum C
    Réponses: 7
    Dernier message: 04/07/2006, 14h23
  5. structures et fonctions
    Par kendras dans le forum C
    Réponses: 15
    Dernier message: 14/06/2006, 15h57

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