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 :

Erreur - tableau de structure


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 18
    Points : 20
    Points
    20
    Par défaut Erreur - tableau de structure
    Salut,

    voile je voudrais transmettre un tableau de structure en paramètre et l'initialiser:

    Ma structure + la prototype de la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct produit produit;
    struct produit{
        char libelle[30];
        long stock;
    };
     
    long recupListeProduit(produit* tab_produit);

    L'appel de ma fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    produit tab_produit[50];
    nb_produit=recupListeProduit(tab_produit);
    La fonction en elle même:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    long recupListeProduit(produit* tab_produit){
     
    long nb_produit=0,position_deb=0,position_fin=0;
    FILE *fichier_produits=NULL;
    produit un_produit;
     
    fread(&un_produit,sizeof(produit),1,fichier_produits);
    while(feof(fichier_produits)==0){
       tab_produit[nb_produit].libelle=un_produit.libelle;
       tab_produit[nb_produit].stock=un_produit.stock;
       nb_produit++;
       fread(&un_produit,sizeof(produit),1,fichier_produits);
    }
    }
    Code block me met l'erreur:
    C:\CodeBlocks\phyto_stock\gest_coop\produit.c||In function `recupListeProduit'
    C:\CodeBlocks\phyto_stock\gest_coop\produit.c|86|error: incompatible types in assignment|
    ||=== Build finished: 1 errors, 0 warnings ===|

    C'est la ligne --> tab_produit[nb_produit].libelle=un_produit.libelle;
    Si je la met en commentaire, il ne met plus d'erreur.

    Merci de m'aider c'est très important.

  2. #2
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Depuis quand on fait une affectation de chaine de caractère comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab_produit[nb_produit].libelle=un_produit.libelle;

  3. #3
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Pour copier une chaîne de caractères : strcpy() et strncpy()
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  4. #4
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par vicenzo Voir le message
    Pour copier une chaîne de caractères : strcpy() et strncpy()
    Il y a aussi strcat et strncat. Mais les extensions BSDs sont à préférer!
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  5. #5
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Il y a aussi strcat et strncat. Mais les extensions BSDs sont à préférer!
    copie et concaténation sont deux choses différentes.

    Dans le cas de ce post, il s'agit d'une affectation, donc une copie, et donc les fonctions à utiliser sont strcpy() ou strncpy() et non strcat() ou strncat().

    De plus dans le cadre du code posté, strcat() aurait un effet désastreux puisque que la chaine de destination n'est pas encore initialisée !
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  6. #6
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par vicenzo Voir le message
    copie et concaténation sont deux choses différentes.

    Dans le cas de ce post, il s'agit d'une affectation, donc une copie, et donc les fonctions à utiliser sont strcpy() ou strncpy() et non strcat() ou strncat().

    De plus dans le cadre du code posté, strcat() aurait un effet désastreux puisque que la chaine de destination n'est pas encore initialisée !
    non non, je persiste et signe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    char buffer[10];
    strcpy (buffer, "chaine");
     
    char buffer2[10];
    buffer2[0] = 0;
    strcat (buffer, "chaine");
     
    char buffer3[10];
    strncpy (buffer, "chaine trop longue", 9);
    buffer[sizeof buffer - 1] = 0;
     
    char buffer4[10];
    buffer[0] = 0;
    strncat (buffer, "chaine trop longue", 9);
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  7. #7
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par vicenzo Voir le message
    De plus dans le cadre du code posté, strcat() aurait un effet désastreux puisque que la chaine de destination n'est pas encore initialisée !
    strcat ou strcpy sont 2 fonctions dangereuses que personnelement je n'utilise jamais. Il n'y en a pas une meilleure que l'autre.

    Enfin avec le code que j'ai posté précédemment on s'apperçoit que cela revient au même de faire un strncpy ou un strncat.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  8. #8
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Enfin avec le code que j'ai posté précédemment on s'apperçoit que cela revient au même de faire un strncpy ou un strncat.
    Tu initialises ta chaine de destination avant de faire le strcat... Pourquoi faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    buffer[0] = 0;
    strncat(buffer, "chaine", 6);
    alors qu'un simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strncpy(buffer, "chaine", 6);
    suffit. Pour moi, le strcat()/strncat() est hors de propos du post initial.

    Citation Envoyé par nicolas.sitbon Voir le message
    strcat ou strcpy sont 2 fonctions dangereuses que personnelement je n'utilise jamais. Il n'y en a pas une meilleure que l'autre.
    La, je suis d'accord avec toi, strcpy() et strcat() sont dangereuses et il faut leur préférer leur version strncpy() et strncat() qui ajoute un contrôle.

    Mais pourquoi coder 2 lignes alors tu peux n'en faire qu'une...
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  9. #9
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    ton exemple marche seulement pour des chaines plus petites que le buffer mais voyons ce qui se passe pour une taille plus grande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
    #include <string.h>
     
    int main (void)
    {
       char buffer[10];
       strncpy (buffer, "chaine trop longue", 9);
       puts (buffer);
     
       return 0;
    }
    affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine tr���8	��P$�������8	��P$��
    le seul moyen de le faire proprement est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
    #include <string.h>
     
    int main (void)
    {
       char buffer[10];
       strncpy (buffer, "chaine trop longue", 9);
       buffer[sizeof buffer - 1] = 0;
       puts (buffer);
     
       return 0;
    }
    affiche
    le même code avec strncat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
    #include <string.h>
     
    int main (void)
    {
       char buffer[10];
       buffer[0] = 0;
       strncat (buffer, "chaine trop longue", 9);
       puts (buffer);
     
       return 0;
    }
    affiche bien
    on voit même que c'est plus simple puisque qu'il n'y a pas à calculer la position du dernier caractère.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

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

Discussions similaires

  1. Réponses: 35
    Dernier message: 04/06/2012, 12h38
  2. Réponses: 6
    Dernier message: 28/12/2009, 16h45
  3. [VB6]Tri multi-colonnes sur tableau de structure
    Par ELGUEVEL dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 17/02/2006, 08h02
  4. Réponses: 9
    Dernier message: 13/02/2006, 08h39
  5. Trier un tableau de structures
    Par Yux dans le forum C
    Réponses: 7
    Dernier message: 05/11/2005, 17h28

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