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 :

formule avec differents type de variables comment bien formatter?


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Points : 58
    Points
    58
    Par défaut formule avec differents type de variables comment bien formatter?
    Bonjour,

    voici que je suis face à un probleme classiqe sans doute mais je voudrais savoir quelle est la bonne methode pour formatter des different stypes de variables dans une même formule, dois je passer par d'autres fonctions et comment ?

    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    unsigned 	int 	volume = 0x00;
    data unsigned int moyenne;  //data pour liberer mem
     
     
    unsigned long moyenne2;   
    int a = 25;
    float b = 0.001;
    int c =-77;
     
     
    moyenne2 = a * log10(moyenne/b)+c; //Erreur ici genere overspace memory
    printf("Moyenne en dB: %li\n", moyenne2) ;
    Avec cette formule je croyais qu'il fallait faire des castings, j'ai essayé
    comme ça mais ca ne marche pas :

    a * log10(moyenne/(int)b)+c;

    comment pourrais je faire ?

    Merci

  2. #2
    Membre actif Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Points : 295
    Points
    295
    Par défaut
    le log10 faisant plutot les calculs sur des float, j'aurai plutot tout mis en float avant de refaire un cast en int ou long int pour l'affectation
    il parait que la plume est plus forte que l'épée, heureusement j'ai une hache

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par straasha
    le log10 faisant plutot les calculs sur des float,<...>
    Non. Il fait des calculs sur des double.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include <math.h>
     
    double log10 (double x);
    Pas de Wi-Fi à la maison : CPL

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Aliveli
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    unsigned 	int 	volume = 0x00;
    data unsigned int moyenne;  //data pour liberer mem
     
    unsigned long moyenne2;   
    int a = 25;
    float b = 0.001;
    int c =-77;
     
    moyenne2 = a * log10(moyenne/b)+c; //Erreur ici genere overspace memory
    printf("Moyenne en dB: %li\n", moyenne2) ;
    moyenne n'est pas initialisé. Le comportement est indéfini. Peux-tu poster un code compilable STP ?

    Nota : data n'est pas standard. C'est pour un 8051, un PIC ?
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre du Club
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Points : 58
    Points
    58
    Par défaut
    au debut de la fonction, la variable moyenne est initialisée à 0
    et oui en effet data c'est pour un µc AT89C51SNDC1

    donc je ne sais pas quelle procedure utiliser pour que cette formule fonctionne?

    voici mon code pour cette fonction :
    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
     
    void CAG (void)
    {  
    	init_ADC();
    	Watch_Dog();
     
    	for (j=max_samples; j>0; j--)
    	{
    		samples[j] = samples[j-1];
     
    	}
     
    	ADCON = ADCON | 0x08;	//start A to D conversion
    	byte1 = ADDH<<2;
    	byte2 = ADDL;
    	samples[0] = byte1 + byte2;
        printf("samples[0] = %X\n", samples[0]) ; //1105 
    	moyenne = 0;
    	for (j=max_samples; j>0; j--)
    	{
    		moyenne = moyenne + samples[j];
            printf("samples[j] = %X\n", samples[j]) ; //1105   //2105 dis
     
    	}
    	moyenne = moyenne / max_samples;
        printf("VRAI moyenne sur echantillons de 10: %i\n", moyenne) ; //1105
     
    //////////////////////////////
     
        //printf("Math log:  %i\n", moyenne) ; //1105
     
        //   moyenne2 = a * log10(moyenne/b)+c; //2405
           printf("Moyenne en dB: %li\n", moyenne2) ; //1105
     
     
    ///////////////////////////////
     
     
    	if ((moyenne==0)&&(P1_5 == 1)) 			// If AUTOMATIC MODE & ADC Average=0
    	{
    		CPT_NoMic++;
    	}
     
    	if ((CPT_NoMic==60)&&(NoMic_Bit==0)) 	// If ADC Average=0 during 60 seconds
    	{
     
            #ifdef DEBUG_ME   //testali0304
    		printf("No ambiance microphone\n");	// No Ambiance microphone => Volume = maximum
            #endif            //testali0304
    		CPT_NoMic=0;
    		NoMic_Bit=1;
     
    	}
     
    	if ((moyenne>0)&&(P1_5 == 1)) // If ADC Average<>0 => Ambiance microphone (re-)connected
    	{
    		NoMic_Bit=0;
    	}
     
    switch(type_volume) { 
    case 0: 
      TEA6320_write_byte(0x00,0x20); // volume faible
     
      break; 
    case 1: 
      TEA6320_write_byte(0x00,0x33); // volume faible 
     
      break; 
    case 2: 
      //copier coller le code existant ici // volume adapté au volume ambiant 
     
     
     if (( moyenne >= 0)&&(moyenne < 7))
    	{
    	  	TEA6320_write_byte(0x00,0x20);    // Volume/Loudness
    		printf("Volumecag= 20\n");
     
    	}
    	if (( moyenne >= 7)&&(moyenne <11))
    	{
    		TEA6320_write_byte(0x00,0x22);    // Volume/Loudness
    		printf("Volumecag= 22\n");
     
    	}
    	if (( moyenne >= 11)&&(moyenne < 45))
    	{
    		TEA6320_write_byte(0x00,0x25);    // Volume/Loudness
    		printf("Volumecag= 25\n");
     
    	}
    	if (( moyenne >= 45)&&(moyenne < 101))
    	{
    		TEA6320_write_byte(0x00,0x27);    // Volume/Loudness
    		printf("Volumecag= 27\n");
     
    	}
    	if (( moyenne >= 101)&&(moyenne < 246))
    	{
    		TEA6320_write_byte(0x00,0x29);    // Volume/Loudness
    		printf("Volumecag= 29\n");
     
    	}
    	if (( moyenne >=246)&&(moyenne < 445))
    	{
    		TEA6320_write_byte(0x00,0x2B);    // Volume/Loudness
    		printf("Volumecag= 2B\n");
     
    	}
    	if (( moyenne >= 445)&&(moyenne < 596))
    	{
    		TEA6320_write_byte(0x00,0x2E);    // Volume/Loudness
    		printf("Volumecag= 2E\n");
     
    	}
    	if (( moyenne >= 596)&&(moyenne < 770))
    	{
    		TEA6320_write_byte(0x00,0x30);    // Volume/Loudness
    		printf("Volumecag= 30\n");
     
    	}
    	if ( moyenne >= 770)
    	{
    		TEA6320_write_byte(0x00,0x33);    // Volume/Loudness
    		printf("Volumecag= 33\n");
     
    	}
     
      break; 
     default: printf("Une erreur dans le switchcase \n");
     
    } 
     
     
    	if ((P1_5 == 0)&& (cond3 == 0))		// SW2 -> MANUAL MODE: first way
    	{
     
    		printf("MANUAL MODE\n");
    		printf("Menu: press ?\n");
     
     
    		cond3 = 1;
     
    	}
    	if ((P1_5 == 0) && (RI==0))			// SW2 -> MANUAL MODE: normal program cycle  
    	{
     
    		printf("MANUAL MODE...");
    		printf(" ADC value = %d",moyenne);
    		printf(" volume = %Xh\n",volume);         //0605
     
    	}
     
    	if ((P1_5 == 0) && (Menu_Flag==0) && (RI==1)) // SW2 -> MANUAL MODE if key detected
    	{
     
    	   if (typeutil==1)
    	   volume_PA();
    	   else
    	   volume_PAbis();
    	}
    	if (P1_5 == 1)		// SW2 -> AUTOMATIC MODE
    	{
     
    		printf("AUTO MODE: ");
    		printf("ADC value= %d ",moyenne);
    		printf(" ||  Volume= %X\n",VOL_TEA6320);
     
    	}
     
     
     
    }
    Merci

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Aliveli
    voici mon code pour cette fonction :
    Ce code n'est pas compilable.

    Ceci compile
    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
     
    #include <stdio.h>
    #include <math.h>
     
    #include "add.h"
    #include "ed/inc/bits.h"
     
    /* fonctions bidons */
    #define init_ADC()
    #define Watch_Dog()
    #define volume_PA()
    #define volume_PAbis()
     
    static void TEA6320_write_byte (unsigned a, unsigned b)
    {
       printf ("TEA6320 a=%02X b=%02X\n", a, b);
    }
     
    /* resultat acquisition */
    unsigned samples[16];
    size_t max_samples = sizeof samples / sizeof *samples;
     
    int j;
     
    unsigned byte1;
    unsigned byte2;
     
    int moyenne;
    long moyenne2;
     
    unsigned CPT_NoMic;
    unsigned NoMic_Bit;
     
    /* configuration */
    enum volume
    {
       VOLUME_FAIBLE,
       VOLUME_FORT,
       VOLUME_AUTO,
       VOLUME_NB
    }
    type_volume = VOLUME_AUTO;
     
    unsigned cond3;
    unsigned volume;
    unsigned Menu_Flag;
    unsigned typeutil;
    unsigned VOL_TEA6320;
     
    /* registres */
    unsigned char ADCON;
    unsigned P1;
     
    #define P1_5 mGET(P1, 5)
     
    unsigned RI;
     
    void CAG (void)
    {
       init_ADC ();
       Watch_Dog ();
     
       for (j = max_samples; j > 0; j--)
       {
          samples[j] = samples[j - 1];
       }
     
       ADCON = ADCON | 0x08;        //start A to D conversion
       byte1 = ADDH << 2;
       byte2 = ADDL;
       samples[0] = byte1 + byte2;
       printf ("samples[0] = %X\n", samples[0]); //1105
       moyenne = 0;
       for (j = max_samples; j > 0; j--)
       {
          moyenne = moyenne + samples[j];
          printf ("samples[j] = %X\n", samples[j]); //1105   //2105 dis
     
       }
       moyenne = moyenne / max_samples;
       printf ("VRAI moyenne sur echantillons de 10: %i\n", moyenne); //1105
     
    //////////////////////////////
     
       //printf("Math log:  %i\n", moyenne) ; //1105
     
       //   moyenne2 = a * log10(moyenne/b)+c; //2405
       printf ("Moyenne en dB: %ld\n", moyenne2); //1105
     
    ///////////////////////////////
     
       if ((moyenne == 0) && (P1_5 == 1)) // If AUTOMATIC MODE & ADC Average=0
       {
          CPT_NoMic++;
       }
     
       if ((CPT_NoMic == 60) && (NoMic_Bit == 0)) // If ADC Average=0 during 60 seconds
       {
     
    #ifdef DEBUG_ME                 //testali0304
          printf ("No ambiance microphone\n"); // No Ambiance microphone => Volume = maximum
    #endif //testali0304
          CPT_NoMic = 0;
          NoMic_Bit = 1;
     
       }
     
       if ((moyenne > 0) && (P1_5 == 1)) // If ADC Average<>0 => Ambiance microphone (re-)connected
       {
          NoMic_Bit = 0;
       }
     
       switch (type_volume)
       {
       case VOLUME_FAIBLE:
          TEA6320_write_byte (0x00, 0x20); // volume faible
     
          break;
       case VOLUME_FORT:
          TEA6320_write_byte (0x00, 0x33); // volume faible
     
          break;
       case VOLUME_AUTO:
          //copier coller le code existant ici // volume adapté au volume ambiant
     
          if ((moyenne >= 0) && (moyenne < 7))
          {
             TEA6320_write_byte (0x00, 0x20); // Volume/Loudness
             printf ("Volumecag= 20\n");
     
          }
          if ((moyenne >= 7) && (moyenne < 11))
          {
             TEA6320_write_byte (0x00, 0x22); // Volume/Loudness
             printf ("Volumecag= 22\n");
     
          }
          if ((moyenne >= 11) && (moyenne < 45))
          {
             TEA6320_write_byte (0x00, 0x25); // Volume/Loudness
             printf ("Volumecag= 25\n");
     
          }
          if ((moyenne >= 45) && (moyenne < 101))
          {
             TEA6320_write_byte (0x00, 0x27); // Volume/Loudness
             printf ("Volumecag= 27\n");
     
          }
          if ((moyenne >= 101) && (moyenne < 246))
          {
             TEA6320_write_byte (0x00, 0x29); // Volume/Loudness
             printf ("Volumecag= 29\n");
     
          }
          if ((moyenne >= 246) && (moyenne < 445))
          {
             TEA6320_write_byte (0x00, 0x2B); // Volume/Loudness
             printf ("Volumecag= 2B\n");
     
          }
          if ((moyenne >= 445) && (moyenne < 596))
          {
             TEA6320_write_byte (0x00, 0x2E); // Volume/Loudness
             printf ("Volumecag= 2E\n");
     
          }
          if ((moyenne >= 596) && (moyenne < 770))
          {
             TEA6320_write_byte (0x00, 0x30); // Volume/Loudness
             printf ("Volumecag= 30\n");
     
          }
          if (moyenne >= 770)
          {
             TEA6320_write_byte (0x00, 0x33); // Volume/Loudness
             printf ("Volumecag= 33\n");
     
          }
     
          break;
       default:
          printf ("Une erreur dans le switchcase \n");
     
       }
     
       if ((P1_5 == 0) && (cond3 == 0)) // SW2 -> MANUAL MODE: first way
       {
     
          printf ("MANUAL MODE\n");
          printf ("Menu: press ?\n");
     
          cond3 = 1;
     
       }
       if ((P1_5 == 0) && (RI == 0)) // SW2 -> MANUAL MODE: normal program cycle
       {
     
          printf ("MANUAL MODE...");
          printf (" ADC value = %d", moyenne);
          printf (" volume = %Xh\n", volume); //0605
     
       }
     
       if ((P1_5 == 0) && (Menu_Flag == 0) && (RI == 1)) // SW2 -> MANUAL MODE if key detected
       {
     
          if (typeutil == 1)
          {
             volume_PA ();
          }
          else
          {
             volume_PAbis ();
          }
       }
       if (P1_5 == 1)               // SW2 -> AUTOMATIC MODE
       {
     
          printf ("AUTO MODE: ");
          printf ("ADC value= %d ", moyenne);
          printf (" ||  Volume= %X\n", VOL_TEA6320);
     
       }
     
    }
     
    int main (void)
    {
     
       CAG ();
       return 0;
    }
    avec
    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
     
    #ifndef H_ED_ADD_20070525150539
    #define H_ED_ADD_20070525150539
     
    #ifdef __cplusplus
    extern "C"
    {
    #endif
     
    /* add.h */
     
    #define ADDH addh()
    #define ADDL addl()
     
       unsigned addh (void);
       unsigned addl (void);
     
    #ifdef __cplusplus
    }
    #endif
     
    #endif                          /* guard */
     
    /* Guards added by GUARD (c) ED 2000-2005 Jan 17 2005 Ver. 1.7 */
    ,
    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
     
    /* add.c */
     
    #include "add.h"
     
    #include <stddef.h>
     
    static unsigned g_sample[] =
    {
    /* *INDENT-OFF* */
       0x00, 0x00,
       0x00, 0x01,
       0x00, 0x03,
       0x00, 0x1A,
       0x01, 0x10,
       0x01, 0x1B,
       0x02, 0x33,
       0x02, 0x52,
       0x02, 0x10,
       0x01, 0x20,
       0x00, 0x7D,
       0x00, 0x41,
       0x00, 0x28,
       0x00, 0x1B,
       0x00, 0x08,
       0x00, 0x01,
    /* *INDENT-ON* */
    };
    size_t g_i;
     
    static unsigned get_sample(void)
    {
       unsigned data = g_sample[g_i];
       g_i = (g_i + 1) % sizeof g_sample / sizeof *g_sample;
       return data;
    }
     
    unsigned addh (void)
    {
       return get_sample();
    }
     
    unsigned addl (void)
    {
       return get_sample();
    }
    et
    http://emmanuel-delahaye.developpez..../ed/inc/bits.h
    Ce qui 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
    25
    26
    samples[0] = 0
    samples[j] = 0
    samples[j] = 0
    samples[j] = 0
    samples[j] = 0
    samples[j] = 0
    samples[j] = 0
    samples[j] = 0
    samples[j] = 0
    samples[j] = 0
    samples[j] = 0
    samples[j] = 0
    samples[j] = 0
    samples[j] = 0
    samples[j] = 0
    samples[j] = 0
    samples[j] = 0
    VRAI moyenne sur echantillons de 10: 0
    Moyenne en dB: 0
    TEA6320 a=00 b=20
    Volumecag= 20
    MANUAL MODE
    Menu: press ?
    MANUAL MODE... ADC value = 0 volume = 0h
     
    Press ENTER to continue.
    Il y a du code non activé. Il y a peut être des modifications à faire pour que ça fonctionne mieux ? L'état de moyenne et de moyenne2 n'est pas clair...
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre du Club
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Points : 58
    Points
    58
    Par défaut
    Merci,

    Voila je ne comprend pas bcp le changement que tu as fait mais chez moi ça compile bien, oui c'est pas trop professionnel mais dsl je ne suis pas encore expert En fait tu as apporté des changements sur ma fonction en ayant ajouter des includes (.h) et autres codes pourquoi ?
    Mais c'est merci beaucoup si il le faut j'adapterai tes changments je vais m'y pencher la dessus.

    Pour ce qui est de la formule je ne vois toujours pas comment faire j'ai faits ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    ((float)a) * log10(((float)moyenne)/b)+((float)c)
    Mais le cast ne va pas ?

    Merci

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Aliveli
    Voila je ne comprend pas bcp le changement que tu as fait mais chez moi ça compile bien, oui c'est pas trop professionnel mais dsl je ne suis pas encore expert En fait tu as apporté des changements sur ma fonction en ayant ajouter des includes (.h) et autres codes pourquoi ?
    Je n'ai rien changé dans le fond. J'ai juste adapté la forme pour qu'il soit portable et compilable et testable chez moi (et chez n'importe qui qui n'a pas ton environnement de développement)...

    Par contre je m'attendais à ce que tu clarifies l'initialisation et le rôle de moyenne et moyenne2, ainsi que du code en commentaire. Il faut l'activer ?
    Pour ce qui est de la formule je ne vois toujours pas comment faire j'ai faits ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ((float)a) * log10(((float)moyenne)/b)+((float)c)
    Il y a ça dans ton code ?
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Membre du Club
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Points : 58
    Points
    58
    Par défaut
    voila au depart de la fonction j'initialise un tableau ( de facon a ce que je puisse faire une moyenne ) pour le quel max_samples est defini a 10 de maniere a avoir une moyenne sur 10 echantillons mais chaque seconde il ya une valeur d'acquisiton 'samples' (byte1 et byte2). Donc 'moyenne' correspond a une moyenne sur 10 acquisitions.

    Concernant l'acquisition mon microcontrolleur a un ADC de 10 bit j'ai donc 1024 valeurs possible de 'samples', l'acquisition se fait sur un signal en volt delivrer par un microphone, c'est pourquoi je voulais aussi presenter 'moyenne' en terme de decibel d'ou l'utilisation de cette formule.

    et moyenne2 c'est moyenne mais en representation dB mais comme ca ne marchait pas j'ai mis ca en commentaire.

    Par contre ce code:

    ((float)a) * log10(((float)moyenne)/b)+((float)c)

    ne figure pas dans mon programme car c'est un test que j'ai fait apres mais qui ne fonctionne malheureusement pas.

    Merci

  10. #10
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Aliveli
    Par contre ce code:

    ((float)a) * log10(((float)moyenne)/b)+((float)c)

    ne figure pas dans mon programme car c'est un test que j'ai fait apres mais qui ne fonctionne malheureusement pas.

    Normal, log10 comme toutes les fonctions de maths par défaut prend des DOUBLES. Et de plus il y a une erreur de parenthèses dans tes casts.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double result ;
     
    result = (double)a * log10(((double)moyenne/(double)b))+ (double)c ;
    marchera... même si a, b, c, et moyenne sont des entiers.
    (en notant que les cast en double ne sont pas partout indispensables, puisque
    un opérande en double suffit, ou même le résultat (SAUF si il s'agit d'une division
    )).

    On pourrait donc simplifier en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double result ;
     
    result = a * log10(((double)moyenne/(double)b)) + c ;
    ou même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double result ;
     
    result = a * log10((moyenne/(double)b)) + c ;

    Par contre, ton calcul de la moyenne sera toujours faux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      moyenne = moyenne / max_samples;
    étant entre 2 entiers fait une division entière....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      moyenne = (int)((double)moyenne / (double)max_samples) ;
    donnera le vrai résultat EN ENTIER, puisque moyenne est entier..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. Tableaux avec différents types de variables
    Par Pulpe_de_Citron dans le forum Débuter
    Réponses: 5
    Dernier message: 06/05/2015, 12h00
  2. Association entre texte et different type de variable
    Par elraton dans le forum Débuter
    Réponses: 8
    Dernier message: 03/09/2008, 12h02
  3. [Débutant] problème avec les types de variables
    Par mitmit dans le forum Débuter
    Réponses: 10
    Dernier message: 14/02/2008, 11h40
  4. "Tableau" avec plusieurs types de variables
    Par izguit dans le forum C++
    Réponses: 4
    Dernier message: 19/07/2007, 11h24
  5. Problème avec les types de variable
    Par binhjuventus dans le forum C++Builder
    Réponses: 2
    Dernier message: 13/07/2006, 12h30

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