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 :

Fonction bloquant les variables


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 25
    Par défaut Fonction bloquant les variables
    Bonjour,

    J'ai un problème, j'ai une fonction qui me permet de récuppérer le nom d'un fichier entré par l'utilisateur, puis d'ouvrir ce dit fichier. Lorsque j'appel cette fonction dans mon main après je ne peux plus créer/modifié de variables (ça me met une erreur de segmentation. Cependant, si je met le code de la fonction dans mon main (à la place de l'appeler) tout ce passe bien.

    Je ne comprend absolument pas ce qu'il ce passe, donc si quelqu'un peut m'aider...

    Voila mon 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
    #include <stdlib.h>
    #include <stdio.h>
     
    void ouvertureFichier (void);
    void genererGraphe (void);
     
    int main (int argc, char * argv[]) {
    	if (argc!=1) {
    		printf ("Les arguments sont inutils.\n\n");
    	}
     
    	int choix=0, erreur;
     
    	printf ("Bonjour,\n\nBienvenu dans ce programme qui permet de faire des oppérations sur les graphes. Plusieurs choix s'offrent à vous (entrez le numéro du choix pour y accéder).\n");
     
    	while (choix!=3) {
    		erreur=5;
    		while (choix<1 || choix>3) {
    			if (erreur==5) {
    				printf ("	1)Ouvrir un fichier formater pour faire des oppérations dessus.\n	2)Générer un graphe complet avec des poid aléatoires\n	3)Quitter le programme\n");
    				erreur=0;
    			}
    			scanf ("%d", &choix);
    			erreur++;
    		}
    		if (choix==1) {
    			ouvertureFichier();
    			choix=0;
    		}
    		if (choix==2) {
    			genererGraphe();
    			choix=0;
    		}
    	}
     
    	return 0;
    }
     
    void ouvertureFichier (void) {
    	char entree;
    	FILE* fichier=NULL;
     
    	printf ("Quelle fichier voulez-vous ouvrir ?\n");
    	scanf ("%s", &entree);
     
    	const char *nomFichier=&entree;
    	fichier=fopen(nomFichier, "a+");
     
    	if (fichier!=NULL) {
    		printf ("L'ouverture du fichier a été un succés.\n");
    	}
    	else {
    		printf ("Il y a eut un problème lors de l'ouverture du fichier.\n");
    	}
    }
     
    void genererGraphe (void) {
     
    }

    Merci

  2. #2
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Bonjour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #line 40
    char entree;
    FILE* fichier=NULL;
     
    printf ("Quelle fichier voulez-vous ouvrir ?\n");
    scanf ("%s", &entree);
    Hum...
    Tu es sûr d'avoir bien lu la description de scanf ?
    Citation Envoyé par Manuel UNIX
    s
    Correspond à une séquence de caractères différents des caractères blancs. Le pointeur correspondant doit être du type char *, et la chaine doit être assez large pour accueillir toute la séquence, ainsi que le caractère NUL final. La conversion s'arrête au premier caractère blanc, ou à la longueur maximale du champ.
    F.A.Q. C: Comment lire une ligne de manière securisée ?

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 25
    Par défaut
    J'ai dût la lire il y a longtemps, et il est clair que je ne l'avais plus en tête lorsque j'ai codé. Cepandent, si je met char entree[50];, ou char *entree[50]; ça ne compile même pas ! J'ai (je pense) résolut le problème avecla fonction gets().


    Il y a quand même une question qu'il me reste, pourquoi quand je mets le code dans la fonction et que j'appel la fonction dans le main ça fout le bordel, alors que quand je mets le code directement dans le main ça ce passe bien ?

  4. #4
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Bonsoir,

    1.) Tu essayes d'entrer des caractères dans un char ! Il te faut une chaine de caractères pour entrer ton nom de fichier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char entree[256] = "" ;
    2.) Attention avec le scanf et les chaines de caractères. Le format %s prendra tous les caractères jusqu'à trouver le caractère espace ou Entrée.
    Un conseil, utilise la fonction fgets() qui est beaucoup plus sécuritaire (voir sur ce forum les sujets à propos de cette fonction).

    3.) Ton pointeur const char *nomFichier n'est pas utile. Tu peu utiliser directement la variable locale entree pour l'appel à la fonction fopen.

    4.) A l'ouverture de ton fichier, le descripteur est une variable locale. A la sortie de ta fonction, tu le perdras et tu ne pourras pas lire/écrire/fermer ton fichier. Il serait plus utile de faire une fonction qui te retourne le descripteur du fichier (FILE *) ou bien une fonction qui ouvre ton fichier puis lit/écrit les données et ferme le fichier.


    Bonne continuation.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 25
    Par défaut
    2) C'est ce que j'ai vu aussi dans un livre, ça n'a pas l'aire de faire bon ménage ! :s
    La fonction fgets(), n'est pas seulement pour lire dans un fichier ? On peut aussi s'en servir pour lire une entrée clavier ?

    3) Effectivement il n'y a pas besoin que la variable soit en const, je l'avais mit pour coller le plus possible au prototype de le fonction.

    4) C'est sûr qu'un fonction qui ne fait que lire un fichier ça n'est pas très utile ! J'avais fait juste ça pour savoir si je pouvait réussir à ouvrir un fichier en entrant le nom au clavier, jusqu'à présent je le passait toujours en argv.
    Ca ne servait à rien d'en faire plus si je n'arrivé même pas à ouvrir le fichier ! Mais maintenant ma fonction est super puissante ! :p


    Merci pour votre aide

  6. #6
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Citation Envoyé par phantomlibre Voir le message
    La fonction fgets(), n'est pas seulement pour lire dans un fichier ? On peut aussi s'en servir pour lire une entrée clavier ?
    Si tu avais lu l'entrée de la FAQ que j'ai indiqué, tu saurais que oui.

    fgets sert à lire une ligne depuis un flux.
    Un fichier ouvert à l'aide de fopen est effectivement vu comme un flux dans le programme.
    Mais ce ne sont pas les seuls !

    L'entrée standard, la sortie standard et la sortie d'erreur standard ne sont que des fichiers un peu particuliers, ouverts en tant que flux au démarrage du programme et fermés à la fin.
    stdin,stdout et stderr, ça te dit quelque chose ?
    Eh bien ce sont les flux associés.
    Les fonctions spécifiques à l'entrée ou la sortie standard sont souvent des raccourcis pour la fonction générale associée (travaillant avec un flux quelconque).

    Essaie donc !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    printf("Hello World!\n");
    fprintf(stdout, "Hello World!\n");
    /****************/
    int n;
    scanf("%d", &n);
    fscanf(stdin, "%d", &n);

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

Discussions similaires

  1. Questions sur les fonctions et les variables
    Par dam28800 dans le forum jQuery
    Réponses: 2
    Dernier message: 10/08/2010, 09h54
  2. Réponses: 4
    Dernier message: 08/09/2008, 15h36
  3. Réponses: 5
    Dernier message: 28/02/2008, 14h35
  4. E-Mail dont les éléments sont fonction d'une variable
    Par j.p.mignot dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 15/01/2008, 18h52
  5. Formulaires : envoyer les variables de la fonction
    Par Corinne dans le forum Général JavaScript
    Réponses: 23
    Dernier message: 27/07/2007, 18h00

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