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 :

Problème de structure


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut Problème de structure
    Bonjour à tous,je vais essayer d'être le plus clair possible
    je suis en train de créer un programme de SGBD en langage C.J'ai donc crée une structure avec un paramètre indice qui me permet de savoir si une marque est disponible ou non.
    Je travaille donc avec des fonctions,et là viens mon problème.
    je demande à l'utilisateur qu'elle marque il veut supprimer, puis je souhaite comparer dans la basse de données ( un fichier texte ).
    Si elle y est je place un * pour indiquer qu'elle n'est plus disponible.
    Mon appel de fonction dans mon main est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    suppression_piece (&nb_piece,tab);
    avec nb_piece=0
    et ma fonction est la suivante:
    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
    void suppression_piece (int* adr_nb_casse, casse tab[])
    {
        int i;
        char marque[N];
        FILE * f;
        f=fopen("D:\Documents and Settings\denicod\Desktop\SGBDpiece.txt","r");
        i=0;
        printf("Saisir le marque de la voiture a suprimer \n");
        scanf("%s",marque); 
     
        for(i=0;i < *adr_nb_casse;i++)
        {    if ((marque ==tab[i].marque)&& (tab[i].indice == ' ')) 
                {
                    tab[i].indice='*';
                 }  
     
              else
                {
                    printf("Marque non présente dans la BD \n");
                 }
        return;
    }
    Problème: le if n'est pas exécuter et je ne comprend pas pourquoi.
    Merci d'avance pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu ne peux pas comparer deux tableaux de caractères avec == (ça compare leurs adresses à la place).
    Utilise strcmp().

    PS: Tu dois aussi doubler tes backslashes, dans la chaîne de caractères.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci Médinoc
    J'ai donc modifier comme suivant:
    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
    void suppression_piece (int* adr_nb_casse, casse tab[])
    {
        int i,a,b;
        char marque[N];
        FILE * f;
        f=fopen("D:\Documents and Settings\denicod\Desktop\SGBDpiece.txt","a+");
        i=0;
        printf("Saisir le marque de la voiture a suprimer \n");
        scanf("%s",marque);
        for(i=0;i < *adr_nb_casse;i++)
     
        {
             a=strcmp(marque,tab[i].marque);
             b=strcmp(tab[i].indice,' ');
     
               if ((a==0)&(b==0))
                {
                    tab[i].indice='*';
                    fprintf(f,"%c",tab[i].indice);
                    printf("suppresion reussi");
                 }
     
              else
                {
                    printf("Marque non présente dans la BD \n");
                 }
        }
        return;
    }
    Mais alors là je ne rentre pas dans la boucle for
    Un idée de mon erreur? je suis sur que c'est un petit truc...

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    • Ton scanf("%s", marque) nu est vachement dangereux, mais ça ne devrait pas empêcher d'entrer dans la boucle à moins que tu tapes plus de (N-1) caractères.
    • Ton fopen() est toujours faux, mais ça ne devrait pas empêcher d'entrer dans la boucle non plus.
    • Ton deuxième strcmp() ne devrait même pas compiler (ou au moins, pas compiler sans warning). strcmp() marche pour des tableaux de caractères, pas des caractères seuls.
    • if ((a==0)&(b==0)) devrait en théorie utiliser && au lieu de &, mais en pratique ici ça ne devrait faire aucune différence.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Comme je suis débutant je suis très preneur de conseil afin d'avoir la meilleur programmation possible,donc merci pour tes conseils.
    J'ai donc modifier mon programme celons tes remarques:
    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
    void suppression_piece (int* adr_nb_casse, casse tab[])
    {
        int i,a;
        char marque[N];
        FILE * f;
        f=fopen("D:\\Documents and Settings\\denicod\\Desktop\\SGBDpiece.txt","r+");
        i=0;
        printf("Saisir le marque de la voiture a suprimer \n");
        fgets(marque,sizeof(marque),stdin);
     
     
        for(i=0;i<*adr_nb_casse;i++)
     
        {
             a=strcmp(marque,tab[i].marque);
     
               if ((a==0)&&(tab[i].indice==' '))
                {
                    tab[i].indice='*';
                    fprintf(f,"%c",tab[i].indice);
                    printf("suppresion reussi");
                 }
              else
                {
                    printf("Marque non présente dans la BD \n");
                 }
        }
        fclose(f);
        return;
    }

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Attention, contrairement à scanf(), fgets() enregistre le \n.
    Il faut donc le supprimer d'abord.

    Généralement, on fait des fonctions comme ça pour:
    • Supprimer le \n du buffer s'il est là
    • "lire" le reste de la ligne sinon (pour éviter de parasiter les saisies suivantes)


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        printf("Saisir le marque de la voiture a suprimer \n");
        fgets(marque, sizeof(marque), stdin);
        fclean(marque, stdin);

    Pour le reste, je ne comprends pas ce que tu fais sur le fichier. Pour l'instant, ton code l'ouvre en lecture/écriture (et en mode texte), et modifie sur-place son premier caractère.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Pour être un petit peu plus clair si c'est possible
    j'ai une autre fonction qui écrit sous forme de structure dans le fichier avec comme premier élément:Mon but avec la suppression n'est pas vraiment de supprimer mais de changer cette valeur par '*' afin qu'avec une autre fonction je puisse faire la différence entre les * et les espaces.
    En gros quand il y a un espace la marque est présente dans le fichier donc je la lie quand il y a * la pièce ne doit pas être lu.

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je ne vois pas le rapport avec le fichier.
    Normalement, quand on bosse sur un fichier, il y a deux écoles différentes:
    1. Chaque opération agit directement sur le fichier (chargement/traitement/sauvegarde, copie-en-flux/renommage, etc.)
    2. Le programme charge le fichier en mémoire, effectue les opérations en mémoire quand le demande l'utilisateur, puis sauvegarde toute la mémoire dans le fichier.

    Et toi, dans ton opération de suppression, tu sembles tenter de faire un truc hybride: Tu as un tableau de marques en mémoire, mais ta suppression agit à la fois sur la mémoire et sur le fichier. C'est anormal.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Je pense que c'est cette notion que j'ai mal compris.
    Mon but et juste de demander a l'utilisateur une marque,de vérifier si elle est présente et si oui remplace l'espace par un *.
    Je vais continuer à cherché et SURTOUT à comprendre ce que je fais.
    Merci en tout cas pour ton temps

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 984
    Points
    30 984
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par doriandn Voir le message
    Mon but et juste de demander a l'utilisateur une marque,de vérifier si elle est présente et si oui remplace l'espace par un *.
    Bonjour
    C'est ce qu'on appelle une suppression "logique". Tu places une marque associée à l'information "supprimée et ensuite, les fonctions d'affichage n'affichent pas l'information qui a une marque. C'est d'ailleurs ce qui se passe avec la "corbeille".
    Avantages: rapidité dans la suppression, possibilité aussi de faire du "undelete"
    Inconvénients: perte d'espace disque, possibilité d'avoir un taux "informations obsolètes/informations présentes" trop décalé, nécessité de programmer une fonction destinée à supprimer réellement les informations marquées (en bdd on nomme ça une "réorganisation" et Postgres l'appelle "vacuum").
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Problème de structure "récursive"
    Par Pxnet dans le forum C
    Réponses: 5
    Dernier message: 21/01/2007, 17h20
  2. Problème de structures
    Par Zikas-r dans le forum C
    Réponses: 6
    Dernier message: 27/12/2006, 00h01
  3. Réponses: 16
    Dernier message: 21/08/2006, 14h12
  4. [Structures]Problème sur structures
    Par kendras dans le forum C++
    Réponses: 5
    Dernier message: 07/06/2006, 10h20
  5. [OCaml] Problème de structure/parser
    Par marv1 dans le forum Caml
    Réponses: 4
    Dernier message: 09/05/2005, 12h16

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