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 :

Problème de fonction?


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 43
    Par défaut Problème de fonction?
    Bonjour.
    J'ai un soucis dans la boucle de la valeur absolue, en effet celle ci s'éxécute mal.
    je dois faire la valeur absolue |Ti-T| si celle ci est inférieure ou égale à 2.5 alors je vais dans la boucle N+1 sinon je vais dans N.

    Est ce que ma fonction valeur absolue est mal appelée?

    Voici le 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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
    double H; // horloge en jour
    int N; // incrémenteur1
    int i; // incrémenteur2
    float T, Ti; // T: Température et Ti: Température Instantannée
    float Tmoyi, Tmoy; // Tmoy: Température Moyenne et Tmoyi: Température Moyenne Instantannée
    float T_trait; // Valeur moyenne 2
    float dix_minutes(); // fonction
    double Fabs(double u); // Valeur Absolue
    double u; // 
    float H_debut, H_total; // H_debut: heure du début et H_total: heure totale
     
    float dix_minutes()
    {
    FILE* fichier1 = NULL;
    FILE* fichier2 = NULL;
    fichier1 = fopen("CalliopeT6_ERV(modif).txt", "r"); // lecture du fichier texte
    fichier2 = fopen("program_final_bis.txt", "a"); // création du fichier texte
    H_debut = 0.00694444*i;
    for (N=1; N<=120; N++)
        {
        fscanf(fichier1, "%f\n", &T);
        u = Ti - T;
        Ti = Ti + T;
        H = 0.00694444*i;
        H_total = H;
        double u;   
              {
              if ( u <= 2.5)
                {
                 N+1;
                 i++;
                 Tmoy = (Ti)/N;
                 printf("Tmoy = %f\n", Tmoy);
                 H_debut = H_total - H;
     
                 if(N>=120)
                         {
                         fichier2 = fopen("program_final_bis.txt", "a");
                         fprintf(fichier2, "%i.    %f     %f       %f\n", N, H_debut, H_total, Tmoy); // enregistre les Tmoy, la durée dans le fichier texte
                         }
                 fclose(fichier2); 
                 }
     
                 else
                 {
                 N;
                 printf("N = %i\n", N);
                 T_trait = Tmoy / N;
                 printf("T_trait = %f\n", T_trait);
                 Ti = T;
                 printf("Ti = %f\n", Ti);
                 N = 0;
                 printf("N = %i\n", N);
                 H_debut = H_total;
                 printf("H = %f\n", H);
                 }
     
              }
     
       }
       fclose(fichier1); // ferme le fichier txt
    }
     
    int main(void)
    {
     dix_minutes();
     return(1);
    }
    Merci de votre aide

  2. #2
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    D'abord, commence par corriger tes erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    newmain.c:11: attention : function declaration isn’t a prototype
    newmain.c:17: attention : function declaration isn’t a prototype
    newmain.c: In function ‘dix_minutes’:
    newmain.c:22: attention : conversion to ‘float’ from ‘double’ may alter its value
    newmain.c:29: attention : conversion to ‘float’ from ‘double’ may alter its value
    newmain.c:30: attention : declaration of ‘u’ shadows a global declaration
    newmain.c:13: attention : déclaration est masquée ici
    newmain.c:34: attention : déclaration sasn effet
    newmain.c:36: attention : conversion to ‘float’ from ‘int’ may alter its value
    newmain.c:38: attention : conversion to ‘float’ from ‘double’ may alter its value
    newmain.c:50: attention : déclaration sasn effet
    newmain.c:52: attention : conversion to ‘float’ from ‘int’ may alter its value
    newmain.c:66: attention : control reaches end of non-void function
    newmain.c:32: attention : ‘u’ is used uninitialized in this function

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par pepsi78 Voir le message
    Bonjour.
    J'ai un soucis dans la boucle de la valeur absolue, en effet celle ci s'éxécute mal.
    je dois faire la valeur absolue |Ti-T| si celle ci est inférieure ou égale à 2.5 alors je vais dans la boucle N+1 sinon je vais dans N.

    Est ce que ma fonction valeur absolue est mal appelée?

    Voici le code:
    En dehors des problèmes signalés par Nicolas,
    A quoi peut bien servir cette instruction ? Que veux-tu faire ici ?
    Idem avec
    Pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float dix_minutes (void)
    alors que tu ne retournes rien ?

    Pourquoi toutes ces globales ?
    Pourquoi un mélange entre double et float ? (rappel : les calculs se font en double)

    L'ouverture des fichiers n'est pas testée (crash chez moi, merci...)

    On peut avoir un exemple de fichier de données ?

    J'ai essayé de simplifier ton 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
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
    #if 0
    #define F_IN "CalliopeT6_ERV(modif).txt"
    #else
    #define F_IN "data.txt"
    #endif
     
    void dix_minutes (void)
    {
       FILE *fp_in = fopen (F_IN, "r"); // lecture du fichier texte
       if (fp_in != NULL)
       {
          double H_total = 0;
          double Tmoy = 0;
          int N;                    // incrémenteur1
          int err = 0;
          double Ti = 0;
          int i = 0;
          double H_debut = 0.00694444 * i;
          for (N = 1; !err && N <= 120; N++)
          {
             double T;
             int n = fscanf (fp_in, "%lf\n", &T);
     
             err = n != 1;
     
             if (!err)
             {
                double H = 0.00694444 * i;
                double u = Ti - T;
     
                H_total = H;
                Ti = Ti + T;
     
                if (u <= 2.5)
                {
                   H_debut = H_total - H;
                   i++;
                   Tmoy = (Ti) / N;
                   printf ("Tmoy = %f\n", Tmoy);
     
                }
     
                else
                {
                   double T_trait = Tmoy / N;
                   H_debut = H_total;
                   printf ("N = %i\n", N);
                   printf ("T_trait = %f\n", T_trait);
                   Ti = T;
                   printf ("Ti = %f\n", Ti);
                   N = 0;
                   printf ("N = %i\n", N);
                   printf ("H = %f\n", H);
                }
     
             }
          }
     
          fclose (fp_in);           // ferme le fichier txt
     
          if (N >= 120)
          {
             FILE *fp_out = fopen ("program_final_bis.txt", "a");
             if (fp_out != NULL)
             {
                /* enregistre les Tmoy, la durée dans le fichier texte */
                fprintf (fp_out, "%i.    %f     %f       %f\n", N, H_debut,
                         H_total, Tmoy);
                fclose (fp_out);
             }
          }
       }
       else
       {
          perror (F_IN);
       }
    }
     
    int main (void)
    {
       dix_minutes ();
       return 0;
    }

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 43
    Par défaut
    j'ai modifié mon programme sauf que maintenant je n'arrive pas à créer une fonction valeur absolue qui marche
    voici le 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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
    #define AMPLITUDE_T 5
     
    double H; // horloge en jour
    int N; // incrémenteur1
    int Premiere_Temp;
    int AmplitudeT;
    float FrequenceDeMesure;
    float T, Ti, Tinit; // T: Température et Ti: Température Instantannée
    float Tmoyi, Tmoy; // Tmoy: Température Moyenne et Tmoyi: Température Moyenne Instantannée
    void dix_minutes(unsigned int Temperature); // fonction
    void Palier(unsigned int Temperature); // fonction
     
    double Fabs(double u); // Valeur Absolue
    double u; // 
    float H_debut, H_fin; // H_debut: heure du début et H_total: heure totale
    FILE* fichier1 = NULL;
    FILE* fichier2 = NULL;
     
    void Palier(unsigned int Temperature)
    {
      if (Premiere_Temp == 0)
      {
        Ti = Temperature;
        Tinit = Temperature;
        Tmoyi=Temperature;                
        Premiere_Temp = 1;                    
        N=1;
        H_debut = 0;
        H_fin = 0;
      }
      else
      {
        Ti += Temperature;
        H = H+FrequenceDeMesure;
        if ( (Temperature < (Tinit+AmplitudeT/2))&&(Temperature > (Tinit-AmplitudeT/2)))
        {
         N++;
         Tmoyi = (Ti)/N;
         H_fin = H;
        }          
     
        else
        {
         if (N*FrequenceDeMesure >= 0.0694444)
         fprintf(fichier2,"%i.    %f     %f       %f\n", N, H_debut, H_fin, Tmoyi);
         N=0;
         Tmoyi=Temperature;
         H_debut = H;
         H_fin = H;
         Ti = Temperature;
         Tinit = Temperature;    
        }                  
      }
    }
     
    int main(void)
    {
    int j;
    Premiere_Temp = 0;    
    AmplitudeT = AMPLITUDE_T;
    FrequenceDeMesure = 0.00694444;
    H_fin = 0;
    H_debut = 0;
    N = 0;
    Ti = 0;
    Tinit = 0;
    fichier1 = fopen("CalliopeT6_ERV(modif).txt", "r"); // lecture du fichier texte
    fichier2 = fopen("program_fi.txt", "a"); // création du fichier texte
     
     
    for (j=1; j<=100; j++)
    {
       fscanf(fichier1, "%f\n", &T);
       Palier((unsigned int)T);
    }
    fclose(fichier2);
    fclose(fichier1); // ferme le fichier txt
    return(1);
    }
    Comment faire ma fonction valeur absolue à l'intérieur du programme sachant que si la valeur absolue est inférieure ou égale à Tamplitude/2 on va dans la boucle N++ sinon on va dans l'autre boucle

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 43
    Par défaut
    Voici un fichier texte sur lequel je travaille actuellement
    Fichiers attachés Fichiers attachés

  6. #6
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    au risque de me répéter, corrige tes erreurs :
    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
    newmain.c:27: attention : conversion to ‘float’ from ‘unsigned int’ may alter its value
    newmain.c:28: attention : conversion to ‘float’ from ‘unsigned int’ may alter its value
    newmain.c:29: attention : conversion to ‘float’ from ‘unsigned int’ may alter its value
    newmain.c:37: attention : conversion to ‘float’ from ‘unsigned int’ may alter its value
    newmain.c:39: attention : conversion to ‘float’ from ‘int’ may alter its value
    newmain.c:39: attention : conversion to ‘float’ from ‘int’ may alter its value
    newmain.c:42: attention : conversion to ‘float’ from ‘int’ may alter its value
    newmain.c:43: attention : conversion to ‘float’ from ‘double’ may alter its value
    newmain.c:48: attention : conversion to ‘float’ from ‘int’ may alter its value
    newmain.c:51: attention : conversion to ‘float’ from ‘unsigned int’ may alter its value
    newmain.c:52: attention : conversion to ‘float’ from ‘double’ may alter its value
    newmain.c:53: attention : conversion to ‘float’ from ‘double’ may alter its value
    newmain.c:54: attention : conversion to ‘float’ from ‘unsigned int’ may alter its value
    newmain.c:55: attention : conversion to ‘float’ from ‘unsigned int’ may alter its value
    newmain.c: In function ‘main’:
    newmain.c:65: attention : conversion to ‘float’ alters ‘double’ constant value

  7. #7
    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
    Si tu veux faire des progrès, il faut tenir compte des remarques qui te sont faites et en tenir compte :
    http://www.developpez.net/forums/sho...d.php?t=543999 post #4 :
    ...ainsi que le fait de bien regler le compilateur ce qui t'aurai permis de voir que N+1 tout court ne sert à rien.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 43
    Par défaut
    Mon nouveau programme ne comporte plus de N+1

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 43
    Par défaut
    Avec quel logiciel programmes tu?
    j'utilise dev c++ et je n'ais aucune erreur

  10. #10
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 43
    Par défaut
    J'ai beau mettre les modifications dans le logiciel dev c++ je n'obtiens aucun warning.

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par pepsi78 Voir le message
    J'ai beau mettre les modifications dans le logiciel dev c++ je n'obtiens aucun warning.
    Pour tout recompiler : ctrl-F11

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 43
    Par défaut
    non ca change rien

  14. #14
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par pepsi78 Voir le message
    non ca change rien
    DevC++ n'est plus mis à jour ... Code::Blocks

  15. #15
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par ssmario2 Voir le message
    DevC++ n'est plus mis à jour ... Code::Blocks
    mais wxDev-C++ l'est lui!

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 43
    Par défaut
    Fonctionne-t'il sous vista?

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 43
    Par défaut
    Au boulot j'ai XP et je viens d'installer wxDev et mon programme fonctionne également aucun warning ni d'erreur

Discussions similaires

  1. C++ Problème de fonctions et pointeurs
    Par zmatz dans le forum C++
    Réponses: 3
    Dernier message: 01/10/2005, 16h20
  2. [MFC][WINSOCK] Problème avec fonction recv
    Par Le Farfadet dans le forum MFC
    Réponses: 4
    Dernier message: 23/09/2005, 11h00
  3. Problème de fonction
    Par Anduriel dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/05/2005, 20h30
  4. Problème avec fonction d'envoie de mail
    Par zyg dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 23/02/2005, 08h48
  5. [Requête] Problème avec fonction "DATE_FORMAT()"
    Par sekiryou dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/01/2005, 21h52

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