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 :

Acquisition et sauvegarde de valeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 Acquisition et sauvegarde de valeurs
    Bonjour à tous,

    je suis également sur un projet en langage C et je n'y arrive vraiment pas.
    Le but est de faire l'acquisition de valeurs (dans mon cas il s'agit de température). Il faut que ces valeurs est un écart de 5°C maximum sinon je ne me préoccupe pas des valeurs. Ensuite je dois sauvegarder ces données sur une période d'au moins 10min avec un échantillonnage d'une durée d'une minute.
    Puis enfin, je dois faire la moyenne des tranches de 10min ou plus.

    Pour le moment voila ce que mon programme donne:
    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
    #include "math.h"
    #include"stdio.h"
    #define TRIG 5
    #define TIME 10
     
    float Tmin=0.0;
    float Tmax=0.0;
    float val_ecart1=Tmax-Tmin;
    float val_ecart2=Tmin-Tmax;
     
    float temperature(float Tmin, float Tmax, int(TRIG))
    {
         if ((Tmax-Tmin>=TRIG) && (Tmin-Tmax<TRIG))
            return NULL;
     
         else
             if (Tmax-Tmin<=TRIG)
                return val_ecart1;
     
             else 
                  if (Tmin-Tmax<=TRIG)
                     return val_ecart2;
     
    }
    PS: je débute C donc aidez moi s'il vous plait

  2. #2
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    c'est quoi le problème ?????

  3. #3
    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
    le soucis c'est que je n'arrive pas à faire la suite

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Avant d'aller plus loin, as tu commencé à tester ce que tu as écrit ?

    J'y vois déjà pas mal d'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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #include "math.h"
    #include"stdio.h"
    #define TRIG 5
    #define TIME 10
     
    /*
      Ici, 4 variables globales, toutes initialisées à zéro... pourquoi pas ?
    */
    float Tmin=0.0;
    float Tmax=0.0;
    float val_ecart1=Tmax-Tmin;
    float val_ecart2=Tmin-Tmax;
    /*
      Attention, ici, tu redéfinis deux variables locales précédemment déclarée globales
      Et que voulais tu faire avec le troisième paramètre ?? 
        Il y a deux parenthèses en plus dans le prototype et le dernier paramètre
        sera transformé en '5' à la compilation puisse que TRIG a été défini comme tel.
    */
    float temperature(float Tmin, float Tmax, int(TRIG))
    {
         if ((Tmax-Tmin>=TRIG) && (Tmin-Tmax<TRIG))
            return NULL; /* return NULL là où un float est attendu ?*/
         
         else
             if (Tmax-Tmin<=TRIG)
                return val_ecart1;
                
             else 
                  if (Tmin-Tmax<=TRIG)
                     return val_ecart2;
                  
    }
    Je ne voie pas non plus de fonction main...

    Dans la fonction temperature (fonction pas très bien nommée je pense) on calcule 4 fois la différence entre les températures, alors qu'on pourrai la calculer qu'une seule fois en début de fonction et ne retenir que la valeur absolue avec fabs.

  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
    je met TRIG à 5 car il faut que je compare l'écart de température entre Tmin et Tmax.
    Si TRIG est inférieur ou égal à 5 alors je stoke cet écart dans une mémoire sinon j'attend à nouveau 1 minute pour avoir les nouvelles valeurs.

    Oui mon programme à des erreurs mais je n'arrive pas à les corriger.

    C'est mon premier programme en C donc je lutte vraiment.

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par pepsi78 Voir le message
    C'est mon premier programme en C donc je lutte vraiment.
    Quand on commence en C -mais c'est vrai partout ailleurs- il faut partir d'une chose simple. Et ne pas hésiter d'abuser de FAQ ou de tutoriels.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /* pour printf*/
    #include <stdio.h>
    /* pour EXIT_SUCCESS*/
    #include <stdlib.h>
     
    /* point d'entrée du programme*/
    int main()
    {
      printf("Bonjour tout le monde !\n");
      return EXIT_SUCCESS;
    }
    Après, une fois qu'on est sur que le programme fonctionne, on peut commencer à compliquer:
    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
    /* pour printf*/
    #include <stdio.h>
    /* pour EXIT_SUCCESS*/
    #include <stdlib.h>
     
    /* cette fonction calcule la différence entre deux valeurs
        et retourne 0 si cette valeur est inférience à un seuil*/
    float diffTemp(float fT1, float fT2, float fSeuil)
    {
      /* calcul de l'écart */
      float ret = fabs(fT1 - fT2);
      /* si écart inférieur à seuil, on le met à zéro*/
      if(ret < fSeuil)
      {
        ret = .0F;
      }
      return ret;
    }
     
    int main()
    {
     
      printf("Bonjour tout le monde !\n");
     
      /* test de notre nouvelle fonction*/
      printf("diff entre %f et %f : %f\n", 10., 11.,  diffTemp(10.,11.,5.)); 
      printf("diff entre %f et %f : %f\n", 10., 20.,  diffTemp(10.,20.,5.));
     
      return EXIT_SUCCESS;
    }

  7. #7
    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
    Pour le moment voila ce que mon programme donne:
    Ce code est incomplet
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : D:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:8: error: initializer element is not constant
    main.c:9: error: initializer element is not constant
    main.c:11: error: syntax error before numeric constant
    main.c:11: warning: function declaration isn't a prototype
    main.c: In function `temperature':
    main.c:11: error: parameter name omitted
    main.c:14: error: incompatible types in return
    Process terminated with status 1 (0 minutes, 1 seconds)
    5 errors, 1 warnings
    Merci de poster du code qui a au moins une chance d'être compilable (où est le main() ?)
    Voici un maquettage de l'algorithme d'acquisition. Je te laisse transformer ça en fonction et calculer la moyenne :
    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
     
    /*
    Le but est de faire l'acquisition de valeurs (dans mon cas il s'agit de
    température). Il faut que ces valeurs est un écart de 5°C maximum sinon
    je ne me préoccupe pas des valeurs. Ensuite je dois sauvegarder ces données
    sur une période d'au moins 10min avec un échantillonnage d'une durée d'une
    minute. Puis enfin, je dois faire la moyenne des tranches de 10min ou plus.
    */
     
    #include <math.h>
    #include <stdio.h>
     
    /* simulation */
    #include <stdlib.h>
    #include <time.h>
     
    /* 0=normal 1=debug */
    #define DBG 1
     
    #if DBG
    #include "ed/inc/prt.h"
    #endif
     
    #define TRIG 5
    #define TIME 10
     
    /* simulation du capteur de temperature */
    float get_temp (void)
    {
       static float S_temp = 0;
       static int S_count = 0;
       int plus = 1;
     
       S_count++;
       if (S_count > 10)
       {
          plus = 0;
       }
       if (plus)
       {
          S_temp += (5 * (rand () / (double) RAND_MAX));
       }
       else
       {
          S_temp -= (5 * (rand () / (double) RAND_MAX));
       }
     
    #if DBG
       PRT_D (S_temp);
    #endif
       return S_temp;
    }
     
    int main (void)
    {
    /* simulation */
       srand (time (NULL));
     
       {
          /* simulation horloge 30 s */
          int tick;
          int min=0;
          float temp_prec = get_temp ();
     
          for (tick = 0; tick < 40; tick++)
          {
             if ((tick % 2) == 0)
             {
                /* une minute */
                float temp = get_temp ();
                min++;
                if (fabs (temp_prec - temp) > TRIG)
                {
                   temp_prec = temp;
                   printf ("[min=%2d] temp=%.2f\n", min, temp_prec);
                }
     
             }
          }
       }
       return 0;
    }
    donne, par exemple :
    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
     
    S_temp       = 2.69
    S_temp       = 6.48
    S_temp       = 10.21
    [min= 2] temp=10.21
    S_temp       = 10.68
    S_temp       = 14.93
    S_temp       = 17.33
    [min= 5] temp=17.33
    S_temp       = 19.80
    S_temp       = 21.93
    S_temp       = 22.72
    [min= 8] temp=22.72
    S_temp       = 25.39
    S_temp       = 21.82
    S_temp       = 18.11
    S_temp       = 13.21
    [min=12] temp=13.21
    S_temp       = 9.69
    S_temp       = 7.28
    [min=14] temp=7.28
    S_temp       = 2.39
    S_temp       = -0.02
    [min=16] temp=-0.02
    S_temp       = -0.16
    S_temp       = -3.36
    S_temp       = -4.71
    S_temp       = -8.87
    [min=20] temp=-8.87
     
    Press ENTER to continue.

  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
    Merci Emmanuel mais je suis maintenant parti sur un programme plus allégé.
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <string.h>
     
    int N;
    float T, Ti;
    float Tmoyi, Tmoy;
    float T_trait;
     
    float dix_minutes();
    FILE* fichier = NULL;
    //FILE* fichier = NULL;
    //char* fgets(char* Ti, int nombreDeCaracteresALire, FILE* pointeurSurFichier);
    float dix_minutes()
    {
    Ti = 0;
    Tmoy = 0;
    FILE* fichier = NULL;
    fichier = fopen("programme final.txt", "w"); // création du fichier texte
    for (N=1; N!=20; N++)
        {
        printf("\nTapez la valeur T: "); // fenetre DOS pour les températures
        scanf("%f",&T);
        Ti = Ti + T;
        printf("Ti = %f\n", Ti);
     
              {  
              if ( fabs(Ti - T) <= 2.5) //+fabs(T) // valeur moyenne
                 {
                 N = N++;
                 printf("N = %i\n", N);
                 Tmoy = (Ti)/N;
                 printf("Tmoy = %f\n",Tmoy);
                 if (N>=10)//, N>=10, N++)
                  {  
                  fichier = fopen("programme final bis.txt", "w");
                  fprintf(fichier, "%f   %f\n", Tmoy, T); // enregistre les Tmoy et T dans un autre fichier txt
                  N=N++;
                  }
                  fclose(fichier); 
                 }
     
                 /*if (N=10)//, N>=10, N++)
                  {  
                  fichier = fopen("programme final bis.txt", "w");
                  fprintf(fichier, "%f   %f\n", Tmoy, T); // enregistre les Tmoy et T dans un autre fichier txt
                  N=N++;
                  }
              fclose(fichier); */
     
     
                 else
                 {
                 N + 1;
                 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);
                 }
                 fprintf(fichier, "%f\n", T); // On l'écrit toutes les températures dans le fichier
                 }
     
       }
       fclose(fichier); // ferme le fichier txt
    }
     
    int main()
    {
     dix_minutes();
     //FILE* fichier = NULL;
    // FILE* fichier = NULL;
     //while(1);
    }
    Le soucis est que je n'arrive pas à avoir les résultats du fichier "programme final bis.txt".

    Peux t'on faire deux voir plus de fichier .txt dans un même programme?

  9. #9
    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
    Peut on faire deux, voire plus de fichier .txt dans un même programme?
    Oui.

  10. #10
    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
    Mais où est donc mon erreur pour ne pas avoir la possiblilité de faire deux fichiers .txt

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <string.h>
     
    int N;
    float T, Ti;
    float Tmoyi, Tmoy;
    float T_trait;
     
    float dix_minutes();
    FILE* fichier = NULL;
    pointeurSurFichier);
    float dix_minutes()
    {
    Ti = 0;
    Tmoy = 0;
    FILE* fichier = NULL;
    fichier = fopen("programme final.txt", "w"); // création du fichier texte
    for (N=1; N!=10; N++)
        {
        printf("\nTapez la valeur T: "); // fenetre DOS pour les températures
        scanf("%f",&T);
        Ti = Ti + T;
        printf("Ti = %f\n", Ti);
     
              {  
              if ( fabs(Ti - T) <= 2.5) //+fabs(T) // valeur moyenne
                 {
                 N = N++;
                 printf("N = %i\n", N);
                 Tmoy = (Ti)/N;
                 printf("Tmoy = %f\n",Tmoy);
                 fichier = fopen("programme final bis.txt", "w");
                 if (N!=20)//; N!=20; N++) 
                 {
                 fprintf(fichier, "%f   %f\n", N, Tmoy); // enregistre les Tmoy et T dans un autre fichier txt
                 N = N+1;
                 } 
                 fclose(fichier); 
     
                 }
                 if (N>10)//, N>=10, N++)
                  {  
                  fichier = fopen("programme final bis.txt", "w");
                  fprintf(fichier, "%f   %f\n", Tmoy, T); // enregistre les Tmoy et T dans un autre fichier txt
                  N=N++;
                  }
              fclose(fichier); 
     
     
                 else
                 {
                 N + 1;
                 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);
                 }
                 fprintf(fichier, "%f\n", T); // On l'écrit toutes les températures dans le fichier
                 }
     
       }
       fclose(fichier); // ferme le fichier txt
    }
     
    int main()
    {
     dix_minutes();
     //FILE* fichier = NULL;
    // FILE* fichier = NULL;
     //while(1);
    }

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut
    Tu enregistre le pointeur vers ton fichier dans la même variable :
    FILE * fichier
    Il te faut un pointeur différent par fichier que tu ouvres

Discussions similaires

  1. [debutant]sauvegarde des valeurs dans un formulaire
    Par pimousse_cerise dans le forum JSF
    Réponses: 7
    Dernier message: 15/06/2007, 09h56
  2. sauvegarde des valeurs de variables déclarées
    Par SegmentationFault dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2006, 10h08
  3. Réponses: 20
    Dernier message: 23/03/2006, 16h21
  4. Sauvegarder des valeurs fixes
    Par kekesilo dans le forum Access
    Réponses: 5
    Dernier message: 21/12/2005, 14h14
  5. [OleVariant] Comment sauvegarder la valeur ?
    Par heid dans le forum Langage
    Réponses: 2
    Dernier message: 10/12/2004, 00h26

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