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 :

Aide appel de fonctions sur "main"


Sujet :

C

  1. #1
    Membre actif
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 12
    Par défaut Aide appel de fonctions sur "main"
    salut, j'ai commencé a resoudre un exercice mais je suis bloquée dans le "main" .
    voila tout ce que j'ai pu faire! et j'aimerai savoir si c'est juste ou faux .
    L'EXERCICE :


    le voici: Les solutions
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    #include <stdio.h>
    #include <stdlib.h>
    #define true 1
    #define false 0
     
    typedef struct athelete{
        char nom;
        char matricule;
        int age;
        double taille;
        double recordpers;
    } athelete;
     
    void ref(athelete NA[], int n){
        int i;
        for(i=0;i<n;i++){
            printf("\nentrez le nom  : ");
            scanf("%s \n",&NA[i].nom);
            printf("\nentrez la matricule  : ");
            scanf("%s \n",&NA[i].matricule);
            printf("\nentrez l age  : ");
            scanf("%d \n",&NA[i].age);
            printf("\nentrez la taille  : ");
            scanf("%lf ",&NA[i].taille);
            printf("\nentrez le record personnel  : ");
            scanf("%lf ",&NA[i].recordpers);
        }
    }
     
    double RMA(athelete H[] , int n){
        int i;
        double s=0;
        for(i=0;i<n;i++){
            s = H[i].recordpers + s;
        }
        double M=(s / n);
        return M;
    }
     
    athelete recordinf(athelete NA[],int taille){
        athelete T[taille];
        double moy; int i,k;
        k=1; moy=0;
        for(i=0;i<taille;i++){
            moy=NA[i].recordpers + moy;
        }
        moy=moy/taille;
        for(i=0;i<taille;i++){
            if(NA[i].recordpers<moy) T[k++]=NA[i];
        }
        return *T;
    }
     
    athelete li_athelete(athelete NA[] , unsigned int taille){
        athelete T[taille];
        int permut;
        int i;
        T[taille]=recordinf(NA,taille);
        permut = true;
        while(permut){
            permut=false;
        for(i=0;i<taille;i++){
            if(T[i].recordpers < T[i+1].recordpers){
                athelete temp;
                temp=T[i];
                T[i]=T[i+1];
                T[i+1]=temp;
                permut = true;
            }
        }
        }
        return *T;
    }
     
    void affiche(athelete NA[], int taille){
        athelete T[taille];
        int i;
        T[taille]=recordinf(NA,taille);
        for(i=0;i<taille;i++){
            printf("%s \n",T[i].nom);
            printf("%s \n",T[i].matricule);
            printf("%d \n",T[i].age);
            printf("%lf \n",T[i].taille);
            printf("%lf \n",T[i].recordpers);
        }
    }
     
    int main()
    {
        athelete NA; /* ?????*/
        return 0;
    }
    Merci d'avance .
    Images attachées Images attachées  

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Commençons par le début. La déclaration de la structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct athelete{
        char nom;
        char matricule;
        int age;
        double taille;
        double recordpers;
    } athelete;
    Lorsque tu déclares char nom; par exemple tu déclares une variable qui ne pourra contenir qu'un seul caractère. nom correspond à un seul octet.
    Il va te falloir déclarer plutôt un pointeur sur un espace mémoire qu'il faudra allouer d'une manière ou d'une autre.
    Deux possibilités s'offrent à toi :
    • char nom[];
    • char *nom;

    Soit tu connais la longueur maximale des noms des athlètes, tu peux donc utiliser la première solution en spécifiant la taille.
    Soit tu ne connais pas sa longueur il te faudra alors allouer dans le tas (avec malloc()) la longueur désirée le moment venu.

    Cette démarche devra être utilisée pour toute variable devant contenir du texte.

  3. #3
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    J'ajoute une petite remarque. Une structure se déclare comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef stuct
    {
     
    } mastructure;
    Regarde comment toi tu l'as déclaré.

  4. #4
    Membre actif
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 12
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    J'ajoute une petite remarque. Une structure se déclare comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef stuct
    {
     
    } mastructure;
    Regarde comment toi tu l'as déclaré.
    Techniquement je pense que c'est faisable

  5. #5
    Membre actif
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 12
    Par défaut
    @gerald3d

    Quand ta quelque chose concernant le main à me dire dit le SVP ;

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Il faudrait peut-être nous dire ce que tu n'arrives pas à faire dans ton main() pour qu'on puisse t'aider.

    Pour la structure, tu peux la définir des deux façons. Dans ton cas, le premier "alias" athelete est tout de suite écrasé par le 2e et n'a pas d'intérêt. Au passage, on dit athlète et non athelète : http://www.larousse.fr/dictionnaires...l%C3%A8te/6098

    Le problème que tu dois avoir dans ton main(), c'est que tu ne sais pas comment appeler la fonction suivante je présume :
    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
    void ref(athelete NA[], int n){
        int i;
        for(i=0;i<n;i++){
            printf("\nentrez le nom  : ");
            scanf("%s \n",&NA[i].nom);
            printf("\nentrez la matricule  : ");
            scanf("%s \n",&NA[i].matricule);
            printf("\nentrez l age  : ");
            scanf("%d \n",&NA[i].age);
            printf("\nentrez la taille  : ");
            scanf("%lf ",&NA[i].taille);
            printf("\nentrez le record personnel  : ");
            scanf("%lf ",&NA[i].recordpers);
        }
    }
    ?

    A mon avis, la fonction devrait plutôt avoir le prototype suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    athelete * ref(int nombre);
    Elle alloue avec malloc() un espace pour recevoir nombre = NA structures athlètes, demande les données de chacun d'eux comme tu l'as fait et renvoie un pointeur sur cet espace (qu'il faudrait penser à libérer avec free() dans la suite).

    Ca vient peut-être de ton copier-coller mais tu devrais écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        double moy; int i,k;
        k=1; moy=0;
    plutôt d'une de ces façons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        // 1
        double moy=0;
        int k=1, i;
        // 2
        double moy=0;
        int k=1;
        int i;
    , plus communes et plus lisibles.

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Citation Envoyé par smoxi Voir le message
    @gerald3d

    Quand ta quelque chose concernant le main à me dire dit le SVP ;
    Si, à la base, les structures de données ne sont pas bonnes, je ne vois pas trop quel main miraculeux, pourrait faire fonctionner tout ça.

    Si ça t'aide à réfléchir de commencer par le main, pour l'instant la seulle chose que tu as écrite dans celui-ci ne me parrait pas très utile : un athlète tout seul, il te faudrait un tableau (ou une liste chainée mais c'est peut être un peu plus compliqué), non?
    Tu pourrais commencer par appeler tes fonctions d'écriture et d'affichage pour constater que la saisie n'est pas très au point (déjà mettre des " \n" après la valeur entrée me parrait assez risqué) après tu vas devoir choisir si tu veux suivre le conseil de gerald3d sur le nom (voir l'appliquer aussi au matricule) en tout cas ta ligne actuelle n'est correcte ni pour lire un caractère ni pour lire une chaine de caractères.

    Pour l'affichage le but c'est pas de présenter NA plutôt qu'un T tout bizarre qui vient d'être créé avec la fonction "recordinf"?

  8. #8
    Membre actif
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 12
    Par défaut
    Un gros merci pour Votre aide

    @gerald3d
    j'ai fais ce que tu m'a dit .

    @Bktero

    Merci pour ton aide ." la correction orthographique "

    @pythéas
    Citation Envoyé par pythéas Voir le message
    Pour l'affichage le but c'est pas de présenter NA plutôt qu'un T tout bizarre qui vient d'être créé avec la fonction "recordinf"?
    qu'est ce que je devrais changer dans la fonction d'affichage / recordinf .

    En tout cas j'ai fait ce qu'il fallait pour la fonction "ref" et "RMA" ...

    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    #include <stdio.h>
    #include <stdlib.h>
    #define true 1
    #define false 0
    #define MAX 50
    typedef struct {
        char nom[MAX];
        char matricule[MAX];
        int age;
        double taille;
        double recordpers;
    } athlete;
     
    void ref(athlete NA[], int n){
        int i;
        for(i=0;i<n;i++){
            printf("\nentrez le nom [%d] : ",i+1);
            scanf("%s",&NA[i].nom[i]);
            printf("\nentrez la matricule [%d] : ",i+1);
            scanf("\n%s",&NA[i].matricule[i]);
            printf("\nentrez l age [%d] : ",i+1);
            scanf("\n%d",&NA[i].age);
            printf("\nentrez la taille [%d] : ",i+1);
            scanf("\n%lf",&NA[i].taille);
            printf("\nentrez le record personnel [%d] : ",i+1);
            scanf("\n%lf",&NA[i].recordpers);
        }
    }
     
    double RMA(athlete H[] , int n){
        int i;
        double s=0;
        for(i=0;i<n;i++){
            s = H[i].recordpers + s;
        }
        double M=(s / n);
        return M;
    }
     
    athlete recordinf(athlete NA[],int taille){
        athlete T[taille];
        double moy; int i,k;
        k=1; moy=0;
        for(i=0;i<taille;i++){
            moy=NA[i].recordpers + moy;
        }
        moy=moy/taille;
        for(i=0;i<taille;i++){
            if(NA[i].recordpers<moy) T[k++]=NA[i];
        }
        return *T;
    }
     
    athlete tri_athlete(athlete NA[] , unsigned int taille){
        athlete T[taille];
        int permut;
        int i;
        T[taille]=recordinf(NA,taille);
        permut = true;
        while(permut){
            permut=false;
        for(i=0;i<taille;i++){
            if(T[i].recordpers < T[i+1].recordpers){
                athlete temp;
                temp=T[i];
                T[i]=T[i+1];
                T[i+1]=temp;
                permut = true;
            }
        }
        }
        return *T;
    }
     
    void affiche(athlete NA[], int taille){
        athlete T[taille];
        int i;
        T[taille]=recordinf(NA,taille);
        for(i=0;i<taille;i++){
            printf("%s \n",T[i].nom[i]);
            printf("%s \n",T[i].matricule[i]);
            printf("%d \n",T[i].age);
            printf("%lf \n",T[i].taille);
            printf("%lf \n",T[i].recordpers);
        }
    }
     
    int main()
    {
        int i;
        athlete *NA=(athlete*)malloc(3*sizeof(athlete));
        ref(NA,3);
        printf("le record moyen est %lf",RMA(NA , 3));
        return 0;
    }

  9. #9
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Je suppose que recordinf() doit répondre à la question 4.
    Elle semble parler d'un nouveau tableau P devant contenir les informations des athlètes répondant à un certain critère ce qui au final s'avère assez délicat pour un résultat peu satisfaisant :

    1- Comment créer ce tableau ?
    La fonction peut elle-même le faire par allocation dynamique (mais pas par allocation automatique) ou recevoir en argument un tableau déjà créé par la fonction appelante.

    2- Quel taille doit avoir ce tableau ?
    Au maximum, la même taille que le tableau NA du main(). Si la fonction crée le tableau par allocation dynamique, elle peut aussi le faire juste à la dimension requise.

    3- Combien de données sont contenues dans ce tableau ?
    C'est une information supplémentaire qu'il faudra conserver, car si on crée le tableau juste à la bonne taille par allocation dynamique, il est plein mais il faut se souvenir de sa taille et si on le dimensionne à la valeur maximum, on connait sa taille mais il est seulement partiellement rempli.
    La fonction doit donc renvoyer deux choses intimement liées concernant cette question : le tableau rempli et le nombre d'éléments placés dans le tableau. Peut-être devrait-on effectuer la liaison logicielle entre eux par une structure.
    Une autre possibilité est d'envisager de mettre une marque de fin dans le tableau, une valeur sentinelle comme le '\0' pour les chaines de caractères. Dans ce cas, la structure sentinelle ne doit pas pouvoir être une structure décrivant un athlète, (en spécifiant un nom à "" , l'age à <=0 ou...).

    4- A noter aussi l'inconvénient de dupliquer les données contenues dans NA dans le nouveau tableau mais c'est imposé par l'énoncé

    La structure de donnée imposée dans cette question n'est pas bien adaptée au problème à résoudre et on doit pouvoir faire beaucoup plus léger et plus souple. Mais c'est un exercice.

  10. #10
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Pour la fonction affiche()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void affiche(athlete NA[], int taille){
        athlete T[taille];
        int i;
        T[taille]=recordinf(NA,taille);
    Ceci nest pas possible (T[taille] est un élément athlete qui est hors du tableau T et non pas un tableau). En aucun cas, ceci initialise le tableau T avec le résultat de recordinf(). De même, on ne pourra écrire T=recordinf(NA,taille); (on ne peut jamais écrire tableau = ...)

    Ici, le tableau résultat doit être construit par recordinf(), donc nécessairement il l'a été par allocation dynamique. La fonction va alors renvoyer l'adresse de début, et on doit avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void affiche(athlete NA[], int taille){
        athlete *T;
        int i;
        T=recordinf(NA,taille);
        ....
    suite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ....
        for(i=0;i<taille;i++){
            printf("%s \n",T[i].nom[i]);
    Mais taille est le nombre d'éléments de NA, pas celui du tableau construit par la fonction recordinf() (cf le post précédent)

    A noter aussi qu'il faudra faire un free(T)

  11. #11
    Membre actif
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 12
    Par défaut
    @diogene

    Merci pour votre explication ...

    J'ai commencé mais Je suis bloquée a appeler la fonction recordinf
    dans le main ;

  12. #12
    Membre actif
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 12
    Par défaut
    corrigez SVP :

    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    #include <stdio.h>
    #include <stdlib.h>
    #define true 1
    #define false 0
    #define MAX 50
    typedef struct {
        char nom[MAX];
        char matricule[MAX];
        int age;
        double taille;
        double recordpers;
    } athlete;
     
    void ref(athlete NA[], int n){
        int i;
        for(i=0;i<n;i++){
            printf("\nentrez le nom [%d] : ",i+1);
            scanf("%s",&NA[i].nom);
            printf("\nentrez la matricule [%d] : ",i+1);
            scanf("\n%s",&NA[i].matricule);
            printf("\nentrez l age [%d] : ",i+1);
            scanf("\n%d",&NA[i].age);
            printf("\nentrez la taille [%d] : ",i+1);
            scanf("\n%lf",&NA[i].taille);
            printf("\nentrez le record personnel [%d] : ",i+1);
            scanf("\n%lf",&NA[i].recordpers);
        }
    }
     
    double RMA(athlete H[] , int n){
        int i;
        double s=0;
        for(i=0;i<n;i++){
            s = H[i].recordpers + s;
        }
        double M=(s / n);
        return M;
    }
     
    athlete recordinf(athlete NA[],int taille){
        double moy=RMA(NA,taille);
        athlete T[taille];
        int i,k;
        for(i=0;i<taille;i++){
            if(NA[i].recordpers<moy) T[k++]=NA[i];
        }
        T[taille];
    }
     
    athlete tri_athlete(athlete NA[] , int taille){
        athlete T[taille];
        int permut;
        int i;
        T[taille]=recordinf(NA,taille);
        permut = true;
        while(permut){
            permut=false;
        for(i=0;i<taille;i++){
            if(T[i].recordpers < T[i+1].recordpers){
                athlete temp;
                temp=T[i];
                T[i]=T[i+1];
                T[i+1]=temp;
                permut = true;
            }
        }
        }
        return T[taille];
    }
     
    void affiche(athlete NA[], int taille){
        int i;
        athlete T[taille];
        T[taille]=recordinf(NA,taille);
        for(i=0;i<taille;i++){
            printf("\n%s",&T[i].nom);
            printf("\n%s",&T[i].matricule);
            printf("\n%d",T[i].age);
            printf("\n%lf",T[i].taille);
            printf("\n%lf",T[i].recordpers);
        }
    }
     
    int main()
    {
        int i;
        athlete NA[MAX];
        ref(NA,3);
        affiche(NA, 3);
        return 0;
    }

  13. #13
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    @diogene

    Merci pour votre explication
    Mais vous n'en avez pas tenu compte.
    Si des points restent obscurs, posez des questions précises.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    athlete recordinf(athlete NA[],int taille){
        double moy=RMA(NA,taille);
        athlete T[taille];
    ....
        T[taille];            ///ERREUR
    FAUX , voir post #10
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    athlete tri_athlete(athlete NA[] , int taille){
        athlete T[taille];
    ...
        T[taille]=recordinf(NA,taille); ///ERREUR
    FAUX, voir post #10
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void affiche(athlete NA[], int taille){
        int i;
        athlete T[taille];
        T[taille]=recordinf(NA,taille);  ///ERREUR
    FAUX, voir post #10

  14. #14
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Citation Envoyé par smoxi Voir le message
    J'ai commencé mais Je suis bloquée a appeler la fonction recordinf dans le main ;
    Tu n'es pas bloquée pour appeler la fonction recordinf dans le main, c'est la fonction qui ne marche pas.
    En dehors des conseils de diogene que je ne peux que t'encourager à suivre, pour t'éviter une perte de temps supplémentaire je te conseille d'initialiser k dans la fonction, ça devrait au moins t'éviter d'avoir une erreur de segmentation.

  15. #15
    Membre actif
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 12
    Par défaut
    Est ce que c'est correcte?‎

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    athlete recordinf(athlete NA[],int taille){
        double moy=RMA(NA,taille);
     
        int i,k=0,m=0;
        for(i=0;i<taille;i++){
            if(NA[i].recordpers<moy) k++;
        }
        athlete *T=(athlete*) malloc(k*sizeof(athlete));
        for(i=0;i<taille;i++){
            if(NA[i].recordpers<moy) T[m++]=NA[i];
        }
        return *T;
        free(T);
    }

  16. #16
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Petite remarque : tu fais le free aprèès le return. Il faut savoir que le return te fait sortir de la fonction, donc le free ne sera pas exécuté. Dans ton cas c'est plutôt une bonne chose car il ne faut pas le libérer, sinon l'espace où tu viens de stocker le résultat est "perdu". Aussi, comment la fonction appelante connait la taille de T ? Il faut aussi lui communiquer cette information.



    EDIT : je n'avais pas fait attention à l'étoile entre le return et le T. Remarque judicieuse de diogene dans le message suivant

  17. #17
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    On progresse, mais tu retournes *T, un athlete, une copie du premier élément du tableau T. Mais celui qui va utiliser cette fonction ne saura pas où est le tableau et ne peut donc l'utiliser. Il faut retourner l'adresse de début de ce tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    athlete * recordinf(athlete NA[],int taille){
        double moy=RMA(NA,taille);
        int i,k=0,m=0;
        for(i=0;i<taille;i++){
            if(NA[i].recordpers<moy) k++;
        }
        athlete *T=malloc(k*sizeof(athlete));
        for(i=0;i<taille;i++){
            if(NA[i].recordpers<moy) T[m++]=NA[i];
        }
        return T;
    }
    Qui pourra être utilisé de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void affiche(athlete NA[], int taille){
        int i;
        athlete * T =recordinf(NA,taille);
        for(i=0;i<?????? ;i++){
            printf("\n%s",T[i].nom);
    ....
        }
        free(T);
    }
    Il reste un problème : combien d'éléments athlete contient le tableau ? Personne ne le sait, l'information contenue dans k de la fonction recordinf() est perdue. Cela rend l'utilisation du tableau très périlleuse, voire impossible.

  18. #18
    Membre actif
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 12
    Par défaut
    J'ai résolu :
    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
    void affiche(athlete NA[], int taille){
        int i;
        athlete * T =recordinf(NA,taille);
        double moy=RMA(NA,taille);
        int k=0;
        for(i=0;i<taille;i++){
            if(NA[i].recordpers<moy) k++;
        }
        for(i=0;i<k;i++){
            printf("\n%s",T[i].nom);
            printf("\n%s",T[i].matricule);
            printf("\n%d",T[i].age);
            printf("\n%lf",T[i].taille);
            printf("\n%lf",T[i].recordpers);
        }
        free(T);
    }

  19. #19
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Hum. Oui, bel effort, mais solution peu satisfaisante puisqu'elle oblige à exécuter deux fois le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        for(i=0;i<taille;i++){
            if(NA[i].recordpers<moy) k++;
        }
    une fois explicitement dans la fonction et une fois dans l'appel à recordinf().

    Et ce sera pareil à chaque fois qu'on voudra utiliser le résultat de recordinf()

  20. #20
    Membre actif
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 12
    Par défaut
    Citation Envoyé par diogene Voir le message
    Hum. Oui, bel effort, mais solution peu satisfaisante puisqu'elle oblige à exécuter deux fois le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        for(i=0;i<taille;i++){
            if(NA[i].recordpers<moy) k++;
        }
    une fois explicitement dans la fonction et une fois dans l'appel à recordinf().

    Et ce sera pareil à chaque fois qu'on voudra utiliser le résultat de recordinf()
    mais comment utiliser le résultat de la fonction recordinf() pour trouver sa taille ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 24
    Dernier message: 26/05/2006, 15h08
  2. appel de fonction sur un OnKeyUp
    Par titoumimi dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 08/02/2006, 10h46
  3. appel de fonction sur validation de formulaire
    Par PAYASS59 dans le forum Langage
    Réponses: 15
    Dernier message: 17/01/2006, 10h09

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