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 :

Aide allocation dynamique


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Points : 44
    Points
    44
    Par défaut Aide allocation dynamique
    Bonsoir a tous

    Avec ce code qui se trouve dans le chapitre "L'allocation dynamique" , j'ai voulu entrer les noms des Amis au lieu des ages mais ça plante a chaque fois.. avez des indices a me donner?

    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
    int main(int argc, char *argv[])
    {
        int nombreDAmis = 0, i = 0;
        int* ageAmis = NULL; 
     
     
        printf("Combien d'amis avez-vous ? ");
        scanf("%d", &nombreDAmis);
     
        if (nombreDAmis > 0) 
        {
            ageAmis = malloc(nombreDAmis * sizeof(int)); 
            if (ageAmis == NULL) 
            {
                exit(0); 
            }
     
     
            for (i = 0 ; i < nombreDAmis ; i++)
            {
                printf("Quel age a l'ami numero %d ? ", i + 1);
                scanf("%d", &ageAmis[i]);
            }
     
     
            printf("\n\nVos amis ont les ages suivants :\n");
            for (i = 0 ; i < nombreDAmis ; i++)
            {
                printf("%d ans\n", ageAmis[i]);
            }
     
     
            free(ageAmis);
        }
     
        return 0;
    }

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Tu as un problème sur les noms de tes amis et le code que tu présentes gère l'age de tes amis, pas leur nom. Montre nous le code qui gère leur nom et on t'aidera à debugger.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Points : 44
    Points
    44
    Par défaut
    Voici ce que j'ai fais avec un plantage..


    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
    int main(int argc, char *argv[])
    {
        int nombreDAmis = 0, i = 0;
        char* nomAmis = NULL;
     
     
        printf("Combien d'amis avez-vous ? ");
        scanf("%d", &nombreDAmis);
     
        if (nombreDAmis > 0)
        {
            nomAmis = malloc(nombreDAmis * sizeof(char));
            if (nomAmis == NULL)
            {
                exit(0);
            }
     
     
            for (i = 0 ; i < nombreDAmis ; i++)
            {
                printf("Quel est le nom de l'amis  %d ? ", i + 1);
                scanf("%s", nomAmis[i]);
            }
     
     
            printf("\n\nVos amis ont les noms suivants :\n");
            for (i = 0 ; i < nombreDAmis ; i++)
            {
                printf("%s\n", nomAmis[i]);
            }
     
     
            free(nomAmis);
        }
     
        return 0;
    }

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu dois utiliser autre chose que nombreDAmis comme taille maximale de la chaîne de caractères nomAmis.

    De plus, sans doute aurais-tu besoin d'un tableau de chaînes de caractères (ou d'un tableau de structures représentant tes amis)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Salut.

    Au niveau du code, quelques petites corrections :

    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
    # include <stdio.h>
    # include <stdlib.h>
     
    int main(void) /* Les paramètres de main sont inutiles => on met void à la place */
    {
        size_t nombreDAmis = 0, i = 0; /* malloc attend un paramètre du type size_t, nombreDAmis doit donc être de type size_t. On laisse aussi i de type size_t pour ne pas gêner les comparaisons avec nombreDAmis dans les test if qui suivent */
        char* nomAmis = NULL;
     
     
        printf("Combien d'amis avez-vous ? ");
        scanf("%u", &nombreDAmis);
     
        if (nombreDAmis > 0)
        {
            nomAmis = malloc (nombreDAmis * sizeof(char)); /* l'expression en paramètre est bien du type size_t maintenant */
            if (nomAmis == NULL)
            {
                exit(0);
            }
     
     
            for (i = 0 ; i < nombreDAmis ; i++)
            {
                printf("Quel est le nom de l'amis  %d ? ", i + 1);
                scanf("%s", nomAmis); /* Pas d'indice en utilisant le format %s ici : il s'agit d'une chaîne de caractère et non d'un tableau de chaîne (ce dont tu aurais peut être besoin d'ailleurs) */
            }
     
     
            printf("\n\nVos amis ont les noms suivants :\n");
            for (i = 0 ; i < nombreDAmis ; i++)
            {
                printf("%s\n", nomAmis); /* Pareil que précédemment */
            }
            free(nomAmis);
        }
     
        return 0;
    }
    Mais, cela n'aura pas le comportement attendu pour des raisons que Médinoc a souligné ...

    Cordialement,
    Idriss

  6. #6
    Membre confirmé

    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 464
    Points : 646
    Points
    646
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nomAmis = malloc(nombreDAmis * sizeof(char));
    SI on considère que "nomAmis" est la liste des noms de tes amis, alors tu n'as alloué qu'un seul caractère pour chaque nom. Il te faut réserver une chaine et non un caractère avec ta liste.

    Ne connaissant pas la taille de la chaine pour chaque nom, tu pourrait définir un type avec une "une taille suffisante" pour un nom genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef char T_NOM[50] ;
    Puis ensuite allouer l'espace suivante le nombre d'amis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    T_NOM * nomAmis ;
    nomAmis = (T_NOM *)malloc(nombreDAmis * sizeof(T_NOM));
    N'oublie pas d'initialiser le contenu de ta mémoire aussi, et lors de la saisie de limiter la lecture à la taille définie (avec fgets par exemple).
    Selso.
    Ingénieur/CdP développement systèmes embarqués &

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Points : 44
    Points
    44
    Par défaut
    Merc ia vous..

    ok.Idriss ton code source affiche 3 fois le même nom..!

  8. #8
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Re

    Citation Envoyé par lassault1 Voir le message
    ok.Idriss ton code source affiche 3 fois le même nom..!
    Ce n'est pas mon code mais le tien corrigé des quelques erreurs et warnings à la compilation (il faut lire les commentaires) ... Je t'ai indiqué en dessous que le comportement obtenu n'est pas celui que tu attendait et on t'a déjà expliqué pourquoi ...

    Là tu utilises une chaîne de caractère unique qui est re-saisie à chaque itération de la boucle for, normal que tu aies plusieurs fois le même nom. Maintenant c'est à toi de résoudre se problème, et si tu as des difficultés on sera la pour t'aider à te corriger mais on ne fait pas tout à ta place .

    Un petit rappel :

    Citation Envoyé par Médinoc Voir le message
    sans doute aurais-tu besoin d'un tableau de chaînes de caractères (ou d'un tableau de structures représentant tes amis)
    Cordialement,
    Idriss

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Points : 44
    Points
    44
    Par défaut
    Ok .. merci

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

Discussions similaires

  1. Aide aux allocations dynamiques
    Par skanino dans le forum C
    Réponses: 5
    Dernier message: 18/12/2011, 12h01
  2. petit pbm allocation dynamique de stringGrid
    Par AnneOlga dans le forum C++Builder
    Réponses: 10
    Dernier message: 17/01/2004, 11h59
  3. Allocation dynamique de structures
    Par fr_knoxville dans le forum C
    Réponses: 8
    Dernier message: 06/05/2003, 21h59
  4. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

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