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 :

Tableau de char[] passé dans une fonction


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 48
    Par défaut Tableau de char[] passé dans une fonction
    Bonjour,

    J'ai créé dans CodeBlocks (www.codeblocks.org) le programme suivant pour apprendre à passer des tableaux dans des fonctions() et lire le résultat dans le main().

    J'arrive à effectuer +/- correctement le travail pour des tableaux d'int, avec peine pour des floats et pas du tout avec des char[]

    Je voulais au départ faire un tableau de 2 colonnes de char[] pour les indications t1Prod et t2Prod mais devant la difficulté, j'ai construit deux tableaux (je ne désespère pas de les réunir un jour...)

    Malgré tout, si les tableaux de int et de float sont correctement affichés dans main(), les tableaux de char répètent toujours la dernière ligne stockée

    La procédure va lire les infos dans un fichier "produits.txt" dont voici les données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    104	Olympus	FE200	244.90
    226	JVC	MG155	944.20
    342	Pentax	Taa	344
    509	Canon	Selphyes1	299.20
    777	Nikon	F4S	0
    974	Canon	Ixus800IS	444.50
    Et voici le code :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    #include <stdio.h>
    #include <stdlib.h>
    #define LGL 81       /* Longueur max d'une ligne de texte    */
    #define LTX 21       /* Longueur max d'un nom de fichier   */
    #define NPR 30       /* Nombre max de produits   */
     
    /*Programmation C, test 2
     
    Le programme charge la liste des produits des son lancement
     
    */
     
    //Prototype fonction chargeProd
    int chargeProd(char nomFichier[LGL], int noProd[], float prProd[], char *t1Prod[NPR], char *t2Prod[NPR]);
     
    int main()
    {
    	char nomFichier [LGL];
      int i, n = 0, anzProd = 0;
      FILE *fich;
     
    	/*Tableaux des produits disponibles*/
    	/*Tableaux des denominations de produits*/
      char *t1Prod [NPR];
      char *t2Prod [NPR];
    	/*Tableaux des donnees numeriques de produits*/
      int noProd [NPR];
    	/*Tableaux des prix de produits*/
      float prProd [NPR];
     
      /*Appel de la fonction de lecture des produits*/
      anzProd = chargeProd("produits.txt", noProd, prProd, t1Prod, t2Prod);
    printf("stop after\n");
     
      for(i=0; i< anzProd;i++)printf("%d %d %f %s %s\n", i, noProd[i], prProd[i], t1Prod[i], t2Prod[i]);
     
    	return 0;
    }
     
    /*Fonction de lecture des produits*/
    int chargeProd(char nomFichier[LGL], int noProd[], float prProd[], char *t1Prod [], char *t2Prod [])
    {
    	int numero = 0, i= 0, n = 0, tst = 0, res = 0;
    	char  nom[LTX],  mod[LTX], ligne [LGL];
      float prix;
    	FILE *fich;
     
    	/* Ouverture du fichier a lire*/
    	fich = fopen (nomFichier, "r");
     
    	if ( fich == NULL ) {
    		printf ("Ouverture impossible fichier %s\n", nomFichier);
    	} else {
    		fgets (ligne, LGL, fich); // Lecture 1ère ligne
    		while (!feof(fich)) {     // Tant que non fin de fichier
          // boucle de lecture et stockage des informations produit dans la structure
          n = sscanf (ligne, "%d %s %s %f", &numero, &nom, &mod, &prix) ;
          if (n==4 && tst == 0){
            noProd[i] = numero;
            t1Prod[i] = nom;
            t2Prod[i] = mod;
            prProd[i] = prix;
    printf("b %d %s %s %f\n", i, t1Prod[i], t2Prod[i], prProd[i] );
            i++;
            res = i;
            }
            fgets (ligne, LGL, fich); // Lecture ligne suivante
          if ( i >= NPR) { tst = 1; res = NPR; } // max atteint --> sortie de boucle avec message
    		}
    		if (tst ==1) {printf ("Trop d'elements dans la liste %s\n", nomFichier);}
    		fclose (fich);
    printf("stop %d\n", res );
     
    /*BOUCLE A DETRUIRE
    verifie si les produits sont correctement stockes dans la structure*/
      for(i=0; i<res;i++)printf("x %d %d %s %s\n", i, noProd[i], t1Prod[i], t2Prod[i]);
     
    	}
      return res;
    }

    De préférence, j'aimerais bien avoir une petite xplication sur l'erreur que j'ai commise pour comprendre ce que j'ai fait de faux.

    Merci de votre aide !

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Joratois
    La procédure va lire les infos dans un fichier "produits.txt" dont voici les données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    104	Olympus	FE200	244.90
    226	JVC	MG155	944.20
    342	Pentax	Taa	344
    509	Canon	Selphyes1	299.20
    777	Nikon	F4S	0
    974	Canon	Ixus800IS	444.50
    Et voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	/*Tableaux des produits disponibles*/
    	/*Tableaux des denominations de produits*/
      char *t1Prod [NPR];
      char *t2Prod [NPR];
    	/*Tableaux des donnees numeriques de produits*/
      int noProd [NPR];
    	/*Tableaux des prix de produits*/
      float prProd [NPR];
    Horrible ! Il faut absolument revoir ta conception et apprendre à faire un tableau de structure.

    Après analyse rapide de l'énoncé, et en tenant compte du fait que tu ne connais probablement pas l'allocation dynamique, je conseille de partir de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    struct produit
    {
       int identificateur;
       char marque [LGL];
       char reference [LGL];
       float prix;
    };
    Tu peux maintenant refaire tout ton code sur ces bases.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 48
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Horrible ! Il faut absolument revoir ta conception et apprendre à faire un tableau de structure.

    Tu peux maintenant refaire tout ton code sur ces bases.
    Bonjour,

    Comme je suis en train d'apprendre le C, je ne doute pas que mon travail soit nul !
    Le problème est que les structures sont étudiées le mois prochain et que je dois effectuer ce travail uniquement avec des tableaux ou des variables isolées...

    Même si les structures sont le moyen leplus efficace, elles me sont pour le moment interdites (je soupçonne notre prof de nous forcer à travailler avec des tableaux pour que la leçon de strtuctures soit consacrée à reprendre ce travail et à le "convertir" en structures...)

    Joratois, étudiant débutant...

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Joratois
    Même si les structures sont le moyen leplus efficace, elles me sont pour le moment interdites (je soupçonne notre prof de nous forcer à travailler avec des tableaux pour que la leçon de strtuctures soit consacrée à reprendre ce travail et à le "convertir" en structures...)
    Alors pour les chaines, n'oublie pas de faire des tableaux de char à 2 dimensions, parce que les tableaux de pointeurs non initialisés, ça va pas le faire...

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Joratois
    De préférence, j'aimerais bien avoir une petite xplication sur l'erreur que j'ai commise pour comprendre ce que j'ai fait de faux.

    Merci de votre aide !
    Dans ta fonction de lecture, tu n'as pas alloué de place pour stocker les cacactères..

    Si tu as déjà appris les alloc/malloc/calloc, il te faut à chaque ligne allouer de la place pour tes chaines.

    Si tu n'as pas encore appris ça, il faut que tu déclares tes tableaux de chaines en entier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char t1Prod[NPR][MAX_LONGUEUR] ;
    et que tu références à chaque ligne

    t1Prod[i]

    comme étant la chaine...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 48
    Par défaut
    Citation Envoyé par souviron34
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char t1Prod[NPR][MAX_LONGUEUR] ;
    et que tu références à chaque ligne

    t1Prod[i]

    comme étant la chaine...
    Merci, je vais tester.

    Bonne journée !

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut
    J'allais proposer de revoir la conception, avant de connaitre les limitations imposées par ton prof.

    Bref, ça pourra toujours te servir :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define TAILLE_LIGNE_MAX 81
    #define TAILLE_NOM_FICHIER_MAX 21
    #define NB_PRODUITS_MAX 30
    #define TAILLE_MARQUE_PRODUIT_MAX 64
    #define TAILLE_MODEL_MAX 64
     
    #define NOM_DU_FICHIER "produits.txt"
     
     
    typedef struct Produit Produit ;
    struct Produit
    {
    	int reference ;
    	char marque[TAILLE_MARQUE_PRODUIT_MAX] ;
    	char model[TAILLE_MODEL_MAX] ;
    	float prix ;
    } ;
     
    /*
    * Fonction qui charge dans un_catalogue tous les produits contenus dans NOM_DU_FICHIER.
    * Retourne le nombre de produits chargés.
    */
    int ChargeProduits (char nom_de_fichier[], Produit un_catalogue[]) ;
     
    /*
    * Procédure qui affiche le contenu d'un_catalogue
    */
    void AfficherCatalogue (const Produit un_catalogue[], int nombre_de_produits) ;
     
    int main ()
    {
      Produit catalogue[NB_PRODUITS_MAX] = { 0 } ; // on défini notre catalogue sous la forme d'un tableau de Produit
      int nbProduits = 0 ;
     
      nbProduits = ChargeProduits (NOM_DU_FICHIER, catalogue) ;
     
      AfficherCatalogue (catalogue, nbProduits) ;
     
      printf ("Nombre de produits : %d.\n", nbProduits) ;
     
      return EXIT_SUCCESS ;
    }
     
    /*
    * Fonction qui charge dans un_catalogue tous les produits contenus dans NOM_DU_FICHIER.
    * Retourne le nombre de produits chargés.
    */
    int ChargeProduits (char nom_de_fichier[], Produit un_catalogue[])
    {
      FILE * pFichier = NULL ; // pointeur sur le fichier contenant nos produits
      int nbProduits = 0 ; // Le nombre de produit qui ont été chargés
      char ligneCourante[TAILLE_LIGNE_MAX] = "" ; // Ligne entrain d'être traitée
     
      pFichier = fopen (NOM_DU_FICHIER, "r") ;
      // On lit toutes les lignes de notre fichier
      for (nbProduits = 0 ; fgets (ligneCourante, TAILLE_LIGNE_MAX, pFichier) != NULL ; nbProduits ++)
      {
        sscanf (ligneCourante, "%d %s %s %f", &un_catalogue[nbProduits].reference,
                                              &un_catalogue[nbProduits].marque,
                                              &un_catalogue[nbProduits].model,
                                              &un_catalogue[nbProduits].prix) ;
      }
      fclose (pFichier) ;
      return nbProduits ;
    }
     
    /*
    * Procédure qui affiche le contenu d'un_catalogue
    */
    void AfficherCatalogue (const Produit un_catalogue[], int nombre_de_produits)
    {
      int i = 0 ; // Indice de parcours des produits du catalogue
     
      // On parcours tous les produits et on les affiche
      for (i = 0 ; i < nombre_de_produits ; i ++)
      {
        printf ("-> Produit #%d : %d %s %s %.2f\n", i, un_catalogue[i].reference, 
                                                       un_catalogue[i].marque,
                                                       un_catalogue[i].model,
                                                       un_catalogue[i].prix) ;
      }
    }

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 48
    Par défaut
    Citation Envoyé par Arpivu
    Bref, ça pourra toujours te servir :
    Merci ! Merci !
    Bien sur que ça va me servir !!

    Encore merci de votre aide !

    Dernière question : si je désire créer un tableau comprenant deux colonnes de chaines de caractères, dois-je le définir comme suit !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char txtProduits[NOMBRE_PROD][MAX_LONGUEUR_1][MAX_LONGUEUR_2]
    Est-ce exact ?

    (désolé, j'ai bien cherché avec Google mais je ne trouve que des démonstrations de struct...)

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Tu peux tout à fait déclarer un tableau ayant autant de dimentions que tu le souhaites...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char var[5][8][9][3][25][56];
    serait tout à fait une déclaration valide... si du moins tu as la mémoire en suffisance (j'ai pas calculé, mais 5*8*9*3*25*56, ca doit faire pas mal ) (1)

    Ceci dit, il faut bien comprendre que le fait de déclarer un tableau sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char txtProduits[NOMBRE_PROD][MAX_LONGUEUR_1][MAX_LONGUEUR_2]
    ne revient nullement à déclarer un tableau de NOMBRE_PROD chaines de MAX_LONGUEUR_1 et autant de chaines de MAX_LONGUEUR_2, mais bel et bien un tableau permettant de contenir , au final, NOMBRE_PROD* MAX_LONGUEUR_1 chaines de MAX_LONGUEUR_2 ... Ce qui n'est vraissemblablement pas ce que tu souhaites ...

    Tu dois donc, pour respecter les souhaits de ton prof imbécile, déclarer, d'un coté, un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char marqueproduit[NOMBRE_PROD][MAX_LONGUEUR_1];
    pour le nom du produit et un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char modeleproduit[NOMBRE_PROD][MAX_LONGUEUR_2];
    pour le modele (les noms restant à ta discrétion )

    Une autre solution *pourrait* etre d'envisager de travailler avec un seul
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char produit[NOMBRE_PROD][MAX_LONGUEUR_1+MAX_LONGUEUR_2+1];
    et de t'arranger pour qu'il y ai d'office un espace (ou un \t ou ...) à la position MAX_LONGUEUR_1+1...

    Mais elle te forcerait à "jouer" avec les fonctions str(n)cat, substr, et autres joyeusetés permettant de gérer les chaines de caractères

    Comme tu peux le remarquer, tu n'as que l'embarras du choix


    [EDIT](1)j'aurais du écrire "si du moins, suffisemment de mémoire contigue pour le tableau[]/EDIT
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/12/2009, 15h01
  2. Réponses: 7
    Dernier message: 18/02/2009, 12h34
  3. Passer un tableau PHP en argument dans une fonction javascript ?
    Par The Molo dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 18/05/2007, 12h31
  4. Réponses: 17
    Dernier message: 15/05/2006, 17h18
  5. Réponses: 6
    Dernier message: 03/02/2006, 19h45

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