Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1223 connectés 

  FORUM HardWare.fr
  Programmation
  C

  L'allocation dynamique

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

L'allocation dynamique

n°1986429
lassault1
Posté le 21-04-2010 à 22:37:09  profilanswer
 

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 :
  1. int main(int argc, char *argv[])
  2. {
  3.     int nombreDAmis = 0, i = 0;
  4.     int* ageAmis = NULL;
  5.     printf("Combien d'amis avez-vous ? " );
  6.     scanf("%d", &nombreDAmis);
  7.     if (nombreDAmis > 0)
  8.     {
  9.         ageAmis = malloc(nombreDAmis * sizeof(int));
  10.         if (ageAmis == NULL)
  11.         {
  12.             exit(0);
  13.         }
  14.      
  15.         for (i = 0 ; i < nombreDAmis ; i++)
  16.         {
  17.             printf("Quel age a l'ami numero %d ? ", i + 1);
  18.             scanf("%d", &ageAmis[i]);
  19.         }
  20.    
  21.         printf("\n\nVos amis ont les ages suivants :\n" );
  22.         for (i = 0 ; i < nombreDAmis ; i++)
  23.         {
  24.             printf("%d ans\n", ageAmis[i]);
  25.         }
  26.      
  27.         free(ageAmis);
  28.     }
  29.     return 0;
  30. }

mood
Publicité
Posté le 21-04-2010 à 22:37:09  profilanswer
 

n°1986435
skurlat
Posté le 21-04-2010 à 23:33:09  profilanswer
 

Si mes souvenirs sont bons :
 
ageAmis est tout simplement de type int, hors le nom de tes amis est une chaine de caractères, donc forcément ca marche pas top :D
 
[EDIT] En réalité ageAmis est un pointeur vers un tableau d'entiers et non pas un entier.
 
Enfin certains te l'expliqueront mieux que moi, ca commence à dater de mon côté (sans avoir été très poussé en plus  :D )

Message cité 1 fois
Message édité par skurlat le 21-04-2010 à 23:35:11
n°1986444
fchack
Posté le 22-04-2010 à 01:01:25  profilanswer
 

lassault1 a écrit :

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?


bien sûr que ton code actuelle ne marchera pas si tu saisi des noms a la places d'ages.
pour avoir plusieurs noms tu dois (par exemple) allouer une matrice. tu met donc un nom par ligne.
 
le code peut donc devenir quelque chose comme :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define TAILLE_MAX_NOM 20
  4. int main(int argc, char  *argv[])
  5. {
  6.     int nombreDAmis = 0, i = 0;
  7.     char** ageAmis = NULL;
  8.     printf("Combien d'amis avez-vous ? " );
  9.     scanf("%d", &nombreDAmis);
  10.     if (nombreDAmis > 0)
  11.     {
  12.         /* Allocation matrice ==> allocation vecteur de
  13.            nombreDAmis cases, puis pour chaque case
  14.            allocation d'un vecteur de TAILLE_MAX_NOM cases */
  15.         ageAmis = malloc(nombreDAmis * sizeof (char*));
  16.         for (i = 0; i < nombreDAmis; i++)
  17.             ageAmis[i] = malloc (sizeof (char) * TAILLE_MAX_NOM);
  18.         if (ageAmis == NULL)
  19.         {
  20.             exit(0);
  21.         }
  22.         for (i = 0 ; i < nombreDAmis ; i++)
  23.         {
  24.             printf("Quel age a l'ami numero %d ? ", i + 1);
  25.             scanf("%s", ageAmis[i]);
  26.         }
  27.         printf("\n\nVos amis ont les ages suivants :\n" );
  28.         for (i = 0 ; i < nombreDAmis ; i++)
  29.         {
  30.             printf("%s\n", ageAmis[i]);
  31.         }
  32.         free(ageAmis);
  33.         /* Liberer l'espace de la matrice alloue */
  34.         for (i = 0; i < nombreDAmis; i++)
  35.             free(ageAmis[i]), ageAmis[i] = NULL;
  36.         free(ageAmis), ageAmis = NULL;
  37.     }
  38.     return 0;
  39. }


 

skurlat a écrit :

ageAmis est tout simplement de type int


ageAmis est de type int* ;)

n°1986584
lassault1
Posté le 22-04-2010 à 12:02:29  profilanswer
 

merci..
 
Ce que je comprends pas c'est que pour chaque élément du tableau ( ageAmis[i])  qui ont un octet chacun tu alloue de 20 octets ...!
 
Est ce possible pour un élément de 1 octet d'allouer 20 octets ??

n°1986648
rufo
Pas me confondre avec Lycos!
Posté le 22-04-2010 à 14:15:36  profilanswer
 

ageAmis[] n'est pas 1 octet mais un tableau de pointeurs pointant vers des chaînes de caractères. Du reste, le nom ageAmis est mal choisi puisqu'il contient non plus des âges mes des noms :/
 
lassault1, ça fait je sais pas combien de topics sur le C que tu ouvres pour poser des questions franchement trivial dès lors qu'on a pris le temps de lire un bon bouquin sur le C. Alors tu voudrais nous lâcher un peu et passer qq jours à lire ton bouquin sur le C, faire des exo et quand tu commencera à faire des programmes, revenir ici pour nous poser de vraies questions? Surtout que sur internet, y'a quand même beaucoup de site qui donne les bases sur le C, donc largement de quoi t'aider à répondre à tes questions. Le C, c'est pas évident quand on débute (et même après :D), mais là, je trouve que tu fais pas beaucoup d'efforts pour comprendre par toi-même. Tu me fais penser à qq étudiants de ma classe quand j'étais à l'IUT et qui disaient toujours "De toute manière, je comprends rien au c!" sans avoir ouvert leur cours ou avoir cherché à comprendre qq minutes.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°1986675
gilou
Modérateur
Modzilla
Posté le 22-04-2010 à 15:14:32  profilanswer
 

Citation :

ageAmis = malloc(nombreDAmis * sizeof(int));


La tu alloues de la place pour nombreDAmis entiers, place que tu remplis ici:
         for (i = 0 ; i < nombreDAmis ; i++)
         {
             printf("Quel age a l'ami numero %d ? ", i + 1);
             scanf("%s", ageAmis[i]);
         }
Comme tu as alloué un pointeur, tu aurais aussi pu faire:
int *p = ageAmis; // p pointe sur la même zone que ageAmis
         for (i = 0 ; i < nombreDAmis ; i++)
         {
             printf("Quel age a l'ami numero %d ? ", i + 1);
             scanf("%s", p++);
         }
Tu comprends bien que des chaines de caractères, c'est en général bien plus grand que des entiers. Ca va donc pas avoir assez de place pour tenir dans la place que tu avais alloué pour les entiers.
 

Citation :

Ce que je comprends pas c'est que pour chaque élément du tableau ( ageAmis[i])  qui ont un octet chacun tu alloue de 20 octets


Il a écrit:
ageAmis = malloc(nombreDAmis * sizeof  (char*));
Donc la il alloue un pointeur sur nombreDAmis char*, c'est a dire qu'il alloue de la place mémoire pour nombreDAmis pointeurs sur des chaines de caractères, qui vont être les noms.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1986756
lassault1
Posté le 22-04-2010 à 17:51:35  profilanswer
 

rufo c'est pas gentil ce que tu dis... car je suis sur le forum pour progresser..

 

J'ai jamais dis que ageAmis[] est un octet...  j'ai plutôt dis que ageAmis[i] est un octet car c'est une variable de type char....

Message cité 1 fois
Message édité par lassault1 le 22-04-2010 à 18:25:14
n°1986793
gilou
Modérateur
Modzilla
Posté le 22-04-2010 à 18:51:59  profilanswer
 

Si tu lisais ce que je t'ai mis en gras, tu saurais que c'est une variable de type char*
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1986879
fchack
Posté le 23-04-2010 à 02:29:08  profilanswer
 

rufo a écrit :

Tu me fais penser à qq étudiants de ma classe quand j'étais à l'IUT et qui disaient toujours "De toute manière, je comprends rien au c!" sans avoir ouvert leur cours ou avoir cherché à comprendre qq minutes.


question à part: juste par curiosité, je peux savoir quel IUT de quel université de quel formation stp ? :p

n°1986880
fchack
Posté le 23-04-2010 à 02:41:13  profilanswer
 

lassault1 a écrit :

J'ai jamais dis que ageAmis[] est un octet...  j'ai plutôt dis que ageAmis[i] est un octet car c'est une variable de type char....


on vas parler avec des mots simplifier pour que tu comprenne.
ageAmis[i] est de type char* pas char. c'est un pointeur vers une chaine de caractère.
ce que je t'ai mis dans le code, c'est une allocation d'un tableau de pointeurs:
ageAmis = malloc(nombreDAmis * sizeof  (char*));
chaque case du tableau c'est a dire chaque pointeur (qui est de type char* et qui est donc de taille sizeof(char*)) pointe vers une chaine de caractère de taille 20*sizeof (char) donc "disons" 20 octet ...

 
lassault1 a écrit :

Ce que je comprends pas c'est que pour chaque élément du tableau ( ageAmis[i])  qui ont un octet chacun tu alloue de 20 octets ...!
Est ce possible pour un élément de 1 octet d'allouer 20 octets ??


il faut dire plutôt que "chaque élément du tableau (ageAmis[i]) pointe vers une chaine de 20 octets" c'est a dire qu'il contiens l'adresse de début de la chaine; et pour ça sizeof(char*) est suffisant (la taille alloué pour chaque élément du tableau).

 

c'est une façon simple pour allouer de l'espace pour une matrice, dynamiquement ... après faut bien connaitre les bases (notamment les pointeurs) pour mieux comprendre

 


Message édité par fchack le 23-04-2010 à 02:50:46
mood
Publicité
Posté le 23-04-2010 à 02:41:13  profilanswer
 

n°1986904
rufo
Pas me confondre avec Lycos!
Posté le 23-04-2010 à 09:52:31  profilanswer
 

fchack a écrit :


question à part: juste par curiosité, je peux savoir quel IUT de quel université de quel formation stp ? :p


 
IUT GEII à Tours de 1997 à 1999.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  L'allocation dynamique

 

Sujets relatifs
Variables dynamiqueAccès dynamique à une classe pour appeler .... une méthode statique
[RESOLU] Requete SQL avec variable dynamique sous MS-DOS[PHP / SQL] Conception Menu Dynamique a sous Categories Variables
Faire un tableau en parsant des chaines issues de pages HTML dynamiqueCarte dynamique ( clip dans clip )
Apparition d'élément de menu déroulant dynamique[JSF] Navigation dynamique
Extrusion dynamique selon un texte FLASH CS4liste chainée et tableau dynamique
Plus de sujets relatifs à : L'allocation dynamique


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR