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 :

call a C function from another function !


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Février 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : chercheur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Février 2011
    Messages : 78
    Par défaut call a C function from another function !
    Bonjour à Tous,

    J'aimerais savoir si vous pouvez m'aider à faire un appel à une fonction qui permet de retourner une liste de clients aléatoirement.

    Fonction 1:
    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
    void  affect_client_to_days(JOURS *days, donnee *data, usine1 *usine, client *cust, int TotDemCust)
    {
        int j=0;
        int t;
        int jr;
        int dem;
        int it=0;
        int nbr_c=1;
        srand(time(NULL));
        int nombre_aleatoire = 0;
     
        for (jr=1; jr<=data->nbr_periodes; jr++)
            {                 
                       days[jr].TotDemCust = 0;
                       days[jr].nbr_clients= 0;
                       while (((usine->dem_jour[jr]+usine->stock[jr-1]) > TotDemCust) && (it < data->nbr_clients))
                       {
                             nombre_aleatoire = rand()%data->nbr_clients+1;
                             j=nombre_aleatoire;
                             if((cust[j].Nbvisites < cust[j].frequence)&& (days[jr].cust[j]==0)) 
                                      {
                                              days[jr].nbr_clients++;
                                              cust[j].Nbvisites++;
                                              days[jr].cust[j]=1;
                                              days[jr].listcust[days[jr].nbr_clients]=j;
                                              days[jr].TotDemCust+=cust[j].demande;
                                              printf("affecter le client numero %d a la periode %d\n",nombre_aleatoire, jr);
                                      }
     
                       it++;
                       }
                       it=0;
                            if(usine->dem_jour[jr] > days[jr].TotDemCust)
                                      {
                                              j=1;
                                              while ((j <= data->nbr_clients) || (usine->dem_jour[jr] > days[jr].TotDemCust))
                                              {
                                                  if((cust[j].Nbvisites < cust[j].frequence)&& (days[jr].cust[j]==0))
                                                  {
                                                      days[jr].nbr_clients++;
                                                      cust[j].Nbvisites++;
                                                      days[jr].cust[j]=1;
                                                      days[jr].listcust[days[jr].nbr_clients]=j;
                                                      days[jr].TotDemCust+=cust[j].demande;
                                                  }
                                                  j++;
                                              }
                                       }
             }
             usine->stock[jr]=usine->stock[jr-1]+days[jr].TotDemCust-usine->dem_jour[jr];
             it=0;
    }
    J'ai besoin maintenant d'utiliser cette liste de clients dans une autre fonction qui permet de les classer par ordre décroissant en fonction de leur demande (sachant que les quantités de demandes se trouvent dans un fichier texte.

    Fonction 2 :

    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
    void rechercher_max_quantite(donnee *data, client *cust)
    {                     
        int j = 1;
        int i;
        double max;
        int quantite, num_client;
        for (i=1; i<=data->nbr_depots; i++) 
        {
            max = cust[i].demande;
    		for (j = data->nbr_depots; j <= data->nbr_clients + data->nbr_depots; j++)
    		{
                if (cust[i].demande < max)
                {
                   max = cust[i].demande;
                   quantite = i;
                   num_client = j - data->nbr_depots;
                }
            }
        }
            if((j - data->nbr_depots - 1) == data->nbr_clients)
                 printf("Le client %d a la quantite suivante %d\n", num_client, max);
    }
    Je ne sais pas c'est quoi la syntaxe qui permet de faire appel d'une fonction et l'utiliser dans une autre fonction.

    Merci pour vos remarques et vos réponses.
    Cdls.

  2. #2
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Novembre 2009
    Messages : 91
    Par défaut
    Un appel de fonction en C est très simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int fctA(int a, intb){
        //dosomestuff
        return val;
    }
     
    void fctB(){
        int nb1=0;
        int nb2=0;
        int RetourDeFonctionA = fctA(nb1,nb2);
    }
    Tu appelles ta fonction avec son nom, et en paramètre des valeurs que tu veux passer. Si la fonction a un retour, tu peux l'affecter quelque part.

    Edit : De ce que je vois, aucune de tes deux fonctions n'ont de valeur de retour, j'imagine donc que tu passes ta liste en pointeur, et qu'elle est modifiée comme cela

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Le premier élément d'un tableau a l'indice 0, pas 1.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    et donc il faut faire les boucles comme :


  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 59
    Par défaut
    Bonjour,
    ton code c'est un peu une usine a gaz !

    Je me permet une remarque...>
    ne doit en general n'etre appeler qu'une seul fois dans ton programme, et je doute que tu appel cette fonction (affect_client_to_days()) qu'une seule fois

    EDIT:
    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
    for (jr=1; jr<=data->nbr_periodes; jr++) //<<<<<<< jr = 1; !!!
            {                 
                       days[jr].TotDemCust = 0; // <<<<
                       days[jr].nbr_clients= 0; //<<<< days[1] = 0; days[0] = ?;
                       while (((usine->dem_jour[jr]+usine->stock[jr-1]) > TotDemCust) && (it < data->nbr_clients))
                       {
                             nombre_aleatoire = rand()%data->nbr_clients+1;
                             j=nombre_aleatoire;
                             if((cust[j].Nbvisites < cust[j].frequence)&& (days[jr].cust[j]==0)) 
                                      {
                                              days[jr].nbr_clients++; //<<< days[0] = ? + 1;
                                              cust[j].Nbvisites++;
                                              days[jr].cust[j]=1;
                                              days[jr].listcust[days[jr].nbr_clients]=j;
                                              days[jr].TotDemCust+=cust[j].demande; // <<< days[0] += (du_caca_la_encore)
                                              printf("affecter le client numero %d a la periode %d\n",nombre_aleatoire, jr);
                                      }
     
                       it++;
                       }
                       it=0;
                            if(usine->dem_jour[jr] > days[jr].TotDemCust) //<<< la encore tu pari sur la chance pour l'index 0
                                      {
    //...
    Comme le précise jeroman l'index de tes tableaux commence a 0. ton code est boiteux ici, tu risque de ne pas avoir le comportement attendu pour le premier tour.

  6. #6
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Février 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : chercheur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Février 2011
    Messages : 78
    Par défaut
    Bonjour,

    Mon code marche très bien et sans aucune lacune ! je suis ravi de voir vos remarques mais j'ai posté ma question sur la façon comment je pourrai utiliser une fonction qui retourne une liste de clients et les trier dans une autre fonction en fonction de leur demandes c'est tout.

    Cdls.

  7. #7
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Novembre 2009
    Messages : 91
    Par défaut
    Mon code marche très bien et sans aucune lacune ! je suis ravi de voir vos remarques mais j'ai posté ma question sur la façon comment je pourrai utiliser une fonction qui retourne une liste de clients et les trier dans une autre fonction en fonction de leur demandes c'est tout.
    Le premier élément d'un tableau a l'indice 0, pas 1.
    Si tu écris/lis des cases 1 a n+1 d'un tableau, ton code peut marcher "sans lacunes aucunes". Mais la derniere case de ton tableau n'est pas "référencée" comme faisant partie de ton tableau. Donc tu t'exposes a ce que cette case soit modifiée a ton insu sans que tu ne le sache.

    Je me permet une remarque...>
    srand(time(NULL));
    ne doit en general n'etre appeler qu'une seul fois dans ton programme, et je doute que tu appel cette fonction (affect_client_to_days()) qu'une seule fois
    Là encore, ca n'est pas une "erreur" a proprement parler qui ferait planter ton code, mais je t'invite a lire ce sujet, qui explique pourquoi il ne faut pas appeler srand plusieurs fois.
    http://www.developpez.net/forums/d11...nombre-dappel/

    Quand a ta question, le premier post y répond

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Student_Master Voir le message
    Mon code marche très bien et sans aucune lacune !
    C'est un pur hasard dû à ce que tu as d'autre en mémoire à ce moment, mais les remarques ci-dessus indiquent que ton code NE MARCHE PAS...




    Citation Envoyé par Student_Master Voir le message
    mais j'ai posté ma question sur la façon comment je pourrai utiliser une fonction qui retourne une liste de clients

    client **

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

Discussions similaires

  1. call lua overrided function from c++
    Par biyoudidou dans le forum C++
    Réponses: 11
    Dernier message: 30/01/2012, 18h55

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