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 copie de tablo via un pointeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Octobre 2006
    Messages : 54
    Par défaut Problème de copie de tablo via un pointeur
    Salut à tous, j'ai un petit problème avec une fonction que j'ai écrite, en fait celle ci reçoit deux arguments, le premier est un pointeur qui pointe vers l'adresse d'un tablo (le premier charactère de ce tableau) et le second argument est une variable qui indique le nombre d'entiers que vas recevoir le tablo de la fonction, 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
     
    float lesnotes(float *note,int i)
    {
    	char entre;
    	int c;
    	float tablo[100];
    	// La boucle for permet à l'utilisateur d'entrer chacune des notes et de les assigner au tablo
    	for(c=0;i>0;i--,c++)
    	{
    	printf("vous devez encore taper: %d note\n",i);
    	entre=fgetc(stdin);
    	tablo[c]=entre;
    	if(entre!='\n')
    	{
    	purger();
    	}
    	}
    	for(c=0;tablo[c]!='\n';c++)
    	{
    	note[c]=tablo[c];
    	}
    return tablo[0];
    }
    En fait cette fonction s'exécute à peu près correctement puis le programme bug et s'arrete subitement...

    ps: la fonction purger que l'on voit apparaitre sert simplement à purger le flux d'entrée standart...

  2. #2
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut
    tu as defini entre comme un char et pas comme un float !
    et quand tu tape une bonne note (de plus d'un chiffres ^^), ca doit planter...

  3. #3
    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 giggs
    Salut à tous, j'ai un petit problème avec une fonction que j'ai écrite, en fait celle ci reçoit deux arguments, le premier est un pointeur qui pointe vers l'adresse d'un tablo (le premier charactère de ce tableau) et le second argument est une variable qui indique le nombre d'entiers que vas recevoir le tablo de la fonction, 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
     
    float lesnotes(float *note,int i)
    {
    	char entre;
    	int c;
    	float tablo[100];
    	purger();
    	// La boucle for permet à l'utilisateur d'entrer chacune des notes et de les assigner au tablo
    	for(c=0;i>0;i--,c++)
    	{
    	printf("vous devez encore taper: %d note\n",i);
    	entre=fgetc(stdin);
    	tablo[c]=entre;
    	purger();
    	}
    	for(c=0;tablo[c]!='\n';c++)
    	{
    	note[c]=tablo[c];
    	}
    En fait cette fonction s'exécute à peu près correctement puis le programme bug et s'arrete subitement...

    ps: la fonction purger que l'on voit apparaitre sert simplement à purger le flux d'entrée standart...
    Le principe qui doit être respecté partout, c'est
    1. j'utilise
    2. je nettoie

    Donc, il ne faut pas commencer par appeler purger(), c'est absurde et ça peut créer une attente non désirée si le tuyau est vide... Par contre, après le fgetc(), OK, mais uniquement si le caractère saisie est différent de '\n', sinon, le tuyau est déjà vide, donc même problème...

    Il ne faut pas appeler la fonction de purge à tord et à travers...

    Pour revenir à ton code, tu cherches à faire quoi exactement ? Parce que fgetc(), ça retourne la valeur d'un caractère ou EOF, pas une valeur numérique de type float.

    Bref, ce code est horrible.

    Explique exactement ce que tu cherches à faire. On cherchera quel est le meilleur moyen de le faire.

  4. #4
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut
    ah oui...j'avais pas fais gaffe a l' fgetc()...
    a mon avis là, tu peus utiliser scanf()...j'espere ne pas me faire taper sur les doigts....
    sinon tu peux toujour utiliser un tableau de char
    et fgets() ou getchar()....
    puis strtof pour convertir en float !

    mais la je ne voi vraiment pas les problemes que pourrai causer scanf()
    si tu purge apres...

  5. #5
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Citation Envoyé par kamouminator
    a mon avis là, tu peus utiliser scanf()...j'espere ne pas me faire taper sur les doigts....
    Ce n'est pas moi qui te taperais sur les doigts mais si tu t'en doutais alors il ne fallait pas en faire part.
    scanf est bien difficile à utiliser et puis dans le cas où il entre tout simplement autre chose qu'un nombre dans son cas...aie!

    Une méthode bien plus sure, une fonction qui saisie un caractère sur le flux stdin(getc(stdin), getchar), vérifier la saisie, la convertir si nécessaire avec les fonctions strto*() avant de la sauver dans le tableau.

    Bonne soirée.

    Nota: Bien utiliser scanf

  6. #6
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Octobre 2006
    Messages : 54
    Par défaut
    Ok, voila quelques corrections:
    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
     
    float lesnotes(float *note,int i)
    {
    	float entre;
    	int c;
    	float tablo[100];
    	// La boucle for permet à l'utilisateur d'entrer chacune des notes et de les assigner au tablo
    	for(c=0;i>0;i--,c++)
    	{
    	printf("vous devez encore taper: %d note\n",i);
    	scanf("%f",&entre);
    	tablo[c]=entre;
    	if(entre!='\n')
    	{
    	purger();
    	}
    	}
    	for(c=0;tablo[c]!='\n';c++)
    	{
    	note[c]=tablo[c];
    	}
     
     
    return tablo[0];
    }
    ça à l'air de marcher comme ça...scanf a l'air OK.

  7. #7
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut
    tu pourrais le faire directement sur le tableau note...non ?
    et:
    ne sert plus a rien la !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for(c=0;i>0;i--,c++)
        {
        printf("vous devez encore taper: %d note\n",i);
        scanf("%f",&entre);
        note[c]=entre;
        purger();
        }

  8. #8
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut
    en plus je ne crois pas qu'il soit necessaire de purger dans ce cas...mais la je ne suis sur de rien...je crois que quand le scanf ne reussi pas y'a des problemes...d'ailleur il faudrais tester ce que renvoi ton scanf():
    dans le cas ou l'utilisateur tappe autre chose que des chiffres scanf ne va pas reussir

  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 giggs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	scanf("%f",&entre);
    	if(entre!='\n')
    	{
    	purger();
    	}
    Ca, c'était pour fgetc(). Avec scanf(), c'est ... compliqué...

    http://xrenault.developpez.com/tutoriels/c/scanf/

    En gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	ret = scanf("%f",&entre);
    	if(ret != 1)
    	{
    	   purger();
    	}
    C'est pourquoi je recommande l'usage exclusif de fgets() suivit d'un fonction de nettoyage (fclean() souvent décrite sur ce forum).

    Ensuite, on fait la conversion qui va bien (ici, strtod()). Au fait, le type natif des flottants est double et non float...

  10. #10
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Ca, c'était pour fgetc(). Avec scanf(), c'est ... compliqué...

    http://xrenault.developpez.com/tutoriels/c/scanf/

    En gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	ret = scanf("%f",&entre);
    	if(ret != 1)
    	{
    	   purger();
    	}
    Non ca ne fonctionnera pas, tant que la saisie va debuter par un chiffre (ou - , + ou . suivi d'un chiffre) scanf va retourner 1 (une conversion a bien pu etre faite) mais ca ne signifiera pas qu'il ne reste pas de caracteres dans stdin.
    En particulier avec une saisie de la sorte, il restera toujours au moins le \n, il faut donc toujours appeler purge.

  11. #11
    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 gl
    Non ca ne fonctionnera pas, tant que la saisie va debuter par un chiffre (ou - , + ou . suivi d'un chiffre) scanf va retourner 1 (une conversion a bien pu etre faite) mais ca ne signifiera pas qu'il ne reste pas de caracteres dans stdin.
    En particulier avec une saisie de la sorte, il restera toujours au moins le \n, il faut donc toujours appeler purge.
    OK. Je savais bien que je ne savais pas me servir de scanf()...

Discussions similaires

  1. Problème de copie d'une machine à l'autre via SSH
    Par junior222 dans le forum Général Java
    Réponses: 2
    Dernier message: 18/08/2014, 14h26
  2. Problème de copie d'un objet psycopg2 via deepcopy
    Par Sve@r dans le forum Général Python
    Réponses: 12
    Dernier message: 06/08/2012, 22h00
  3. [C#] Copie de fichier via l'API
    Par slyv dans le forum Windows Forms
    Réponses: 5
    Dernier message: 20/12/2004, 22h39
  4. [C#] Copie de fichier via l'API
    Par slyv dans le forum Windows
    Réponses: 5
    Dernier message: 20/12/2004, 22h35

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