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 :

Lecture hors tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 3
    Par défaut Lecture hors tableau
    Bonjour !
    J'ai essayé de créer un tableau contenant les noms, prénoms, et différentes informations sur des personnes diverses, et ensuite modifier ce tableau à l'aide de fonctions.
    Le problème est le suivant : quand je me sers de la fonction "inscription", et j'essaye ensuite d'afficher le nom que je viens d'y inscrire, la console affiche 50 lignes de [|[|[|[|[|[ , ensuite affiche le nom, et se termine avec le code 0 (ce que je voulais). Une fois revenu sur visual studio, apparaît le message
    " Run-Time Check Failure #2 - Stack around the variable 'T' was corrupted. "
    J'ai cru comprendre que mon programme a lu des trucs hors de mon tableau, mais il m'a bel et bien sorti le résultat !

    Mon code : ( pas tout, juste les éléments concernés )

    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
    typedef char CH15[16], CH10[11];
    struct pers
    {
    	CH15 nom;
    };
     
    void inscription(pers *pointT);
     
    void main ()
    {
    	pers T[100];                            // Tableau des noms
    	pers *pointT = &T[100];            // Pointeur
            inscription(&T[100]);
            printf("%-20s\n", T[0].nom);
    	system("pause");
    }
     
    void inscription(pers *pointT)
    {
    	system("cls");
    	fflush(stdin);
    	printf("Rentrez\nLe nom :  ");
    	gets(pointT[0].nom);
    }
    Pourriez vous me signaler s'il vous plaît le moment où le programme sort du tableau ? Et si c'est pas trop demander la raison des [|[|[|[|[| dans la console.

    Merci d'avance !

  2. #2
    Expert confirmé
    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
    Par défaut
    Les erreurs :

    1- En C, le type pers n'est pas connu. Seul le type struct pers est connu.
    Pour utiliser pers sans spécifier struct, il faut un typedef.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct
    {
    	CH15 nom;
    }pers ;
    2- main renvoie toujours un int, pas void. On devrait avoir ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main(void)
    {
    .....
      return 0; // par exemple
    }
    3- L'erreur responsable des problèmes observés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	pers *pointT = &T[100];            // Pointeur
            inscription(&T[100]);
    Dans ces deux lignes, &T[100] ne désigne pas l'adresse du début du tableau pers T[100] , mais l'adresse de son élément d'indice 100 qui naturellement n'existe pas (les indices légaux allant de 0 à 99). C'est donc l'adresse de ce qui se trouve après le tableau !
    Pour obtenir l'adresse du début, on peut écrire &T[0] ou plus simplement T : T étant un tableau, dans ce contexte, T est l'adresse du début du tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     	pers *pointT = T;     // ou = &T[0]
            inscription(T);       // ou inscription(&T[0])
    4- fflush() ne doit pas être utilisé sur un flux d'entrée (comme stdin) mais sur un flux de sortie (comme stdout). Pour plus de détails, voir la FAQ.

    5- gets() ne doit plus être utilisée. fgets() sur stdin le remplace avantageusement. Pour plus de détails, voir la FAQ.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 3
    Par défaut
    Merci beaucoup

    Modification en marche !

Discussions similaires

  1. [Tableaux] lecture du tableau $_FILE
    Par gforce dans le forum Langage
    Réponses: 12
    Dernier message: 05/06/2007, 17h02
  2. Lecture de tableau par pointeur
    Par SPACHFR dans le forum Débuter
    Réponses: 7
    Dernier message: 16/05/2007, 16h43
  3. Réponses: 3
    Dernier message: 05/02/2006, 22h59
  4. erreur de lecture de tableau incompréhensible
    Par Anouschka dans le forum C++
    Réponses: 2
    Dernier message: 27/01/2006, 13h40
  5. C++ et lecture de tableau
    Par ero-sennin dans le forum C++
    Réponses: 17
    Dernier message: 31/10/2005, 23h42

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