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 :

gestion de la memoire dynamique lors de la saisie utilisateur ?


Sujet :

C

  1. #1
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 262
    Points
    12 262
    Par défaut gestion de la memoire dynamique lors de la saisie utilisateur ?
    bonjour,

    je cherche une solution propre (j'imagine avec malloc/realloc ?)
    de gerer la memoire en meme temps que la saisie utilisateur.

    Il s'agit d'une saisie de texte.
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    main()
    {
     /* Déclarations */
     char INTRO[500];
     char *TEXTE[10];
     int I;
     /* Traitement */
     for (I=0; I<10; I++)
         {
          gets(INTRO);
          /* Réservation de la mémoire */
          TEXTE[I] = malloc(strlen(INTRO)+1);
          /* S'il y a assez de mémoire, ... */
          if (TEXTE[I])  
               /* copier la phrase à l'adresse */
               /* fournie par malloc, ...      */
               strcpy(TEXTE[I], INTRO);
          else 
              {
               /* sinon quitter le programme */
    ce genre de base mais que TEXTE et INTRO soit en allocation dynamique de memoire et non en declaration previsionnelle

    probablement en jouant de malloc/realloc ???

    comment faire merci

  2. #2
    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
    Salut,

    Pour commencer, j'ai quelques petites remarque:
    1. La fonction main, telle que tu la définis, engendre selon la norme un comportement indéfinit. En effet, main doit retourner un entier de type int et prend 0 ou 2 paramètres formels:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main(void)
        {
            return 0;
        }
        /* et */
        int main(int argc, char *argv[])
        {
            return 0;
        }
    sont les deux formes de main acceptées par la norme.
    2. Il ne faut jamais utiliser la fonction gets. Utilise à la place fgets.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgets(INTRO, sizeof INTRO, stdin);
    En ce qui concerne le tampon INTRO que tu utilise pour capturer l'entrée utilisateur, je ne crois pas qu'il n'y ait d'autre solution que de légèrement surdimensionner l'espace alloué de manière à satisfaire l'ensemble des entrées utilisateur. fgets ne considère que les sizeof INTRO -1 premiers caractères et place un caractère nul à la fin de la chaîne (cette entrée est sécurisée contre les débordements de tampon).

    En ce qui concerne le tableau TEXTE, il est tout à fait possible d'utiliser l'allocation dynamique avec malloc. Commence avec un tableau de pointeurs sur char d'une taille initiale raisonable. Lorsque ce dernier se remplit, tu peux à tout moment doubler la taille du tableau avec la fonction realloc.

    Si tu ne connais pas le nombre de chaînes de caractères à stocker dans TEXTE avant l'exécution, il est peut-être judicieux d'envisager une structure de données comme une liste chainée. En fait, la structure à utiliser ici dépend beaucoup de ce que tu désires faire ensuite avec ces données.

    Thierry

  3. #3
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 262
    Points
    12 262
    Par défaut
    Je te remercie
    c'est vrai j'avais completement oublie les structures main

    merci pour le fgets


    et je vais suivre ton conseille sur le tableau de pointeur TEXTE de petite taille (genre 16K) et le realloc(quer) si besoin..

    je pense que ca va suffir...

    en tout cas merci pour ce rafraichissement de memoire (defaillante il est vrai)...

  4. #4
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 262
    Points
    12 262
    Par défaut
    ok ça a l'air de fonctionner
    le programme a bien augmente le segment de mémoire et réagit bien en cas de débordement.

    quelques améliorations à faire mais au moins ce point la est ok.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/03/2006, 06h19
  2. [JVM]Gestion de la mémoire
    Par Crypt dans le forum Général Java
    Réponses: 20
    Dernier message: 31/12/2005, 15h33
  3. [JSP]Gestion d'un menu dynamique
    Par joebarteam88 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 16/08/2005, 13h35
  4. Gestion d'un tableau dynamique
    Par almisuifre dans le forum C++Builder
    Réponses: 5
    Dernier message: 17/02/2005, 20h07
  5. [LG]Mémoire dynamique
    Par FJUILLET dans le forum Langage
    Réponses: 5
    Dernier message: 10/02/2004, 12h15

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