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 :

Probleme Fonction de Hachage


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Probleme Fonction de Hachage
    Bonjour a tous et merci par avance d'essayer de resoudre mon probleme.
    L'exo consiste a inserer/supprimer/rechercher des patronimes dans un tableau.
    Mon probleme vient du fait que j'arrive a compiler le prog (j'utilise codeblocks) mais que quand je lance l'exc ca plante.


    J'ai 6 warning dans mon programme qui je pense sont la cause du plantage de la fenetre ms-dos.
    Les 6 warnings sont :

    warning: passing arg 1 of `strcpy' makes pointer from integer without a cast
    warning: passing arg 1 of `strcmp' makes pointer from integer without a cast

    a chaque fois que je veux comparer ou copier mon tableau d'entier (ou chaque case pointe vers une chaine de caractere (patronime) )avec mon char rentrer par l'utilisateur.

    Si vous aviez une idée de comment contourner ceci et qu'au moins je puisse lancer mon prog et voir ce qui marche et ce qui ne marche pas ... je vous en serez reconnaissant

    Merci d'avance.

    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
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define N 20
    int T[N];
    int i;
     
    int inserer(char *s){
            int compteur=0;
            int n=0;
            char temp;
     
     
            for(i=0;i<(strlen(s)-1);i++){
                temp=s[i];
                compteur=compteur +(temp-96);
            }
            while(n<5){
                    if(strcmp(T[compteur%N],"")!=0){
                        temp=s[0];
                        compteur=compteur + 13*temp;
                        n++;
                    }
                    else{
                        strcpy(T[compteur%N],s);
                        return 1;
                    }
     
            }
    return 0;
    }
     
     
     
    int rechercher(char *s){
     
        for(i=0;i<N;i++){
            if(strcmp(T[i],s)!=0)
                return 0;
            else
                return 1;
        }
    }
     
    int supprimer(char *s){
     
         for(i=0;i<N;i++){
            if(strcmp(T[i],s)!=0)
                return 0;
            else{
                strcpy(T[i],"");
                return 1;
            }
         }
    }
     
     
     
    int main(){
            char *s;
            int i;
            int choix;
            for(i=0; i<N; i++)    /*initialisiation de T a 0*/
                strcpy(T[i], "");
            //int bool=1;          //booleen
     
            while(1){
                    printf("Entrez votre choix \n");
                    printf("1-Inserer \n");
                    printf("2-Rechercher \n");
                    printf("3-Supprimer \n");
                    printf("4-Fin du programme \n");
     
                    if(scanf("%d",&choix)==0)
                        return EXIT_FAILURE;
     
                    switch(choix){
                            case 1:
                                printf("Entrez un patronyme en minuscule\n");
                                if (scanf("%s",s)==0)
                                    return EXIT_FAILURE;
                                printf("Vous avez choisi la commande inserer \n");
                                if(inserer(s)==0)
                                    printf("Le patronyme n'a pu etre inserer \n");
                                else
                                    printf("Le patronyme a été inserer \n");
                                break;
     
                            case 2:
                                printf("Entrez un patronyme en minuscule\n");
                                if (scanf("%s",s)==0)
                                    return EXIT_FAILURE;
                                printf("Vous avez choisi la commande rechercher \n");
                                if(rechercher(s)==0)
                                    printf("Le patronyme n'est pas présent dans le tableau \n");
                                else
                                    printf("Le patronyme est présent dans le tableau \n");
                                break;
     
                            case 3:
     
                                printf("Entrez un patronyme en minuscule\n");
                                if (scanf("%s",s)==0)
                                    return EXIT_FAILURE;
                                printf("Vous avez choisi la commande supprimer \n");
                                if(supprimer(s)==0)
                                    printf("Le patronyme ne fait pas partit du tableau et n'a donc pas pu etre supprimer \n");
                                else
                                    printf("Le patronyme a bien été supprimer avec succes \n");
                                break;
     
                            case 4:
                                printf("Entrez un patronyme en minuscule\n");
                                if (scanf("%s",s)==0)
                                    return EXIT_FAILURE;
                                printf("Vous avez choisi la commande fin \n");
                                return EXIT_SUCCESS;
                                //break;
                            default:
                                printf("Vous n'avez pas choisi une commande valide \n");
                                printf("Veuillez refaire un choix \n");
                                break;
     
                    }
     
     
     
            }
    return EXIT_SUCCESS;
    }

  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
    T est un tableau de int, et tu fais un strcmp() sur T[quelque chose], donc strcmp() sur un int.
    N'y a-t-il rien qui te choque ?
    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
    Candidat au Club
    Inscrit en
    Novembre 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    T est un tableau de int, et tu fais un strcmp() sur T[quelque chose], donc strcmp() sur un int.
    N'y a-t-il rien qui te choque ?
    Si je sais bien comparer un int avec un char (enfin si c pas ca je vois pas ).
    Je sais que le smilblick vient de la .

    En fait ce que je veux faire c'est comparer la chaine de caractere qui est presente dans le tableau t[2] par exemple avec soit la chaine vide soit la chaine entrer par l'utilisateur. Mais je vois pas du tout comment coder ca. Je sais que c une belle boulette mais vu que c"'etait que des warning je me disait que ca passerai ^^

    Je sais que ton but est de me mettre sur la voie et pas de me filler la reponse mais si tu pouvais m'orintez d'une facon plus clair j'apprecierai.
    En tout ca smerci pour la rapiditer

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    308
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 308
    Points : 373
    Points
    373
    Par défaut
    En effet, tu essayes de comparer un entier avec une chaîne de caractères... Et aussi, je te conseille de grandement simplifier ton programme, et surtout de factoriser ton code !

    Tu répètes 4 fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    printf("Entrez un patronyme en minuscule\n");
    if (scanf("%s",s)==0)
    return EXIT_FAILURE;
    Pourquoi tu ne mets pas ce code avant ton switch ? Puisque de toutes façons ce code devra être exécuté !

    À part ça, en entier ne se compare pas à une chaîne de caractères, il faut que tu stockes la chaîne de caractères dans ton tableau pour pouvoir ensuite la comparer avec strcmp(), sinon tu changes de méthode.

    PS : Utilise les balises de code !
    PPS : Évite les variables globales !

  5. #5
    Candidat au Club
    Inscrit en
    Novembre 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bon j'ai quelque peu avancé grâce a votre aide. Mon prog now se lance et marche pour le cas 4 et le cas default (deja aps mal). Ca bug (ms-dos plante) sur les 3 autres cas (inserer/recherhcer/supprimer).

    voila 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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
     
    #include <stdlib.h>
    #include <string.h>
     
    #define N 20
    char *T[N];
    int i;
     
    int inserer(char *s){
            int compteur=0;
            int n=0;
            char temp;
     
     
            for(i=0;i<(strlen(s)-1);i++){
                temp=s[i];
                compteur=compteur +(temp-96);
            }
            while(n<5){
                    if(T[compteur%N]!=0){
                        temp=s[0];
                        compteur=compteur + 13*temp;
                        n++;
                    }
                    else{
     
                        T[compteur%N]=s;
                        return 1;
                    }
     
            }
    return 0;
    }
     
     
     
    int rechercher(char *s){
     
        for(i=0;i<N;i++){
     
            if(T[i]!=s[i] )
                return 0;
            else
                return 1;
        }
    }
     
    int supprimer(char *s){
     
         for(i=0;i<N;i++){
            if(strcmp(T[i],s)!=0)
                return 0;
            else{
                T[i]=0;
                return 1;
            }
         }
    }
     
     
     
    int main(){
            char *s;
            int i;
            int choix;
            for(i=0; i<N; i++)    /*initialisiation de T a 0*/
                T[i]=0;
            for(i=0; i<N; i++){
                printf("%s", T[i]);
                printf("\n");
            }
            int bool=1;          //booleen
     
            while(bool){
                    printf("Entrez votre choix \n");
                    printf("1-Inserer \n");
                    printf("2-Rechercher \n");
                    printf("3-Supprimer \n");
                    printf("4-Fin du programme \n");
     
                    if(scanf("%d",&choix)==0)
                        return EXIT_FAILURE;
     
     
     
                    switch(choix){
                            case 1:
                                printf("Entrez un patronyme en minuscule\n");
                                if (scanf("%s",s)==0)
                                    return EXIT_FAILURE;
                                printf("Vous avez choisi la commande inserer \n");
                                if(inserer(s)==0)
                                    printf("Le patronyme n'a pu etre inserer \n");
                                else
                                    printf("Le patronyme a été inserer \n");
                                break;
     
                            case 2:
                                printf("Entrez un patronyme en minuscule\n");
                                if (scanf("%s",s)==0)
                                    return EXIT_FAILURE;
                                printf("Vous avez choisi la commande rechercher \n");
                                if(rechercher(s)==0)
                                    printf("Le patronyme n'est pas présent dans le tableau \n");
                                else
                                    printf("Le patronyme est présent dans le tableau \n");
                                break;
     
                            case 3:
     
                                printf("Entrez un patronyme en minuscule\n");
                                if (scanf("%s",s)==0)
                                    return EXIT_FAILURE;
                                printf("Vous avez choisi la commande supprimer \n");
                                if(supprimer(s)==0)
                                    printf("Le patronyme ne fait pas partit du tableau et n'a donc pas pu etre supprimer \n");
                                else
                                    printf("Le patronyme a bien été supprimer avec succes \n");
                                break;
     
                            case 4:
     
                                printf("Vous avez choisi la commande fin \n");
                                bool=0;
                                return EXIT_SUCCESS;
                                break;
                            default:
                                printf("Vous n'avez pas choisi une commande valide \n");
                                printf("Veuillez refaire un choix \n");
                                printf("\n");
                                break;
     
                    }
     
     
     
            }
    return EXIT_SUCCESS;
    }
    Toujours en quête d'aide ^^ merci d'avance

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    308
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 308
    Points : 373
    Points
    373
    Par défaut
    Pourquoi t'as enlevé strcmp() alors que tu utilises des chaînes de caractères partout maintenant ??? Ta logique m'échappe.

    Ensuite, je t'ai dit de virer ces variables globales ! Utilise des variables définies dans le main() que tu passes aux fonctions que t'appelles.
    Et aère ton code aussi, évite d'utiliser 15 return dans ton code, fais des sorties de boucle correcte, c'est-à-dire lorsque la condition devient fausse sans utiliser une boucle infinie.

  7. #7
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main(void){
            char *s;
    ...
                    switch(choix){
                            case 1:
                                printf("Entrez un patronyme en minuscule\n");
                                if (scanf("%s",s)==0)
    ...
    La destination de ce scanf doit être un tableau de char pas un simple pointeur sur char. Créer un pointeur ne crée pas de place pour l'objet pointé mais de la place pour ... un pointeur.
    Idem pour les autres case.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int inserer(char *s){
    ....
                         T[compteur%N]=s;
    ...
    Copier l'adresse n'est pas bon. Si on fait cela, tous pointe vers la même chaîne (le tableau s de main dont en plus le contenu change tout le temps) . Il faut dupliquer la chaîne et mettre l'adresse de la copie dans T
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int rechercher(char *s){
    ...
            if(T[i]!=s[i] )
    ...
    Types incompatibles : T[i] est un char* et s[i] un char !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int supprimer(char *s){
    ...
                T[i]=0;
    ...
    T[i] = NULL;
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

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

Discussions similaires

  1. problème fonctions callback
    Par youp_db dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 02/10/2005, 14h47
  2. probleme fonction gethostbyname
    Par oclone dans le forum Développement
    Réponses: 6
    Dernier message: 14/04/2005, 10h31
  3. probleme fonction syntaxe
    Par gIch dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 28/02/2005, 09h52
  4. Fonction de Hachage
    Par Schlada dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h42
  5. Fonction de hachage
    Par killer crok dans le forum C
    Réponses: 12
    Dernier message: 02/10/2002, 09h48

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