Aide dans une fonction en langage C (débutant)
Répondre à la discussion
Affichage des résultats 1 à 27 sur 27

Aide dans une fonction en langage C (débutant)



  1. #1
    hanafi_hamza

    Aide dans une fonction en langage C (débutant)


    ------

    Salut les amis,
    je programme en c, et j'ai une structure Etudiant qui comtient 3 variables (int code, char *nom et float moy)
    Je fais une fonction qui me permet de lire les étudiants que j'ai !
    voila ce que j'ai fais:
    Code:
    void Lecture(Etudiant Et[] , int *n)
    {
    int i;
    	printf("donner le nombre des etudiants");
    	n=(int*)malloc(sizeof(int));
    	scanf("%d",n);
    	printf("%d",*n);
    	printf("je suis la \n");
    	for(i=0;i<(*n);i++);
    	{
    	    printf("entrer le code de l'etudiant");
    	    scanf("%d",&Et[i].code);
    	    printf("entrer le nom de l'etudiant");
                scanf("%s",Et[i].nom);
    	    printf("entrer la moyenne de l'etudiant");
     	    scanf("%f",&Et[i].moy);
    	}
    }
    et voila mon main():
    main()
    {
    	Etudiant *Et;
    	int *n;
    	Et=(Etudiant*)malloc(sizeof(Etudiant));
    	n=(int*)malloc(sizeof(int));
    	Lecture(Et,n);
    	return 0;
    }
    mon problème c'est que j'arrive pas à completer la saisie, y'a aucun erreur lors de la compilation mais le programme cesse de fonctionner dès que je termine la saisie du premier étudiant !!
    Quelqu'un peut m'aider et Merci

    -----
    Dernière modification par Jack ; 02/10/2014 à 08h09. Motif: balises code

  2. #2
    Jack
    Modérateur

    Re : Aide dans une fonction en langage C (débutant)

    Il faut lire les règles du forum programmation:
    http://forums.futura-sciences.com/pr...ves-forum.html

    La présentation du code doit se faire avec les balises code. Merci d'y penser la prochaine fois.

  3. #3
    Jack
    Modérateur

    Re : Aide dans une fonction en langage C (débutant)

    Pourquoi cette ligne dans la fonction Lecture?

    Code:
    n=(int*)n=(int*)malloc(sizeof(int));
    puisque n a déja été instanciée dans la fonction main.

    De plus, ton tableau d'Etudiant n'a été instancié que pour un seul étudiant:
    Code:
    Et=(Etudiant*)malloc(sizeof(Etudiant));
    Il faudrait l'instancier dans la fonction, lorsque tu connais le nombre d'étudiants.

  4. #4
    hanafi_hamza

    Re : Aide dans une fonction en langage C (débutant)

    Salut Jack,
    Je suis désolé J'ai rien compris
    Comment je ferai donc pour que mon tableaux d'etudiant contient plus d'un seul etudiant ?


  5. A voir en vidéo sur Futura
  6. #5
    Bluedeep

    Re : Aide dans une fonction en langage C (débutant)

    Je ne comprends pas.
    Quel est l’intérêt de ça :

    Code:
    n=(int*)malloc(sizeof(int));
    surtout avec ce test

    Code:
    for(i=0;i<(*n);i++);
    Qui n'a aucune chance de sortir de manière déterministe, *n étant indéterminé.

    Ca me fait penser à du "cargo cult programming".

  7. #6
    hanafi_hamza

    Re : Aide dans une fonction en langage C (débutant)

    Bluedeep
    J'efface cette ligne
    Code:
    n=(int*)malloc(sizeof(int));
    de la fonction lecture
    mais elle dois rester dans le main() puisque je connais pas encore la dimmention !

    pourquoi j'arrive pas à déclarer le tableau Etudiant comme ça
    Code:
    Etudiant Et[];
    dans le main()
    et plutôt je la fais dans la fonction et ça marche
    comment je peux déclarer mon tableau Etudiant au main() dont sa dimmention je la connais pas?

  8. #7
    Bluedeep

    Re : Aide dans une fonction en langage C (débutant)

    Citation Envoyé par hanafi_hamza Voir le message
    comment je peux déclarer mon tableau Etudiant au main() dont sa dimmention je la connais pas?
    Si vous voulez travaillez avec un tableau dont vous ne connaissez pas la taille a priori il n'y a pas 36 solutions, il y en a en gros 3 :

    1 - laisser le C et changer de langage pour un langage acceptant des tableaux à accroissement dynamique.
    2 - en C, utiliser une liste chaînée au lieu d'un tableau.
    3 - en C, utiliser un tableau de taille arbitraire et gérer une recopie en situation d'overflow; c'est à dire allouer n positionss dans le tableau (n=10, par exemple) et quand c'est atteint créer un tableau avec 20 (ou 12 ou 50 ou 42008) positions, recopier le premier dedans et travailler sur le deuxième, et ainsi de suite.

    Comme cela semble être un exercice, on exclut le 1).
    Le 3) est assez inélégant et sur le papier augmente la charge CPU à chaque overflow.
    Le 2) est la solution normale dans ce cas de figure.

    Néanmoins, je maintiens que vous avez fait du "cargo cult programming" : vous avez pompé des lignes de codes sur internet (ou sur un bouquin) sans s'interroger sur leur signification.

    Sinon, chercher "listes chainées en C" sur internet pour la bonne solution.
    Dernière modification par Bluedeep ; 02/10/2014 à 11h52.

  9. #8
    alfounet

    Re : Aide dans une fonction en langage C (débutant)

    Bonjour,

    Il faut que tu déclare une variable tableau avant ton main. "int tab= [x, y].

    tu as un cours de langage C dans le forum électronique vas y faire un tour il parle des tableaux.

    bon courage.

  10. #9
    Bluedeep

    Re : Aide dans une fonction en langage C (débutant)

    Citation Envoyé par alfounet Voir le message
    ,

    Il faut que tu déclare une variable tableau avant ton main. "int tab= [x, y].
    .
    Non.
    Il ne connait pas la taille initiale qu'il doit affecter au tableau.
    Il vaut donc mieux utiliser une linked list

  11. #10
    alfounet

    Re : Aide dans une fonction en langage C (débutant)

    Exact si tu ne connais pas le nombre d'entrée.

    Bon courage.

  12. #11
    hanafi_hamza

    Re : Aide dans une fonction en langage C (débutant)

    Merci, je vais chercher un cours des liste chaînées

  13. #12
    Bluedeep

    Re : Aide dans une fonction en langage C (débutant)

    Vous avez ça qui est pas mal fait sur la question : http://www.cprogramming.com/tutorial/c/lesson15.html

  14. #13
    Jack
    Modérateur

    Re : Aide dans une fonction en langage C (débutant)

    Il faudrait connaitre les données exactes du problème avant de tout remettre en question.

    Il est possible de travailler avec un tableau, mais si la taille doit être définie dans la fonction Lecture, il suffit de le déclarer dynamiquement une fois le nombre n d'étudiants connu. Pourquoi également ne pas laisser la fonction retourner ce nombre n? Ca éviterait de le passer par adresse dans la fonction.

    Le prototype de la fonction deviendrait:

    int Lecture(Etudiant* Et);
    Dernière modification par Jack ; 03/10/2014 à 08h03. Motif: oubli d'un espace

  15. #14
    fred1599

    Re : Aide dans une fonction en langage C (débutant)

    1 - laisser le C et changer de langage pour un langage acceptant des tableaux à accroissement dynamique.
    2 - en C, utiliser une liste chaînée au lieu d'un tableau.
    3 - en C, utiliser un tableau de taille arbitraire et gérer une recopie en situation d'overflow; c'est à dire allouer n positionss dans le tableau
    Il y a une 4ème solution, tout déclarer en statique, en indiquant les valeurs maximales adéquates selon le problème. C'est à dire la capacité maximale de l'étalissement, et le nombre de caractères maximal pour un nom d'étudiant.

    Quand on est débutant on ne s'amuse ni avec l'allocation dynamique, ni avec les listes chaînées.

  16. #15
    hanafi_hamza

    Re : Aide dans une fonction en langage C (débutant)

    le problème est le suivant:
    Ecirire un programme en c en utilisant les fonctions:
    Lecture: qui permet de lire un tableau en passant en paramètre le nom du tableau et sa taille.
    Les élèment du tableau sont les étudiant caractérisé par : Code Et, Nom et Moy Et
    et voila ce que j'ai fais:
    Code:
    typedef struct{
        int code;
        char *nom;
        float moy;
                  }Etudiant;
    // fonction lecture
    void Lecture(Etudiant Et[] , int *n)
    {
    	int i;
    	printf("donner le nombre des etudiants");
    	scanf("%d",n);
    	for(i=0;i<(*n);i++);
    	{		
    		printf("entrer le code de l'etudiant");
    	    scanf("%d",&Et[i].code);
    	    printf("entrer la moyenne de l'etudiant");
     	    scanf("%f",&Et[i].moy);
     	    printf("entrer le nom de l'etudiant");
            scanf("%s",Et[i].nom);
    	}
    main()
    {
    	Etudiant *Et;
    	int *n;
    	n=(int*)malloc(sizeof(int));
    	Lecture(Et,n);
    	return 0;
    }

  17. #16
    hanafi_hamza

    Re : Aide dans une fonction en langage C (débutant)

    j'ai un problème dans cette ligne !!
    Code:
    scanf("%f",&Et[i].moy);

  18. #17
    Bluedeep

    Re : Aide dans une fonction en langage C (débutant)

    Citation Envoyé par hanafi_hamza Voir le message
    j'ai un problème dans cette ligne !!
    Code:
    scanf("%f",&Et[i].moy);
    Quel problème ?

  19. #18
    hanafi_hamza

    Re : Aide dans une fonction en langage C (débutant)

    le programme se bloque au niveau de cette ligne !
    je pense que c'est à cause du char *nom: je connai pas la taille du nom !

  20. #19
    Deedee81
    Modérateur

    Re : Aide dans une fonction en langage C (débutant)

    Bonjour,

    Citation Envoyé par hanafi_hamza Voir le message
    j'ai un problème dans cette ligne !!
    Code:
    scanf("%f",&Et[i].moy);
    Dans la fonction main, tu as instancié Et avec une allocation sur la taille de la structure étudiant :

    Code:
    	Et=(Etudiant*)malloc(sizeof(Etudiant));
    Donc, ton Et correspond à un tableau pouvant contenir un seul élément.

    Or, dans ta boucle et ton scanf, tu balaies un nombre à priori quelconque de données. Si i est supérieur à 0, tu as un crash mémoire.
    "Il ne suffit pas d'être persécuté pour être Galilée, encore faut-il avoir raison." (Gould)

  21. #20
    hanafi_hamza

    Re : Aide dans une fonction en langage C (débutant)

    Et donc comment je vais faire pour que mon tableau contiendra plus d'un seul élèment?

  22. #21
    Bluedeep

    Re : Aide dans une fonction en langage C (débutant)

    Citation Envoyé par hanafi_hamza Voir le message
    Et donc comment je vais faire pour que mon tableau contiendra plus d'un seul élèment?
    Pour 1 étudiant tu alloue sizeof(Etudiant) bytes, ok ?
    Donc pour n étudiants tu alloues combien ?

  23. #22
    Deedee81
    Modérateur

    Re : Aide dans une fonction en langage C (débutant)

    Citation Envoyé par Bluedeep Voir le message
    Pour 1 étudiant tu alloue sizeof(Etudiant) bytes, ok ?
    Donc pour n étudiants tu alloues combien ?
    Et question subsidiaire : à quel moment faire l'allocation ? (réponse devenue évidente)
    "Il ne suffit pas d'être persécuté pour être Galilée, encore faut-il avoir raison." (Gould)

  24. #23
    hanafi_hamza

    Re : Aide dans une fonction en langage C (débutant)

    Citation Envoyé par Bluedeep Voir le message
    Pour 1 étudiant tu alloue sizeof(Etudiant) bytes, ok ?
    Donc pour n étudiants tu alloues combien ?
    Je pense comme ça:

    Et=(Etudiant*)malloc(sizeof(Et udiant)*(*n));

  25. #24
    hanafi_hamza

    Re : Aide dans une fonction en langage C (débutant)

    Citation Envoyé par Deedee81 Voir le message
    Et question subsidiaire : à quel moment faire l'allocation ? (réponse devenue évidente)
    faire l'allocation de l'espace pour une variable lorsque qu'on connais pas sa taille ou pour une varriable qui n'a pas une valleure fixe !

  26. #25
    Jack
    Modérateur

    Re : Aide dans une fonction en langage C (débutant)

    Code:
        int *n;
        n=(int*)malloc(sizeof(int));
        Lecture(Et,n);
    Pourquoi pas tout simplement
    Code:
         int n;
         Lecture (Et, &n);
    Pour le reste, tu n'as pas initialisé de le tableau pour accueillir les n étudiants.

    Petite remarque: c'est volontaire de donner le même identificateur pour les variables appelantes et les variables appelées?

  27. #26
    fred1599

    Re : Aide dans une fonction en langage C (débutant)

    je pense que c'est à cause du char *nom: je connai pas la taille du nom !
    Et pour cause, je t'avais dis de bosser en statique plutôt que dynamique. Dans le cas où tu travailles en dynamique, il faudrait faire un travail d'initialisation.

    du style

    Code:
    #include <stdio.h>
    
    
    typedef struct
    {
        char *nom;
    } Etudiant;
    
    Etudiant *Init(char *s);
    
    int main(void)
    {
        Etudiant *et = Init("toto");
    
        printf("%s\n", et->nom);
    
        free(et->nom);
        free(et);
    
        return 0;
    }
    
    Etudiant *Init(char *s)
    {
        Etudiant *e = malloc(sizeof(Etudiant));
        if (e == NULL) exit(-1);
    
        e->nom = strdup(s);
    
        return e;
    }

  28. #27
    Deedee81
    Modérateur

    Re : Aide dans une fonction en langage C (débutant)

    Salut,

    Citation Envoyé par fred1599 Voir le message
    Et pour cause, je t'avais dis de bosser en statique plutôt que dynamique.
    C'est peut-être une exigence du prof dans l'exercice proposé
    "Il ne suffit pas d'être persécuté pour être Galilée, encore faut-il avoir raison." (Gould)

Discussions similaires

  1. langage c, entrer un tableau de structure dans une fonction
    Par invitecd37efaf dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 10/02/2013, 13h31
  2. [Aide]Langage C - Lecture dans un fichier
    Par Rouchesta dans le forum Programmation et langages, Algorithmique
    Réponses: 12
    Dernier message: 16/02/2012, 08h23
  3. langage VHDL débutant besoin d'une petite aide svp
    Par newtech1 dans le forum Électronique
    Réponses: 1
    Dernier message: 19/11/2011, 20h20
  4. [langage c]Demande aide écriture fonction
    Par invite8b421ec7 dans le forum Programmation et langages, Algorithmique
    Réponses: 12
    Dernier message: 27/04/2011, 08h49
  5. Problème dans une fonction en Langage C
    Par invitee5fedd72 dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 04/05/2007, 23h25