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 :

Création d'une pile sans pointeurs


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 4
    Points : 7
    Points
    7
    Par défaut Création d'une pile sans pointeurs
    Salut a tous,

    voila j'essaie de créer une pile mais qui fonctionne sans pointeur (i.e un bête tableau dans lequel je pourrais mettre ou enlever des éléments).

    Malheureusement je n'arrive pas a copier une chaine de caractère dans ma pile,(cela m'affiche n'importe quoi genre des ?,[],%µ, etc...)
    quelqu'un peut-il m'aider?


    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
     
    struct pile{
      int taille;
      char tableauPile[64];
    };
     
     
    void initialiser (struct pile unepile){
      unepile.taille = 0;
     
    }
     
    void empiler (struct pile unepile, char unchar[]){
      int i;
      for (i=1; unchar[i] !='\0' ; i++){
      unepile.tableauPile[i] = unchar[i];
      unepile.taille ++;
         }
      unepile.tableauPile[i] = '\0';
    }
     
     
    void afficherPile (struct pile unepile){
      int i;
      for (i=1;i<=unepile.taille;i++){
        printf ("%c", unepile.tableauPile[i]);
     
      }
     
    }
     
    int main () {
      char c[1];
      struct pile mapile;
      initialiser (mapile);
     
      printf ("entrer un caractere : ");
      scanf ("%c", &c); 
     
      empiler (mapile,c);
    printf ("\n");
     
    afficherPile (mapile);
     
     
      return 0;
    }

  2. #2
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Si tu ne veux récupérer qu'un seul caractère il faut utiliser seulement un char et non un char*
    Après si tu veux utiliser un char* il faut que tu déclares un tableau de ... 2 cases
    La première case contiendra ton caractère et la deuxième contiendra le '\0', alors que si tu crées seulement un tableau d'une seule case ton tableau ne contiendra que "\0" (dans ton cas c'est incorrect il aurais soit fallu utiliser le formateur %s, ou soit entrer directement le caractère souhaité : scanf ("%c", &c[0]))

    Dans ta fonction initialiser tu pourrais initialiser tableauPile aussi
    Mais le problème de ta fonction initialiser c'est que tu n'envoies pas un pointeur, et donc tu ne modifies la valeur de taille que dans ta fonction initialiser, dans ta fonction main elle reste inchangée.
    Pour faire simple tu peux tout simplement utiliser memset
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memset(&maPile, 0, sizeof(maPile));
    Ta fonction empiler et afficherPile sont incorrectes, parce que tu commences ton indice à 1 (un tableau commence à l'indice 0) et ton tableau ne contient qu'une seule case, donc tu fais un beau dépassement de mémoire

    Bon courage

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 33
    Points : 29
    Points
    29
    Par défaut
    Bonjour,
    Je vois une incohérence dans l'instruction scanf("%c",&c) du programme principal.En effet,d'après la déclaration char c[1],c est un pointeur vers une chaine de caractères.Quand tu fais le scanf dans &c,tu ne places pas le caractère saisi à l'adresse indiquée dans c,mais à l'adresse de c !Le caractère c[0] ne reçoit pas le caractère saisi à l'écran,et de plus c est modifié,après le scanf il ne contient plus l'adresse de c[0].
    La bonne lecture du scanf doit être faite dans : c ou &c[0].

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    mohira :

    Si la conclusion est exacte :
    La bonne lecture du scanf doit être faite dans : c ou &c[0].
    la description du comportement ne l'est pas.
    et de plus c est modifié,après le scanf il ne contient plus l'adresse de c[0].
    c n'est absolument pas modifiable

Discussions similaires

  1. [Eigen] création d'une matrice sans connaitre à l'avance la taille
    Par bioinfornatics dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 16/02/2010, 21h13
  2. [OpenOffice][Texte] Création d'une TOC sans IHM
    Par lekekoo dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 25/05/2007, 16h09
  3. Réponses: 6
    Dernier message: 23/02/2007, 16h27
  4. Création d'une pile d'images
    Par lia dans le forum OpenGL
    Réponses: 11
    Dernier message: 14/07/2006, 02h52
  5. Création d'une fonction sans paramètre?
    Par falcon dans le forum Oracle
    Réponses: 3
    Dernier message: 13/12/2004, 11h32

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