problème de calcul (mikroC) - Page 2
Répondre à la discussion
Page 2 sur 2 PremièrePremière 2
Affichage des résultats 31 à 46 sur 46

problème de calcul (mikroC)



  1. #31
    narakphysics

    Re : problème de calcul (mikroC)


    ------

    juste une erreur au niveau d'appel de la fonction: au lieu d'écrire ma_fonction( year, day , month,&d);
    veuillez écrire ma_fonction( year, month , day,&d); j'ai permuté le jour et le mois!!
    mais finalement ,il reste toujours le même problème!! vraiment blizzard!!

    -----

  2. #32
    umfred

    Re : problème de calcul (mikroC)

    Dans le dernier code que tu nous as fournis, je ne vois pas l'opération de code1[i]-48 (ou code1[i]-'0') dont tu nous as parlé plus tôt ... et qui est utile sinon tu fais l'opération avec le code ASCII du chiffre;
    par exemple:
    pour l'année 2010 tu as year = 50*1000+48*100+49*10+48*1=5533 8 en non-signé mais comme il est signé ça fait -10196
    pour le mois 03 tu as month = 48*10+51=531
    pour le jour 16 tu as day = 49*10+54=544
    donc ton gros calcul donne d=367*-10196-floor((7*(-10196+floor((544+9)/12)))/4)+floor((275*544)/9)+531-730530 ce qui doit donner ton résultat (j'ai du mal à le retrouver par calcul ton résultat, mais on doit y arriver (les histoires de limites des types et d'overflow pffiou pas facile avec un si gros calcul ))

    (d'ailleurs, fais attention tu donnes a ta fonction la variable year, puis day puis month (qui se nomme respectivement dans ta fonction yy, mm, dd . est-ce la bonne logique ?)



    essaie en rajoutant l'opération code1[i]-48 (ou code1[i]-'0') pour voir ..

  3. #33
    narakphysics

    Re : problème de calcul (mikroC)

    merci beaucoup
    pour l'appel de la fonction , oui vous avez raison j'ai fait une erreur. en fait j'ai permuté le mois et le jours. j'ai signal cette erreur dans le dernier message.
    je vais tester maintenant et je vais vous répondre

  4. #34
    narakphysics

    Re : problème de calcul (mikroC)

    j'ai essayé ces 3 lignes:
    Code:
    year=((code1[0]-48)*1000+(code1[1]-48)*100+(code1[2]-48)*10+(code1[3]-48)*1);
    day=((code1[0]-48)*10+(code1[1]-48));
     month=(code1[0]-48)*10+(code1[1]-48);
    le résultat est : -716785.8
    PS: pour voir le résultat, j'utilise ISIS ( une clavier+afficheur lcd+PIC18F4550)
    Dernière modification par narakphysics ; 11/04/2012 à 01h03.

  5. #35
    invite03481543

    Re : problème de calcul (mikroC)

    Fais un copié-collé et teste sur ta maquette:

    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);
    }
    float ma_fonction(int yy , int mm, int dd)
    {
    float temp, d;
    temp = floor((mm+9)/12);
    d = 367*yy-floor((7*(yy+temp))/4)+floor((275*mm)/9)+dd-730530;
    return(d);
    }
    void  main()
    {
    int year, month , day ;
    float temp;
    
      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]));
    temp = ma_fonction( year, month , day);
    Lcd_Cmd(_LCD_CLEAR);
    FloatToStr(temp,txt);
    Lcd_Out(1, 1,"résultat");
    Lcd_Out(2,1 ,txt) ;
    }
    Dernière modification par HULK28 ; 11/04/2012 à 14h53.

  6. #36
    narakphysics

    Re : problème de calcul (mikroC)

    Merci beaucoup M HULK
    le résultat est : -717670.8!!

  7. #37
    invite03481543

    Re : problème de calcul (mikroC)

    Je ne trouve pas ça.
    Tu as entré quoi comme valeurs?

  8. #38
    narakphysics

    Re : problème de calcul (mikroC)

    year=2010;mois=03;jours=16

  9. #39
    invite03481543

    Re : problème de calcul (mikroC)

    d = 367*yy-floor((7*(yy+temp))/4)+floor((275*mm)/9)+dd-730530;

    year=2010;mois=03;jours=16
    temp = floor((mm+9)/12) soit temp=floor(3+9)/12=1

    d=367*2010-floor(7*(2010+1)/4)+floor((275*3)/9)+16-730530
    d=737670-3519+91+16-730530=3728

    Vérifie bien, il y a quelque chose que tu fais mal.

  10. #40
    narakphysics

    Re : problème de calcul (mikroC)

    oui vous avez raison:
    j'ai fait une astuce:
    au lieu de calculer l'expression j'ai affecté directement à d la valeur 3728==>le programme affiche exactement 3728!
    par contre si je modifie ma_fonction afin de voir le calcul de chaque terme!!:
    le résultat est incroyable!!!:
    temp=25.99999 au lieu de 1;
    tempo1=5695.99 au lieu de 737670;
    tempo2=2281.99 au lieu 91.6666;
    tempo3=21635.24 au lieu de 3519.25;

    Code:
    float ma_fonction(int yy , int mm, int dd)
    {
    float temp,tempo1,tempo2,tempo3, d;
    temp = (mm+9)/12;
     Lcd_Cmd(_LCD_CLEAR);
     FloatToStr(temp,txt);
    Lcd_Out(1, 1,"temp");
    Lcd_Out(2,1 ,txt) ;
    Delay_ms(1000);
    tempo1=367*yy;
     Lcd_Cmd(_LCD_CLEAR);
     FloatToStr(tempo1,txt);
    Lcd_Out(1, 1,"tempo1");
    Lcd_Out(2,1 ,txt) ;
    Delay_ms(1000);
    tempo2=(275*mm)/9;
     Lcd_Cmd(_LCD_CLEAR);
     FloatToStr(tempo2,txt);
    Lcd_Out(1, 1,"tmpo2");
    Lcd_Out(2,1 ,txt) ;
    Delay_ms(1000);
    tempo3=  (7*(yy+temp))/4;
     Lcd_Cmd(_LCD_CLEAR);
     FloatToStr(tempo3,txt);
    Lcd_Out(1, 1,"tempo3");
    Lcd_Out(2,1 ,txt) ;
    Delay_ms(1000);
    d =tempo1-tempo3+tempo2+dd-730530;
    return(d);
    }

  11. #41
    invite89303051

    Re : problème de calcul (mikroC)

    Bonjour

    En regardant vite fait le code, j'ai un souci concernant les calculs style : "year=(int)((code1[0])*1000+(code1[1])*100+(code1[2])*10+(code1[3])*1);"
    code1[] est un tableau de char. donc 8 bits.
    Tu mets à jour avec un caractère, pas de soucis, mais le caractère '1' n'a pas la valeur 1, mais 0x31.
    en plus, je pense qu' un char multiplié par quelque chose donne encore un char, donc sur 8 bits également,
    essaye un truc comme ça en décomposant bien pour vérifier le calcul.

    int travail;
    year=(int)(code1[0] - 0x30); //J'ai un int
    year *= 1000;
    travail = (int)(code1[1] - 0x30);
    year += (travail * 100);
    travail = (int)(code1[2] - 0x30);
    year += (travail * 10);
    travail = (int)(code1[3] - 0x30);
    year += travail;

    sinon, tu fais code1[4] = 0x00 et utilise la fonction atoi();
    Cordialement

  12. #42
    invite03481543

    Re : problème de calcul (mikroC)

    On en a parlé hier déjà

  13. #43
    narakphysics

    Re : problème de calcul (mikroC)

    j'ai résolu le problème:
    le problème est au niveau yy*367. En effet,lorsque j'ai forcé le type de yy à float , le programme m'a donner les bons résultats.
    mais j'ai pas bien compris pourquoi???
    si on regarde le livre de mikroC , une variable de type int prend une valeur entre -32768 .. 32767 .
    or 367*2010=737670==>hors intervalle !! l'addition est fait en considérant yy comme un int!!
    est ce juste ce raisonnement ??

  14. #44
    umfred

    Re : problème de calcul (mikroC)

    c'est un peu ce que j'avais essayer de dire dans ce post là
    Citation Envoyé par umfred Voir le message
    ... (les histoires de limites des types et d'overflow pffiou pas facile avec un si gros calcul ))
    ...
    peut être qu'en faisant yy*367.0 (en laissant yy en int) ça aurait forcer le calcul en flottant.

  15. #45
    narakphysics

    Re : problème de calcul (mikroC)

    Merci à tous les membres qui m'ont aidé à trouver la solution
    merci beaucoup encore une fois

  16. #46
    invite03481543

    Re : problème de calcul (mikroC)

    Bravo à toi pour ta persévérance en tout cas.

Page 2 sur 2 PremièrePremière 2

Discussions similaires

  1. Probléme avec le MIKROC
    Par inviteec04ebc4 dans le forum Électronique
    Réponses: 5
    Dernier message: 11/04/2015, 11h12
  2. mikroc probleme
    Par invite7dc03981 dans le forum Électronique
    Réponses: 7
    Dernier message: 03/02/2012, 20h09
  3. problème --------->MikroC
    Par invite0a63013b dans le forum Électronique
    Réponses: 16
    Dernier message: 28/12/2011, 20h32
  4. Problème MikroC compilation
    Par invite2de7076a 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
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...