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

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 48
    Points : 44
    Points
    44
    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 sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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.
    Pas de Wi-Fi à la maison : CPL

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 48
    Points : 44
    Points
    44
    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 sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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...
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    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...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 48
    Points : 44
    Points
    44
    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 à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Points : 11
    Points
    11
    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 du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 48
    Points : 44
    Points
    44
    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 sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    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

  10. #10
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par koala01
    ...
    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
    ..
    Il y a une autre manière avec ce que koala01 vient de mettre :

    sachant que ton tableau, à chaque indice i (0 à NOMBRE_PROD), contient les 2 chaines, il suffirait d'aller écrire (quand tu lis les chaines et les stocke) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sscanf ( ... , produit[i] );
    pour la première et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sscanf ( ...., &(produit[i][MAX_LONGUEUR_1]) );
    pour la deuxième.

    (ce qui irait mettre la deuxième chaîne à l'emplacement MAX_LONGUEUR_1, nonobstant (j'aime bien ce mot ) la longueur de la première..

    Et par conséquent, pour s'en servir ou imprimer ensuite, ce serait la même chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fprintf ( stderr, "Première partie : %s", produit[i] );
    fprintf ( stderr, "Deuxième partie : %s", &(produit[i][MAX_LONGUEUR_1]) );


    Note : pour être tout à fait correct et ne pas profiter des "assimilations" que peut founir le langage C, tu peux (pour te rassurer) remplacer produit[i] (pour la première chaîne) par &(produit[i][0]) (mais ça revient au même..)
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par souviron34
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fprintf ( stderr, "Première partie : %s", produit[i] );
    fprintf ( stderr, "Deuxième partie : %s", &(produit[i][MAX_LONGUEUR_1]) );
    Note : pour être tout à fait correct et ne pas profiter des "assimilations" que peut founir le langage C, tu peux (pour te rassurer) remplacer produit[i] (pour la première chaîne) par &(produit[i][0]) (mais ça revient au même..)
    Oui, on peut toujours compliquer de plus en plus, mais je préfère simplifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    printf ("Première partie : %s", produit[i] + 0);
    printf ("Deuxième partie : %s", produit[i] + MAX_LONGUEUR_1));
    fflush (stdout);
    soit au final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    printf ("Première partie : %s", produit[i]);
    printf ("Deuxième partie : %s", produit[i] + MAX_LONGUEUR_1));
    fflush (stdout);
    (stdout, parce qu'il s'agit probablement d'affichage applicatif et non de trace ni d'erreur. Ca ne va pas forcément dans le même tuyau...).
    Pas de Wi-Fi à la maison : CPL

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 48
    Points : 44
    Points
    44
    Par défaut
    Bonjour....

    Ca n'a pas fonctionné...

    Voici mon 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
    81
    82
    83
    84
    85
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define LGL 81       /* Longueur max d'une ligne de texte    */
    #define LCH 20       /* Longueur max de la chaine   */
    #define LTX 21       /* Longueur max de la chaine avec \n   */
    #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 *markProd[NPR], char *modlProd[NPR]);
     
    int main()
    {
    	char nomFichier [LGL];
      int i, n = 0, anzProd = 0;
      FILE *fich;
     
    	/*Tableaux des produits disponibles*/
    	/*Tableaux des denominations de produits*/
      char markProd [LTX][NPR];
      char modlProd [LTX][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, &markProd, &modlProd);
    printf("retour main\n");
     
    /*BOUCLE DE LECTURE MAIN
    verifie si les produits sont correctement stockes dans les tables*/
      for(i=0; i< anzProd;i++)printf("Iter Main %d %d %f %s %s\n", i, noProd[i], prProd[i], markProd[i], modlProd[i]);
     
    	return 0;
    }
     
    /*Fonction de lecture des produits*/
    int chargeProd(char nomFichier[LGL], int noProd[], float prProd[], char *markProd[NPR], char *modlProd[NPR])
    {
    	int numero = 0, i= 0, n = 0, tst = 0, res = 0;
    	char  nom[LCH],  mod[LCH], 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;
            markProd[i] = nom;
            modlProd[i] = mod;
            prProd[i] = prix;
    printf("Iter Boucle %d %d %f %s %s\n", i, noProd[i], prProd[i], markProd[i], modlProd[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("fin de lecture\n");
     
    /*BOUCLE DE LECTURE FONCTION
    verifie si les produits sont correctement stockes dans les tables*/
      for(i=0; i<res;i++)printf("Iter Sortie %d %d %f %s %s\n", i, noProd[i], prProd[i], markProd[i], modlProd[i]);
     
    	}
      return res;
    }
    J'ai inséré des printf qui affichent les valeurs des champs pour chaque itération.
    Iter Boucle est toujours correcte mais les autres affichent des résultats aberrants :
    - les données numériques (int et float) sont correctes
    - les données texte sont fausses

    Je me demande si mon ordi n'est pas hanté...

  13. #13
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Le problème vient, surtout, du fait que le fait de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        markProd[i] = nom;
        modlProd[i] = mod;
    ne copie absolument pas le contenu de la chaine nom (ou mod) dans la chaine markProd[i] (ou modlProd[i])

    Pour copier le contenu d'une chaine dans l'autre, il faut travailler à base de str(n)cpy, ou à base de memcpy

    N'oublie jamais qu'une chaine de caractères, en C, ce n'est qu'un tableau de char, et que, finalement dans une déclaration du type de
    chaine est équivalent à un pointeur sur le premier élément du tableau (==pointeur sur chaine[0])
    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

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 48
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par koala01
    Le problème vient, surtout, du fait que le fait de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        markProd[i] = nom;
        modlProd[i] = mod;
    ne copie absolument pas le contenu de la chaine nom (ou mod) dans la chaine markProd[i] (ou modlProd[i])

    Pour copier le contenu d'une chaine dans l'autre, il faut travailler à base de str(n)cpy, ou à base de memcpy

    N'oublie jamais qu'une chaine de caractères, en C, ce n'est qu'un tableau de char, et que, finalement dans une déclaration du type de
    chaine est équivalent à un pointeur sur le premier élément du tableau (==pointeur sur chaine[0])
    Merci pour l'explication !!
    Je teste tout de suite !!

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 48
    Points : 44
    Points
    44
    Par défaut
    Bonjour !

    J'ai modifié comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            noProd[i] = numero;
            strcpy(markProd[i], nom);   //ligne modifiée
            strcpy(modlProd[i], mod);   //ligne modifiée
            prProd[i] = prix;
    Mais le programme s'interrompt avec ce message :

    console.exe Error
    L'instruction "0x77c460c1" renvoie à "0x003f003f". Le processus "written" n'a pas pu être effectué dans la mémoire.

    Program received signal (SIGSEGV)
    Segmentation fault

    Que dois-je faire ?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Joratois
    Mais le programme s'interrompt avec ce message :

    console.exe Error
    L'instruction "0x77c460c1" renvoie à "0x003f003f". Le processus "written" n'a pas pu être effectué dans la mémoire.

    Program received signal (SIGSEGV)
    Segmentation fault

    Que dois-je faire ?
    Montrer tout le code. Je soupçonne qu'une partie de la mémoire n'ait pas été allouée...
    Pas de Wi-Fi à la maison : CPL

  17. #17
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    tu confonds encore...

    Dans ton scanf :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          n = sscanf (ligne, "%d %s %s %f", &numero, &nom, &mod, &prix) ;
    nom et mod sont des tableaux de char, donc nom == &(nom[0]), mais &nom est l'adresse d'un pointeur, or ce qu'attend scanf c'est une adresse à partir de laquelle écrire, donc l'adresse du début de tableau, donc nom..

    Ton scanf doit donc être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          n = sscanf (ligne, "%d %s %s %f", &numero, nom, mod, &prix) ;
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 48
    Points : 44
    Points
    44
    Par défaut
    Soit l'informatique, c'est très compliqué, soit je suis très bête (soit les deux) mais ça ne fonctionne toujours pas...

    En tout cas, merci pour le coup de main et pour les explications de mes erreurs !

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define LGL 81       /* Longueur max d'une ligne de texte    */
    #define LCH 20       /* Longueur max de la chaine   */
    #define LTX 22       /* Longueur max de la chaine avec \n   */
    #define NPR 30       /* Nombre max de produits   */
     
    /*Programmation C, test 2
     
    //Prototype fonction chargeProd
    int chargeProd(char nomFichier[LGL], int noProd[], float prProd[], char *markProd[NPR], char *modlProd[NPR]);
     
    int main()
    {
    	char nomFichier [LGL];
      int i, n = 0, anzProd = 0;
      FILE *fich;
     
    	/*Tableaux des produits disponibles*/
    	/*Tableaux des denominations de produits*/
      char markProd [LTX][NPR];
      char modlProd [LTX][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, markProd, modlProd);
    printf("retour main\n");
     
    /*BOUCLE DE LECTURE MAIN
    verifie si les produits sont correctement stockes dans les tables*/
      for(i=0; i< anzProd;i++)printf("Iter Main %d %d %f %s %s\n", i, noProd[i], prProd[i], markProd[i], modlProd[i]);
     
    	return 0;
    }
     
    /*Fonction de lecture des produits*/
    int chargeProd(char nomFichier[LGL], int noProd[], float prProd[], char *markProd[NPR], char *modlProd[NPR])
    {
    	int numero = 0, i= 0, n = 0, tst = 0, res = 0;
    	char  nom[LCH],  mod[LCH], 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;
            strcpy(markProd[i], nom);
            strcpy(modlProd[i], mod);
            prProd[i] = prix;
    printf("Iter Boucle %d %d %f %s %s\n", i, noProd[i], prProd[i], markProd[i], modlProd[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("fin de lecture\n");
     
    /*BOUCLE DE LECTURE FONCTION
    verifie si les produits sont correctement stockes dans les tables*/
      for(i=0; i<res;i++)printf("Iter Sortie %d %d %f %s %s\n", i, noProd[i], prProd[i], markProd[i], modlProd[i]);
     
    	}
      return res;
    }
    Message d'erreur du debbugging :

    Selecting target: default
    Compiling: done
    Starting debugger: done
    Adding source dir: D:\Codeblocks\
    Adding file: D:\Codeblocks\console.exe
    Continuing...
    Continuing...
    Value of nom: "Olympus\000r\000e\000\000\000\000\000\200\026@"
    Value of nom: "Olympus\000r\000e\000\000\000\000\000\200\026@"
    Value of mod: "FE200\000Ãw.¥Ãwè\032Æw\\ø\""
    Value of mod: "FE200\000Ãw.¥Ãwè\032Æw\\ø\""
    Continuing...
    Program received signal (SIGSEGV)
    Segmentation fault
    Value of suivante:
    Value of suivante:
    No symbol "suivante" in current context.
    Value of fichier:
    Value of fichier:
    No symbol "fichier" in current context.
    Value of message:
    Value of message:
    No symbol "message" in current context.


    #0 0x77c460c1 strcat (?? : ??)
    #1 0x00610077 ?? (?? : ??)
    #2 0x004014c9 chargeProd (main_forum.c:65)
    #3 0x00401305 main (main_forum.c:34)




    Si ça peut aider...
    Message du compilateur:

    Project : Console application
    Compiler : GNU GCC Compiler (called directly)
    Directory : D:\Codeblocks\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main_forum.c
    main_forum.c: In function `main':
    main_forum.c:34: warning: passing arg 4 of `chargeProd' from incompatible pointer type
    main_forum.c:34: warning: passing arg 5 of `chargeProd' from incompatible pointer type
    Linking console executable: D:\Codeblocks\console.exe
    Process terminated with status 0 (0 minutes, 0 seconds)
    0 errors, 2 warnings

  19. #19
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    bon effectivement pas mal de choses à revoir...

    Quand tu déclares :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      char markProd [LTX][NPR];
    tu fais l'inverse de ce que tu voudrais faire...

    ce serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      char markProd [NPR][LTX];
    un tableau de NPR éléments , chacun de longueur LTX.

    Ensuite, dans le prototype de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int chargeProd(char nomFichier[LGL], int noProd[], float prProd[], char *markProd[NPR], char *modlProd[NPR])
    D'abord avec ce qu'on a dit au dessus, tu comprendras que tes chaines (2 derniers paramètres) ne feront pas ce que tu penses.

    Ensuite, tu peux remplacer par des écritures plus traditionnelles en C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int chargeProd(char *nomFichier, int *noProd, float *prProd, char **markProd, char **modlProd)
    Puis, tu fais une horreur absolue dans la lecture du fichier :

    feof ne fais pas ce que tu pense qu'il fait....

    Ce n'est pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    		fgets (ligne, LGL, fich); // Lecture 1ère ligne
    		while (!feof(fich)) {     // Tant que non fin de fichier
    qu'il faut faire, mais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    		while ( fgets (ligne, LGL, fich) != NULL )
    		  {     // Tant que non fin de fichier
    D'autre part, les accolades ne correspondent pas à ce que tu veux faire..

    Et donc ta boucle de lecture devient :

    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
     
       i = 0 ;
       tst = 0 ;
     
       while ( fgets (ligne, LGL, fich) != NULL )
        {     // Tant que non fin de fichier
           n = sscanf (ligne, "%d %s %s %f", &numero, nom, mod, &prix) ;
           if (n==4)
             {
                 noProd[i] = numero;
                 strcpy(markProd[i], nom);
                 strcpy(modlProd[i], mod);
                 prProd[i] = prix;
                 printf("Iter Boucle %d %d %f %s %s\n", i, noProd[i], prProd[i],    markProd[i], modlProd[i] );
                 i++;
                 res = i;
             }
     
           if ( i >= NPR) 
             { 
                 tst = 1; 
                 res = NPR; // max atteint --> sortie de boucle 
                 printf ("Trop d'elements dans la liste %s\n", nomFichier);}
                 break ;
             }
         }   /* Fin du while */
     
        fclose (fich);
    Si tu as des questions n'hésite pas..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 48
    Points : 44
    Points
    44
    Par défaut
    Bonjour,

    J'ai le sentiment de me débattre dans une toile d'araignée...

    Quand je corrige à un endroit, ça merde à un autre !

    J'ai recopié les corrections proposées dans mon code mais j'obtiens toujours un message à la compilation

    Project : Console application
    Compiler : GNU GCC Compiler (called directly)
    Directory : D:\Codeblocks\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main_forum.c
    main_forum.c: In function `main':
    main_forum.c:29: warning: passing arg 4 of `chargeProd' makes pointer from integer without a cast
    main_forum.c:29: warning: passing arg 5 of `chargeProd' makes pointer from integer without a cast
    Linking console executable: D:\Codeblocks\console.exe
    Process terminated with status 0 (0 minutes, 0 seconds)
    0 errors, 2 warnings

    Mon 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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define LGL 81       /* Longueur max d'une ligne de texte    */
    #define LCH 20       /* Longueur max de la chaine   */
    #define LTX 22       /* Longueur max de la chaine avec \n   */
    #define NPR 30       /* Nombre max de produits   */
     
    /*Programmation C, test 2*/
    //Prototype fonction chargeProd
    int chargeProd(char *nomFichier, int *noProd, float *prProd, char **markProd, char **modlProd);
     
    int main()
    {
    	char nomFichier [LGL];
      int i, n = 0, anzProd = 0;
      FILE *fich;
     
    	/*Tableaux des denominations de produits*/
      char markProd [NPR][LTX];
      char modlProd [NPR][LTX];
    	/*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, **markProd, **modlProd);
     
    /*BOUCLE DE LECTURE MAIN
    verifie si les produits sont correctement stockes dans les tables*/
      for(i=0; i< anzProd;i++)printf("Iter Main %d %d %f %s %s\n", i, noProd[i], prProd[i], markProd[i], modlProd[i]);
     
    	return 0;
    }
     
    /*Fonction de lecture des produits*/
    int chargeProd(char nomFichier[], int noProd[], float prProd[], char *markProd[NPR], char *modlProd[NPR])
    {
    	int numero = 0, i= 0, n = 0, res = 0;
    	char  nom[LCH],  mod[LCH], 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 {
    		while ( fgets (ligne, LGL, fich) != NULL ) {     // 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){
            noProd[i] = numero;
            strcpy(markProd[i], nom);
            strcpy(modlProd[i], mod);
            prProd[i] = prix;
    printf("Iter Boucle %d %d %f %s %s\n", i, noProd[i], prProd[i], markProd[i], modlProd[i] );
            i++;
            res = i;
            }
          if ( i >= NPR) {  // max atteint --> sortie de boucle avec message
            res = NPR;
            printf ("Trop d'elements dans la liste %s\n", nomFichier);
            break;
          }
    		}
    		fclose (fich);
    printf("fin de lecture\n");
    	}
      return res;
    }
    Ce que je n'ai toujours pas compris :
    - le prototype de la fonction, l'appel de la fonction et la déclaration de la fonction doivent ils être tous identiques ??

    Comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //Prototype fonction chargeProd
    int chargeProd(char *nomFichier, int *noProd, float *prProd, char **markProd, char **modlProd);
    /*Appel de la fonction de lecture des produits*/
    anzProd = chargeProd("produits.txt", *noProd, *prProd, **markProd, **modlProd);
    /*Fonction de lecture des produits*/
    int chargeProd(char *nomFichier[], int *noProd[], float *prProd[], char **markProd[NPR], char **modlProd[NPR])
    De fait, je sais que cette idée est mauvaise car le compilateur rejette ce code à cause de conflits de types de variable mais je ne comprends pas quel type fait conflit avec quel type, et naturelllement, je ne sais pas comment corriger ces conflits...

    Comment faire ?
    Si je laisse comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //Prototype fonction chargeProd
    int chargeProd(char *nomFichier, int *noProd, float *prProd, char **markProd, char **modlProd);
    /*Appel de la fonction de lecture des produits*/
    anzProd = chargeProd("produits.txt", noProd, prProd, **markProd, **modlProd);
    /*Fonction de lecture des produits*/
    int chargeProd(char nomFichier[], int noProd[], float prProd[], char *markProd[NPR], char *modlProd[NPR])
    Je n'ai pas d'erreur, seulement 2 avertissements mais le code se crashe quand même...

    Compiling: main_forum.c
    main_forum.c: In function `main':
    main_forum.c:29: warning: passing arg 4 of `chargeProd' makes pointer from integer without a cast
    main_forum.c:29: warning: passing arg 5 of `chargeProd' makes pointer from integer without a cast

    Et je ne comprends pas de quelle manière le passage des arguments 4 et 5 génèrent un pointeur sur integer sans cast ?

    Merci de votre aide et bonne journée !

    Un Joratois dans le brouillard

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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