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 :

Appel de fonction avec une structure en argument


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2017
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Appel de fonction avec une structure en argument
    Bonjour,

    Je suis un débutant en langage c. Actuellement à l'école, nous apprenons comment faire appel à des fonctions autres que la "main" dans le "main". Pas de problème, sauf que dans celle-ci je veux lui donner un tableau de structure en argument.
    Je m'explique, voici 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
     
    #include "stdafx.h"
    #include "stdio.h"
     
    //Structure
    typedef struct emission emission;
     
    struct emission
    {
    	int duree;
    	char titre[30];
    };
     
    //PROTOTYPE
    int obtenir(emission[]);
     
    //Programme
    void main(void) {
    	int retour;
    	int cpt;
    	emission programme[30];
    	printf("Bienvenue dans le programme\n");
    	retour = obtenir(programme);
    	for (cpt = 0; cpt < 30; cpt++)
    	{
    		printf("%d", programme[cpt].duree);
    		printf("%s", programme[cpt].titre);
    	}
    	printf("%d", retour);
    	getchar(); 
    }
    //Fonction
    int obtenir(emission programme[])
    {
    	int cpt;
    	for (cpt = 0; cpt < 30; cpt++)
    	{
    		printf("Duree de l'émission ?\n");
    		scanf_s("%d", programme[cpt].duree);
    		return 0;
    	}
    }
    Dans la fonction obtenir, je voudrais pouvoir obtenir la durée et le titre d'un émission. Visual studio ne me montre aucune erreur et exécute bien le programme mais lorsque je tape le premier nombre pr la durée, visual studio bug et envoie un message d'erreur:
    Nom : Capture.PNG
Affichages : 3038
Taille : 10,8 Ko

    Voila, merci beaucoup pour votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 669
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 669
    Points : 10 674
    Points
    10 674
    Par défaut
    RTFM: scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l

    Prototype:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int scanf_s(  
       const char *format [,  
       argument]...   
    );

    Édit: Ce n'était pas précisé dans le prototype, la contrainte argument
    Chaque argument doit être un pointeur vers une variable d'un type qui correspond à un spécificateur de type dans format.

    Indication:
    int X; -> une variable X
    int* pX = &X; -> un pointeur et & pour prendre l'adresse d'1 variable

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2017
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    désolé foetus, mais je ne comprend pas ce que tu as voulu dire par ton message :/

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par devilezf Voir le message
    désolé foetus, mais je ne comprend pas ce que tu as voulu dire par ton message :/
    Bonjour

    On ne t'as pas appris, dans ton école, qu'une fonction ne peut modifier une variable extérieure que si elle reçoit l'adresse de cette variable ???

    Ce qui ne marche pas
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void fct(int x, int n)
    {
    	x=n;			// Inutile vu que x est local donc sera détruit en fin de fonction
    }
     
    int main()
    {
    	int zzz=0;
    	fct(zzz, 500);			// Ne fonctionne pas
    	printf("%d\n", zzz);		// Affichera toujours 0
    }

    Ce qui marche
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void fct(int *pt, int n)
    {
    	*pt=n;		// Ici aussi "pt" local sera détruit en fin de fonction... mais ce n'est pas "pt" qui est remplie mais la variable qui se trouve à l'adresse contenue dans "pt". Et cette variable, elle, n'est pas détruite.
    }
     
    int main()
    {
    	int zzz=0;
    	fct(&zzz, 500);			// Ok
    	printf("%d\n", zzz);		// Affichera bien 500
    }


    Donc c'est pareil aussi pour scanf_s() (et en fait aussi pour toutes les fonctions)
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (cpt = 0; cpt < 30; cpt++)
    {
    	printf("Duree de l'émission ?\n");
    	scanf_s("%d", &programme[cpt].duree);
    	...
    }


    Maintenant des remarques plus générales:
    • typedef struct emission emission => t'es sûr de pouvoir te relire dans 6 mois ??? Et si tu veux créer une variable nommée "emission" ??? => typedef struct s_emission t_emission => ce n'est pas plus lisible ??? Ben quoi qu'il en soit c'est au-moins conforme aux conventions
    • void main() => t'es sûr que c'est comme ça qu'on t'a appris/décrit la fonction "main()" dans ton école ???
    • Code c : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      for (cpt = 0; cpt < 30; cpt++)
      {
      	...
      	return 0;
      }
      => là je dis "respect". Sans déconner, même quand on est débutant on est quand-même sensé savoir ce que fait l'instruction return et son impact quant à la mettre dans la boucle...

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2017
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    omg franchement désolé, oui je l'ai vu mais je vous avoue faire du c, en même temps du packet tracer et en s'occupant de son petit frère, c'est pas top :/.


    "typedef struct emission emission => t'es sûr de pouvoir te relire dans 6 mois ??? Et si tu veux créer une variable nommée "emission" ??? => typedef struct s_emission t_emission => ce n'est pas plus lisible ??? Ben quoi qu'il en soit c'est au-moins conforme aux conventions"
    ---> C'est juste pour tester comment cela fonctionne avec des structures donc pas besoin de savoir ce relire.


    void main() => t'es sûr que c'est comme ça qu'on t'a appris/décrit la fonction "main()" dans ton école ???
    ----> Oui, on a toujours utiliser la fonction main de cette façon. Pourquoi ? Cela n'est pas bon ?

    => là je dis "respect". Sans déconner, même quand on est débutant on est quand-même sensé savoir ce que fait l'instruction return et son impact quant à la mettre dans la boucle...
    ----> Oui désolé aussi, un return retourne une variable à la fonction principale et "termine" la fonction dans laquelle il se trouve. Un peu comme un break dans un switch case.

  6. #6
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 486
    Points : 6 169
    Points
    6 169
    Par défaut
    Bonjour,
    Citation Envoyé par devilezf Voir le message
    void main() => t'es sûr que c'est comme ça qu'on t'a appris/décrit la fonction "main()" dans ton école ???
    ----> Oui, on a toujours utiliser la fonction main de cette façon. Pourquoi ? Cela n'est pas bon ?
    Normalement, le type de retour de main doit être int.
    Comme ça, le programme peut retourner un code qui indique si le programme s'est bien exécuté ou s'il y a eu une erreur.
    Par exemple, retourner 0 indique que le programme s'est exécuté correctement.

    Si le type de retour de main n'est pas compatible avec int (par exemple void), alors le programme retourne quand même un code, mais dont la valeur n'est pas spécifiée.

    La valeur de retour d'un programme, c'est une information qu'on peut récupérer, par exemple, quand on appelle le programme depuis un script.
    Normalement, l'école devrait faire prendre l'habitude aux étudiants de choisir int comme type de retour de main, même sans leur expliquer tout de suite à quoi ça sert.

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par devilezf Voir le message
    "typedef struct emission emission => t'es sûr de pouvoir te relire dans 6 mois ??? Et si tu veux créer une variable nommée "emission" ??? => typedef struct s_emission t_emission => ce n'est pas plus lisible ??? Ben quoi qu'il en soit c'est au-moins conforme aux conventions"
    ---> C'est juste pour tester comment cela fonctionne avec des structures donc pas besoin de savoir ce relire.
    Même pour tester, si on prend immédiatement les bonnes habitudes ça devient un réflexe et quand ce sera "pour de vrai" on n'aura pas de souci...

  8. #8
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 225
    Points : 10 174
    Points
    10 174
    Par défaut
    Peut être que cette réponse ne sert a rien mais je confirme ce que dit Sve@r même pour un test il faut bien écrire son code.

    Le gros souci qu'on les débutants après quelque mois de pratique ce n'est pas le langage en lui même , mais bien le manque de rigueur.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2017
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup pour les conseils que vous m'avez donné. J'essaierais de m'en souvenir pour mes prochains codes

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

Discussions similaires

  1. [Prototype] Ajax.Request et onSuccess : appel de fonction avec plusieurs arguments
    Par gregbond dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 18/10/2012, 17h00
  2. appel de fonction avec une chaine en paramètre
    Par sebac dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/01/2012, 15h59
  3. Réponses: 10
    Dernier message: 18/05/2007, 12h47
  4. fonctions stockées avec une table en argument
    Par bdkiller dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 08/10/2004, 23h17

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