problème de calcul (mikroC)
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 46

problème de calcul (mikroC)



  1. #1
    narakphysics

    problème de calcul (mikroC)


    ------

    Bonjour à tous
    j'ai rencontré un problème au niveau du calcul à l'intérieure d'une fonction.
    je récupère des valeurs à partir du clavier 4*3 puis je fait appel à ma_fonction. mais toujours le calcul est faux!!!!!.
    quelqu'un peut m'aider!
    merci d'avance
    Voici un extrait du code:
    Code:
    char code1[10];
    char txt[15];
    /////////////code_enter///////////////
    
    void code_enter()
    {
    kp = 0;// Reset key code variable
    
    // Wait for key to be pressed and released
    do
    kp = Keypad_Key_Click();// Store key code in kp variable
    while (!kp);
    switch (kp)
     {
      case  1: kp = '1'; break; // 1
      case  2: kp = '2'; break; // 2
      case  3: kp = '3'; break; // 3
      case  5: kp = '4'; break; // 4
      case  6: kp = '5'; break; // 5
      case  7: kp = '6'; break; // 6
      case  9: kp = '7'; break; // 7
      case 10: kp = '8'; break; // 8
      case 11: kp = '9'; break; // 9
      case 13: kp = 46; break; 
      case 14: kp = 48; break; 
      case 15: kp = 45; break;
     }
    code1[i] = kp;
    Lcd_Chr(2, i+1, code1[i]);
    i++;
    }
    //////////////////
    void ma_fonction(int yy, int dd , int mm )
    {
       float d;
    d=yy-floor((7*(yy+floor((mm+9)/12)))/4)+floor((275*mm)/9)+dd-730530;
    Lcd_Cmd(_LCD_CLEAR);
    FloatToStr(d,txt);
    Lcd_Out(1, 1,"le résultat est :");
    Lcd_Out(2,1 ,txt) 
    }
    /////////////////
    void  main()
    {
    int year,mois,jour;
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Out(1, 1,"entrer l'année");
    for ( j=0; j<2 ; j++)
         {
         code_enter();
         }
          year=((code1[0]-'0')*10+(code1[1]-'0'));
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Out(1, 1,"entrer le mois");
    for ( j=0; j<2 ; j++)
         {
         code_enter();
         }
          jours=((code1[0]-'0')*10+(code1[1]-'0'));
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Out(1, 1,"entrer le jours ");
    for ( j=0; j<2 ; j++)
         {
         code_enter();
         }
          jour=((code1[0]-'0')*10+(code1[1]-'0'));
    ma_fonction(year, mois , jour);
    }

    -----
    Dernière modification par narakphysics ; 10/04/2012 à 19h25.

  2. #2
    invite03481543

    Re : problème de calcul (mikroC)

    Bonsoir,

    Code:
    code1[i] = kp;
    Lcd_Chr(2, i+1, code1[i]);
    i++;
    où initialises-tu i?

  3. #3
    narakphysics

    Re : problème de calcul (mikroC)

    merci pour votre réponse
    je l'ai initialisé en haut comme variable globale:
    unsigned i=0;

  4. #4
    invite03481543

    Re : problème de calcul (mikroC)

    Ok,

    c'est quoi ça?

    Code:
    year=((code1[0]-'0')*10+(code1[1]-'0'));

  5. A voir en vidéo sur Futura
  6. #5
    invite03481543

    Re : problème de calcul (mikroC)

    Si par exemple tu entres successivement:

    kp='1'
    puis
    kp='2'

    Ton calcul donnerait littéralement:

    year=(('1'-'0')*10+('2'-'0'));

    Ca n'a pas de sens utile de multiplier des caractères par un décimal ou de les soustraire...

    Je te suggères donc de stocker des décimales dans ton tableau, puis pour les transformer en valeurs ASCII tu ajoutes 48.

    @+

  7. #6
    narakphysics

    Re : problème de calcul (mikroC)

    Code1 est un tableau de type char, parce que normalement on récupère à partir du clavier que des caractères. et puisque je doit lire 2 valeurs de type char ;or le type du year est un entier c'est pourquoi la ligne suivante:
    Code:
    year=((code1[0]-'0')*10+(code1[1]-'0'));
    Pour rendre le résultat de type entier, j'ai utilisé l'astuce suivante:
    Code:
    code1[0]-'0'
    si par exemple :
    code1[0]='1' et code1[1]='2'
    donc:
    Code:
    year=10+2=12

  8. #7
    narakphysics

    Re : problème de calcul (mikroC)

    Citation Envoyé par HULK28 Voir le message
    Si par exemple tu entres successivement:

    kp='1'
    puis
    kp='2'

    Ton calcul donnerait littéralement:

    year=(('1'-'0')*10+('2'-'0'));

    Ca n'a pas de sens utile de multiplier des caractères par un décimal ou de les soustraire...

    Je te suggères donc de stocker des décimales dans ton tableau, puis pour les transformer en valeurs ASCII tu ajoutes 48.

    @+
    merci
    normalement lorsqu'on fait une opération arithmétique, le compilateur considère les opérandes comme des entier (et c'est le cas ici).
    est ce juste??

  9. #8
    invite03481543

    Re : problème de calcul (mikroC)

    Non, il va bien conserver le type char propre à un caractère et ton "1" par exemple sera équivalent pour lui à 49 en décimal, c'est cette valeur qui sera utilisée dans l'opération.
    Fais l'essai tu verras.
    Tu remplaces dans ta fonction code_enter() tous les caractères par des chiifres et tout rentrera dans l'ordre.

  10. #9
    narakphysics

    Re : problème de calcul (mikroC)

    mais code1 est de type char!
    j'ai pas bien compris .Pouvez vous me donner un exemple??

  11. #10
    invite03481543

    Re : problème de calcul (mikroC)

    Et bien sur tu modifies:
    Code:
    year=((code1[0]-'0')*10+(code1[1]-'0'));
    par:
    Code:
    year=((code1[0])*10+(code1[1]));
    Ainsi si tu veux entrer 12:

    kp=1;
    puis
    kp=2

    Soit:
    year=(1*10)+2=12

    Fais un watch de ta variable year et tu verras que c'est bon.
    @+

  12. #11
    invite03481543

    Re : problème de calcul (mikroC)

    Citation Envoyé par achrafkaran Voir le message
    mais code1 est de type char!
    j'ai pas bien compris .Pouvez vous me donner un exemple??
    code1 est un tableau contenant 8 éléments de type char.
    Dernière modification par HULK28 ; 10/04/2012 à 21h25.

  13. #12
    narakphysics

    Re : problème de calcul (mikroC)

    si j'ai bien compris on va faire comme ça:
    Code:
    void code_enter()
    {
    kp = 0;// Reset key code variable
    
    // Wait for key to be pressed and released
    do
    kp = Keypad_Key_Click();// Store key code in kp variable
    while (!kp);
    switch (kp)
     {
      case  1: kp = 49; break; // 1
      case  2: kp = 50; break; // 2
      case  3: kp = 51; break; // 3
      case  5: kp = 52; break; // 4
      case  6: kp = 53; break; // 5
      case  7: kp = 54; break; // 6
      case  9: kp = 55; break; // 7
      case 10: kp = 56; break; // 8
      case 11: kp = 57; break; // 9
      case 13: kp = 46; break; // *
      case 14: kp = 48; break; // 0
      case 15: kp = 45; break; // #
     }
    code1[i] = kp;
    //Lcd_Chr(2, i+1, '*');// Replace key ASCII value by "*" on Lcd
    Lcd_Chr(2, i+1, (char)code1[i]);
    i++;
    }

  14. #13
    umfred

    Re : problème de calcul (mikroC)

    Je pense que ça changera pas grand chose au résultat: ça fera 49-48=1 de toute façon aussi, mais il est vrai que quitte à faire cette opération autant le faire dès la réception du caractère dans code_enter quand tu associes le code retourné par Keypad_Key_Click.
    En regardant dans ala doc, il est préciser qu'il faut initialiser le Keypad par un appel à la fonction Keypad_Init(), or je ne vois pas cet appel dans le code que tu nous as fourni. (dans leur exemple, il le mette au niveau de ton kp=0 dans ta routine code_enter.

  15. #14
    invite03481543

    Re : problème de calcul (mikroC)

    Hum je commence à comprendre où es ta confusion, tu cherches sans doute à formater directement en ASCII les valeurs décimales.

    Donc, pas de problème il suffit d'indéxer la valeur numérique avec 48(10).

    Ainsi si tu écris:

    Code:
    switch (kp)
    {
      case  1: kp = 49; break; // pour la valeur décimale 1, 49 est l'équivalent ASCII
      case  2: kp = 50; break; // 2
      case  3: kp = 51; break; // 3
      .............................// etc
      default: break; // toujours penser à cela en fin de switch!!
    }
    code1[i] = kp;
    Lcd_Chr(2, i+1, code1[i]);
    Là tu affiches directement la valeur tapée sur ton LCD.

    Edit: j'ai posté après vos réponses que je ne pouvais voir, je vois que tu as compris.
    Dernière modification par HULK28 ; 10/04/2012 à 21h44.

  16. #15
    umfred

    Re : problème de calcul (mikroC)

    en fait, je viens de voir où est le problème (c'est tout bête)
    Citation Envoyé par achrafkaran Voir le message
    Code:
    ...
          year=((code1[0]-'0')*10+(code1[1]-'0'));
    ...
          jours=((code1[0]-'0')*10+(code1[1]-'0'));
    ...
          jour=((code1[0]-'0')*10+(code1[1]-'0'));
    là ça doit sauter aux yeux , tu utilises à chaque fois les 2 mêmes valeurs de ton tableau code1, or tu l'incrémente dans la fonction code_enter

    donc ça doit être
    Code:
    ...
          year=((code1[0]-'0')*10+(code1[1]-'0'));
    ...
          jours=((code1[2]-'0')*10+(code1[3]-'0'));
    ...
          jour=((code1[4]-'0')*10+(code1[5]-'0'));

  17. #16
    narakphysics

    Re : problème de calcul (mikroC)

    Citation Envoyé par umfred Voir le message
    en fait, je viens de voir où est le problème (c'est tout bête)


    là ça doit sauter aux yeux , tu utilises à chaque fois les 2 mêmes valeurs de ton tableau code1, or tu l'incrémente dans la fonction code_enter

    donc ça doit être
    Code:
    ...
          year=((code1[0]-'0')*10+(code1[1]-'0'));
    ...
          jours=((code1[2]-'0')*10+(code1[3]-'0'));
    ...
          jour=((code1[4]-'0')*10+(code1[5]-'0'));
    j'ai oublié de réinitialiser le i (erreur de frape car dans mon compilateur mikroC je l'ai pas oublié)
    void main()
    {
    int year,mois,jour;
    i=0;
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Out(1, 1,"entrer l'année");
    for ( j=0; j<2 ; j++)
    {
    code_enter();
    }
    year=((code1[0]-'0')*10+(code1[1]-'0'));
    i=0;
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Out(1, 1,"entrer le mois");
    for ( j=0; j<2 ; j++)
    {
    code_enter();
    }
    jours=((code1[0]-'0')*10+(code1[1]-'0'));
    i=0;
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Out(1, 1,"entrer le jours ");
    for ( j=0; j<2 ; j++)
    {
    code_enter();
    }
    jour=((code1[0]-'0')*10+(code1[1]-'0'));
    ma_fonction(year, mois , jour);
    }

  18. #17
    invite03481543

    Re : problème de calcul (mikroC)

    Bien vu Umfred, c'est surement ça
    Néanmoins manipuler des caractères de cette manière est une source de confusion et pas très propre comme procédé.

  19. #18
    narakphysics

    Re : problème de calcul (mikroC)

    non je crois pas qu'il vient de i.
    j'ai réinitialisé le i et toujours le même problème.
    @ Umfredésolé car j'ai écrit juste un extrait de mon code: Dans la main j'ai écrit les deux lignes suivantes:
    Code:
    Keypad_Init();                           // Initialize Keypad
     Lcd_Init();                              // Initialize Lcd
    j'ai testé le même code sur DevC++ et matlab,ces deux compilateurs donnent le même résultats mais mikroC non!!
    je crois que le problème c'est au niveau de l'affichage ou les types des valeurs . non?? normalement mikroc doit agir comme les autres compilateurs!!
    Dernière modification par narakphysics ; 10/04/2012 à 22h03.

  20. #19
    umfred

    Re : problème de calcul (mikroC)

    tu utilises jours pour le 2nd paramètres alors que ça devrait être mois, non ? encore une erreur de frappe ?
    le mieux pour le code c'est de faire un vrai copier-coller, ça éviterai ces malheureuses fautes de frappe qui nous induisent en erreur

    le keypad_init je le mettrai au début de code_enter personnellement pour voir.

    Dans le debugger, as-tu essayé de tracer les valeurs de kb, de code1[0], code1[1] de year, de mois et de jour pour voir si c'est bien ce que tu attends comme valeur (il faudra "sauter la fonction de lecture du keypad et modifier à la volée la valeur de kb à ce moment là)

  21. #20
    narakphysics

    Re : problème de calcul (mikroC)

    comment voir le contenu de ces variables à l'aide de mikcoC??

  22. #21
    invite03481543

    Re : problème de calcul (mikroC)

    Il faut te servir du debugger intégré.
    View, debug windows, watch values

    Colle ton prog complet, on va pas passer la nuit là dessus.
    Il manque des trucs dans ton prog et ça facilite pas la recherche.
    Y a rien de stratégique.

  23. #22
    umfred

    Re : problème de calcul (mikroC)

    tu dois avoir une icône avec des lunettes (view watch window) dans tes barres, qui va t'ouvrir une fenêtre dans laquelle tu dois pouvoir spécifier les variables

  24. #23
    invite03481543

    Re : problème de calcul (mikroC)

    C'est quoi le résultat de la compilation?
    Quelle version as-tu de mikroC?

    Mets ton code et je l'intègre dans mon IDE.
    @+

  25. #24
    narakphysics

    Re : problème de calcul (mikroC)

    merci beaucoup
    voici le code avec :
    PIC: 18F4550 .
    Quartz: 4MHz
    Code:
    unsigned int i=0;
    unsigned int j=0;
    unsigned int kp;
    char txt[16];
    char code1[8];                      //Hold Key code variabl
    char msg1[] = "Welcome .......";
    char text6[] = "entrer année";
    char text7[] = "entrer jour";
    char text8[] = "entrer mois";
    // Keypad module connections
    char  keypadPort at PORTD;
    // End Keypad module connections
      // LCD module connections
    sbit LCD_RS at LATB2_bit;  // for writing to output pin always use latch (PIC18 family)
    sbit LCD_EN at LATB3_bit;  // for writing to output pin always use latch (PIC18 family)
    sbit LCD_D4 at LATB4_bit;  // for writing to output pin always use latch (PIC18 family)
    sbit LCD_D5 at LATB5_bit;  // for writing to output pin always use latch (PIC18 family)
    sbit LCD_D6 at LATB6_bit;  // for writing to output pin always use latch (PIC18 family)
    sbit LCD_D7 at LATB7_bit;  // for writing to output pin always use latch (PIC18 family)
    
    sbit LCD_RS_Direction at TRISB2_bit;
    sbit LCD_EN_Direction at TRISB3_bit;
    sbit LCD_D4_Direction at TRISB4_bit;
    sbit LCD_D5_Direction at TRISB5_bit;
    sbit LCD_D6_Direction at TRISB6_bit;
    sbit LCD_D7_Direction at TRISB7_bit;
    // End LCD module connections
    
    sbit LED_G at PORTB.B0;
    sbit LED_R at PORTB.B1;
    sbit BUZZER at PORTC.B0;
    
    
    void code_enter()
    {
    kp = 0;// Reset key code variable
    
    // Wait for key to be pressed and released
    do
    kp = Keypad_Key_Click();// Store key code in kp variable
    while (!kp);
    switch (kp)
     {
      case  1: kp = '1'; break; // 1
      case  2: kp = '2'; break; // 2
      case  3: kp = '3'; break; // 3
      case  5: kp = '4'; break; // 4
      case  6: kp = '5'; break; // 5
      case  7: kp = '6'; break; // 6
      case  9: kp = '7'; break; // 7
      case 10: kp = '8'; break; // 8
      case 11: kp = '9'; break; // 9
      case 13: kp = 46; break; //
      case 14: kp = 48; break; //
      case 15: kp = 45; break; //
     }
    code1[i] = kp;
    //Lcd_Chr(2, i+1, '*');// Replace key ASCII value by "*" on Lcd
    Lcd_Chr(2, i+1, code1[i]);
    i++;
    }
     void Move_Delay() { // Function used for text moving
    Delay_ms(500); // You can change the moving speed here
    }
    void delay_20ms()
    {
     delay_ms(20);
    }
    void ma_fonction(int yy , int mm, int dd,float *d)
    {
    //float d;
    *d=367*yy-floor((7*(yy+floor((mm+9)/12)))/4)+floor((275*mm)/9)+dd-730530;
    }
    
    
    
    void  main()
    {
    int year, day , month ;
    float d;
    
      LATB = 0xFF;
      TRISB = 0xff;
     ADCON1 |= 0x0F;                    // Configure AN pins as digital
      CMCON  |= 7;                       // Disable comparators
    
     TRISA = 0x00;          // set direction to be output
     TRISB=0;
     PORTB=0;
    
     TRISC=0;
     PORTC=0;
     Keypad_Init();                           // Initialize Keypad
     Lcd_Init();                              // Initialize Lcd
     Lcd_Cmd(_LCD_CLEAR);                      // Clear display
     Lcd_Cmd(_LCD_CURSOR_OFF);                 // Cursor off
     Lcd_Out(1, 1,msg1);
                   i = 0;
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Out(1, 1,text6);
    for ( j=0; j<4 ; j++)
         {
         code_enter();
         }
           year=(int)((code1[0])*1000+(code1[1])*100+(code1[2])*10+(code1[3])*1);
    
               i = 0;
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Out(1, 1,text7);
    for ( j=0; j<2 ; j++)
         {
         code_enter();
         }
         day=(int)((code1[0])*10+(code1[1]));
            i = 0;
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Out(1, 1,text8);
    for ( j=0; j<2 ; j++)
         {
         code_enter();
         }
         month=(int)((code1[0])*10+(code1[1]));
    ma_fonction( year, day , month,&d);
      Lcd_Cmd(_LCD_CLEAR);
    FloatToStr(d,txt);
    Lcd_Out(1, 1,"résultat");
    Lcd_Out(2,1 ,txt) ;
    
    }
    Dernière modification par narakphysics ; 10/04/2012 à 22h45.

  26. #25
    invite03481543

    Re : problème de calcul (mikroC)

    Ok je regarde et je te tiens au courant.
    @+

  27. #26
    narakphysics

    Re : problème de calcul (mikroC)

    merci beaucoup

  28. #27
    invite03481543

    Re : problème de calcul (mikroC)

    La compilation est correcte ainsi que le linkage.
    Je regarderais demain en mode debugger pour tester les variables.
    Quel message obtiens-tu quand tu compiles?
    Quel version de mikroC as-tu?

  29. #28
    narakphysics

    Re : problème de calcul (mikroC)

    la version de mikroC est 8.2.0.0.
    j'ai testé par ces valeurs:
    year=2010, mois=03 et jour=16.
    le résultat est : -717288.8 ce qui est faux ,normalement je doit obtenir :3728.41

  30. #29
    invite03481543

    Re : problème de calcul (mikroC)

    void ma_fonction(int yy , int mm, int dd,float *d)

    J'ai quelques doutes sur cette fonction et son usage avec la fonction floor(), on verra ça demain.
    @+

  31. #30
    narakphysics

    Re : problème de calcul (mikroC)

    merci d'avance

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. Probléme avec le MIKROC
    Par akramovic dans le forum Électronique
    Réponses: 5
    Dernier message: 11/04/2015, 11h12
  2. mikroc probleme
    Par newtech1 dans le forum Électronique
    Réponses: 7
    Dernier message: 03/02/2012, 20h09
  3. problème --------->MikroC
    Par omar.STE dans le forum Électronique
    Réponses: 16
    Dernier message: 28/12/2011, 20h32
  4. Problème MikroC compilation
    Par maximilien dans le forum Électronique
    Réponses: 17
    Dernier message: 21/08/2009, 07h25
  5. problème avec mikroC
    Par ABN84 dans le forum Électronique
    Réponses: 4
    Dernier message: 07/03/2007, 16h47
Découvrez nos comparatifs produits sur l'informatique et les technologies.