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 :

petit problème en c


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 364
    Par défaut petit problème en c
    Salut à tous, je suis en train d'apprendre le c mais la j'ai un petit problème pour ce code la. En fait, je ne comprends pas pourquoi il ne me renvoie pas le tableau avec l'élément que je viens d'insérer. Voici en bref les lignes de codes de mon programme :

    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
    #include <stdio.h>
    #include <math.h>
     
    #define MAX 10
     
    typedef struct tab {
    	int t[MAX];
    	int fin;
    }tab;
     
    tab F;
     
    int rechercher(tab S,int elt)
    {
    	int i;
     
    	for(i=0;i<=S.fin;i++)
    	{
    		if(elt==S.t[i])
    			return i;
    	}
    	return 0;
    }
     
    tab inserer(tab S, int elt)
    {
    	int i=0;
     
    	while(S.t[i]!=-1)
    	{
    		printf("coucou \n");
    		i++;
    	}
    	printf("indice i : %d \n",i);
    	S.t[i]=elt;
    	printf("indice courant %d \n",i);
    	printf("Voila ce que j'ai inserer %d \n",S.t[i]);
    	return S;
    }
     
    void main()
    {
    	int i;
     
    	//tab F;
    	F.fin = 10;
    	for(i=0;i<=10;i++)
    	{
    		F.t[i]=-1;
    	}
     
    	inserer(F,5);
    	printf("Je regarde la première case %d \n",F.t[0]);
    	inserer(F,4);
    	inserer(F,2);
    	inserer(F,6);
    	inserer(F,9);
    	inserer(F,8);
    	inserer(F,7);
    	printf("Voici l'indice ou se trouvre la valeur rechercher %d \n ",rechercher(F,2));
     
    }
    Si vous avez une idée, ça serait gentil de m'en faire part. Merci à tous d'avance. Et vive le C par rapport au CAML.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Tu passes une structure par valeur, et la structure contient le tableau "en dur" : Donc, la structure modifiée est locale à la fonction (puis elle est retournée).

    Si tu veux modifier la structure "sur place", passe son adresse : ta fonction doit prendre un pointeur sur tab (un tab *) et modifier la structure pointée.
    Tu appelles alors ta fonction en lui passant &F (l'adresse de F)
    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
    Membre Expert
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Par défaut
    Salut,
    1) Bon d'abord les balises Code: cela evitera les 8) dans le code.
    2) ton main n'a pas une bonne signature, ca n'a rien à voir mais si deja tu débutes..
    2) Stp des indentations parce que la c'est illisible même pour un prog aussi simple

  4. #4
    Membre Expert
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Par défaut
    Effectivement le plus gros probleme viens de la confusion entre passage par adresse et passage par valeur.
    Mais egalement un gros bug --->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    F.fin = 10;
    for(i=0;i<=10;i++)
    {
       F.t[i]=-1;
    }
    Comme cela tu va itérer dans les 11 premieres cellules du tableau hors tu n'en n'a défini que 10 -->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #define MAX 10
     
    typedef struct tab {
    int t[MAX];
    int fin;
    }tab;
    Donc forcément ca va faire BOUM

    Sinon une fois modifié ton code donne un truc du genre: (a tester)
    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
     
    #include <stdio.h>
    #include <math.h>
     
    #define MAX 10
     
    typedef struct tab {
       int t[MAX];
       int fin;
    }tab;
     
    tab F;
     
    int rechercher(tab *S,int elt)
    {
       int i;
     
       printf("***elt=%d\n",elt);
       printf("***fin=%d\n",S->fin);
       for(i=0;i<=S->fin;i++)
       {
          printf("cherche=%d\n",S->t[i]);
          if(elt==S->t[i])
             return i;
        }
     
        /*
        0 est une position donc il faut renvoyer autre chose pour detecter
        la non detection :-)
       */
     
        return -1;
    }
     
     
    //Qui de l'utilité du type de retour
    tab inserer(tab *S, int elt)
    {
        int i=0;
        while(S->t[i]!=-1)
        {
          printf("coucou \n");
          i++;
        }
        printf("indice i : %d \n",i);
        S->t[i]=elt;
     
        //Remarque la defference
        return *S;
    }
     
    int main(int arg, char** argv)
    {
       int i;
     
       //tab F;
       F.fin = 10;
       for(i=0;i<10;i++)
      {
          F.t[i]=-1;
       }
     
       inserer(&F,5);
       printf("Je regarde la premiè case %d \n",F.t[0]);
       inserer(&F,4);
       inserer(&F,2);
       inserer(&F,6);
       inserer(&F,9);
       inserer(&F,8);
       inserer(&F,7);
       printf("Voici l'indice ou se trouvre la valeur rechercher %d \n   ",rechercher(&F,2));
     
    }

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 364
    Par défaut
    Merci bien je vais, tester ce code.
    Et voir si sa marche bien.
    Pour le bug il faut que je supprime le '=' comme cela il tournera jusqu'à 9.

    F.fin = 10;
    for(i=0;i<10;i++)
    {
    F.t[i]=-1;
    }

    Et désolé pour l'indentation, j'ai récupérer le fichier avec le bloc notes au lieu d'emacs.
    Et niveau signature du main, je ne vois pas où est le problème je ferme bien mais balise { }.
    Et c'est vrai à chaque fois j'oublie les passages par adresses ou par valeurs, je trouve sa assez galère mais bon il faut que sa rentre.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9
    Par défaut
    Pour la signature du main, il ne s'agit pas des fermetures ouvrantes ou fermantes (celles ci sont obligatoires).

    La signature du main doit avoir une valeur à renvoyer pour indiquer si le programme s'est bien terminé ou pas.

    Et aussi le main peut avoir des paramètres à recevoir si ton programme est éxecuté en ligne de commande. Mais c'est optionnel.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 364
    Par défaut
    Ah Ok .
    Merci pour le renseignement je croyais que l'on pouvait mettre void main.

    Donc en fait, je dois mettre int main {

    et à la fin return -1 }

    par exemple.

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Attention les retours corrects sont EXIT_SUCCESS ou EXIT_FAILURE définis dans <stdlib.h>.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par tazmania
    Merci pour le renseignement je croyais que l'on pouvait mettre void main.
    Non.

    http://emmanuel-delahaye.developpez....s.htm#typemain

    Donc en fait, je dois mettre int main {

    et à la fin return -1 }
    Non. Les valeurs portables sont
    0
    EXIT_FAILURE
    EXIT_SUCCESS

    Les deux dernières sont définies dans <stdlib.h>

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 364
    Par défaut
    Ok merci, pour cette réponse clair et précise, avec le lien en plus qui donne l'esplication.
    Donc je vais changer mon programme avec toutes vos modifications.
    Encore merci à tous pour vos réponses. 8)

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 364
    Par défaut
    J'ai testé le code hier soir, il marche super bien, aucune erreur et aucun plantage.
    Je vous remercie encore pour votre aide.

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

Discussions similaires

  1. un petit problème d'algo
    Par supertramp dans le forum Algorithmes et structures de données
    Réponses: 22
    Dernier message: 12/10/2004, 20h13
  2. Petit problème de décimales !
    Par ridan dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/09/2004, 21h24
  3. Réponses: 17
    Dernier message: 13/07/2004, 20h37
  4. petit problème premier plan, arrière plan
    Par gros bob dans le forum OpenGL
    Réponses: 4
    Dernier message: 19/04/2004, 12h00
  5. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 18h55

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