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 :

Un de mes premiers programme : Quelques questions...


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 42
    Points
    42
    Par défaut Un de mes premiers programme : Quelques questions...
    Tout d'abord bonsoir à tous,
    voilà je viens de commencer le c en cours, j'ai un petit peu de mal mais j'ai réussi à faire le début de programme suivant sur lequel j'aurai quelques questions.

    Ce programme permet d'enregistrer 4 score (mi temps, fin du match, prolongations et pénaltes)

    Je souhaite garder ma structure utiliser pour le type Score.

    Le programme est en pièce jointe.

    Voici mes différentes questions :

    Tout d'abord que puis je faire de mieu, niveau syntaxe ? propreté ?

    Ensuite, je trouve cela bizarre de devoir faire 4 malloc dans lireScore(), peux t'on mieux faire ?

    Suis je sur que cela va marcher à chaque fois ? Je m'explique, j'ai copié l'adresse que pointe s dans s1 afin de sauvegarder le pointeur sur le premier score, mais est-il possible que les malloc me remettent s sur une nouvelle adresse mémoire, du coup s1 ne pointerai plus sur rien de cohérent ?


    Merci d'avance pour toutes vos réponses.
    Fichiers attachés Fichiers attachés
    • Type de fichier : c tp7.c (1,2 Ko, 80 affichages)

  2. #2
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 306
    Points
    5 306
    Par défaut
    Salut,


    Pourquoi faire 4 allocations quand tu peux gérer un tableau de score ?
    De plus, tu alloues de la mémoire sans jamais la libérer...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 42
    Points
    42
    Par défaut
    En fait, comme je l'ai dit dans mon premier sujet je souhaite utiliser le type Score comme il est défini, je ne peux donc pas utiliser de tableau.

  4. #4
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Points : 1 381
    Points
    1 381
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (s -> suivant) = (score*) malloc (sizeof(score));
    Il est inutile (et même déconseillé) de caster un malloc : http://www.cprogramming.com/faq/cgi-...&id=1043284351

  5. #5
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 306
    Points
    5 306
    Par défaut
    T'es vraiment obligé de gérer tes scores via une liste chainée ?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 42
    Points
    42
    Par défaut
    Oui je suis obligé, en fait là il n'y a qu'une ébauche de ce que je veux faire, je souhaite que l'on ne soit pas obligé ensuite de rentrer tous les scores, par exemple si le match se fini sans prolongations, je ne souhaite pas stocker les scores de la prolongations.

    J'ai une autre question, j'ai entendu parler de realloc ? cette fonction me serait t'elle pas plus utile ?

    merci

  7. #7
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Points : 1 381
    Points
    1 381
    Par défaut
    Un realloc permet de reallouer de la mémoire déja allouée à une taille différente. Ça ne correspond pas à ton problème puisque tu n'as pas besoin de changer la taille de ta structure : c'est toujours 2 entiers.
    Il y a un grave problème qu'il faut que tu règles dans ton programme c'est que tu ne libères pas la mémoire après tes allocations -> fuite mémoire.
    Pour bien faire, un malloc / calloc / realloc devrait toujours être suivi d'un free (après exploitation de la mémoire allouée évidemment), un peu comme le mécanisme des parenthèses ouvrantes et fermantes.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 42
    Points
    42
    Par défaut
    Merci de ta réponse,

    à quel moment dois je libérer la mémoire parce que je ne comprends pas si le la libère, mes données vont être perdues non ?

    merci

  9. #9
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par allezlolo Voir le message
    Merci de ta réponse,

    à quel moment dois je libérer la mémoire parce que je ne comprends pas si le la libère, mes données vont être perdues non ?

    merci
    Tu libères ta mémoire dès que tu n'en as plus utilité ou au plus tard avant la fin du programme ou avant que le pointeur dans lequel est stocké l'adresse du bloque alloué soit hors de portée.

    Thierry

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 42
    Points
    42
    Par défaut
    D'accord merci pour vos réponses

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 42
    Points
    42
    Par défaut
    Je galère sur une autre question, j'ai le type suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct equipe {
      char *nom;
      char* tab[24];
    }equipe;
    Je souhaite enregistrer le nom de mon équipe dans nom et le nom du coach dans tab[0] que dois mettre ? J'ai essayé de nombreuses solutions sans m'en sortir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void lireEquipe(equipe *e) {
      printf ("Entrez le nom de l'équipe : ");
      //  (e -> nom) = (char*) malloc (sizeof(char)*50);
      scanf ("%s",(e->(&nom)));
      // printf ("Entrez le nom du coach : ");
      // scanf ("%s",&(e -> tab[0]));
    }
    Je retrouve toujours une segmentation fault (core dumped)

    merci d'avance

  12. #12
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    C'est:

    Mais e->nom n'est qu'un pointeur. Il faut allouer la mémoire avant de réaliser cette saisie. Pourquoi as-tu commenté l'allocation? Par ailleurs, scanf() n'est pas vraiment la fonction la plus adaptée pour réaliser proprement une saisie utilisateur de chaîne de caractères.

    Thierry

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 42
    Points
    42
    Par défaut
    J'ai déjà essayé ce bout de code, en remplaçant j'ai donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void lireEquipe(equipe *e) {
      printf ("Entrez le nom de l'équipe : ");
      (e -> nom) = (char*) malloc (sizeof(char)*50);
      scanf ("%s",(e->nom));
      // printf ("Entrez le nom du coach : ");
      // scanf ("%s",&(e -> tab[0]));
    }
    Et toujours la même erreur...

    Que me conseille tu à part scanf ?

    Merci beaucoup

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 42
    Points
    42
    Par défaut
    petite précision, voici mon main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main() {
       equipe *e;
       e =  (equipe*) malloc (sizeof(equipe));
       lireEquipe(e);  
    }

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 42
    Points
    42
    Par défaut
    c'est bon c'est résolu merci à tous

  16. #16
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par allezlolo Voir le message
    J'ai déjà essayé ce bout de code, en remplaçant j'ai donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void lireEquipe(equipe *e) {
      printf ("Entrez le nom de l'équipe : ");
      (e -> nom) = (char*) malloc (sizeof(char)*50);
      scanf ("%s",(e->nom));
      // printf ("Entrez le nom du coach : ");
      // scanf ("%s",&(e -> tab[0]));
    }
    Et toujours la même erreur...

    Que me conseille tu à part scanf ?

    Merci beaucoup
    Pour la saisie de chaines, remplace scanf() par fgets() ou au minimum, indique le nombre de caractères max à saisir dans la chaine de format:

    Par ailleur, attention également à la façon dont tu utilises malloc(). Il faut toujours vérifier que malloc() retourne une adresse différente de NULL. 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
    void lireEquipe(equipe *e) 
    {
        printf ("Entrez le nom de l'équipe : ");
        /* -tc- Purge le tampon de stdout et force l'affichage de l'invite */
        fflush(stdout);
        /* -tc- Pourquoi utilises-tu toujours des parentheses autour de e->nom.
            Par ailleurs, il est idiomatique de ne pas caster la valeur de retour de
            malloc() en C. */
        /* -tc- Finalement, sizeof (char) vaut 1 par definition. Il n'est pas utile ici */
        e -> nom = malloc (sizeof *e->nom *50);
        /* -tc- On verifie donc la validite de la valeur retournee par malloc() */
        if (e->nom != NULL)
        {
            int c;
     
            scanf ("%49s", (e->nom));
            /* -tc- A ce stade, il faut encore purger le tampon du flux d'entree
                standard qui contient au moins le caractere '\n' */
            while ((c = getchar()) != '\n' && c != EOF)
            {
            }
        }
    }
    Thierry

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

Discussions similaires

  1. quelqu'un pour m'aider à faire mes premiers pas en programmation?
    Par Invité dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 23/03/2017, 18h34
  2. [AC-2003] Ma premiere base, mes premieres questions
    Par Greg12345 dans le forum Modélisation
    Réponses: 2
    Dernier message: 05/07/2009, 16h26
  3. Quelques questions pour mes études
    Par Logdan dans le forum Etudes
    Réponses: 7
    Dernier message: 25/11/2008, 16h30
  4. Quelques question sur la validité de mes requetes :
    Par Clad3 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 07/12/2005, 16h09
  5. [Debutant]Premier programme blemes+ questions
    Par Bakura dans le forum Débuter
    Réponses: 21
    Dernier message: 07/10/2005, 18h26

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