NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 4330 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 8 از 8

موضوع: مشکل فلسفی با تسلسل !!!! و مشروط شدن مقدار دو پارامتر به یکدیگر

  1. #1
    کاربر علاقه مند
    تاریخ عضویت
    Aug 2011
    نوشته ها
    77
    تشکر
    46
    تشکر شده 29 بار در 26 پست

    پیش فرض مشکل فلسفی با تسلسل !!!! و مشروط شدن مقدار دو پارامتر به یکدیگر

    سلام

    من یه پروژه اسیلوسکوپ دوکاناله دارم و الان دارم روی توابع voltdivision , timedivision اون کار میکنم....

    برای مقادیر voltdivision دو تا پوش باتن دارم که برای کم و زیاد کردن بکار میرن و مقادیر هم 1 و 2 و 5 هستند...

    قصد دارم با تابع sprintf مقادیری رو روی glcd پروژه ام بفرستم ولی مشکل اینه...

    در شروع به کار اسیلوسکوپ مقدار voltdiv رو 2 گذاشتم... با دکمه incvoltdiv تابعی به همین نام اجرا میشه و اون 2 رو به 5 تبدیل میکنه... در حالت دیگه چک میکنه که اگر روی GLCD عدد 1 ارسال شده بود اون عدد بشه 2.

    و برای تابع decvoltdiv اگر مقدار اولیه 5 بود بشه 2 و اگر 2 بود بشه 1...

    اما مشکل...

    این برنامه رو ببینید:

    کد:
    #include <mega32a.h>
    #include <stdio.h>
    #include <delay.h>
    #include <glcd.h>
    #include <string.h>
    #include <font5x7.h>
    unsigned char A[20];//// baraye sprintf voltdiv
    unsigned char B[20];//// baraye sprintf voltdiv
    unsigned char z,y;
    unsigned char vdc1=0,vdc2=0,z,y;///counter haye vlotdiv
    void incvoltdiv (void);
    void decvoltdiv (void);
    void main(void)
    {
    // Declare your local variables here
    // Graphic LCD initialization data
    GLCDINIT_t glcd_init_data;
    
    glcd_init_data.font=font5x7;
    // No function is used for reading
    // image data from external memory
    glcd_init_data.readxmem=NULL;
    // No function is used for writing
    // image data to external memory
    glcd_init_data.writexmem=NULL;
    glcd_init(&glcd_init_data);
    while (1)
          {  
           ///namayesh meghdar avalieh voltdivision va timedivision 
           if (vdc1==0 && vdc2==0){
           sprintf(A,"%2d",2);
           glcd_outtextxy(12,55,A);
           z=2;
           } 
         //kelid 5
         if(PINB.4 ==0){
         delay_ms(20);
         if(PINB.4 ==0)
         incvoltdiv();
         vdc1++; 
          if(vdc1>3)
         vdc1=3;
         if(vdc2>0)
         vdc2--;
         }
         // kelid 6
         if(PINB.5 ==0){
         delay_ms(20);
         if(PINB.5 ==0)
         decvoltdiv();
         vdc2++;
         if(vdc2>3)
         vdc2=3;
         if(vdc1>0)
         vdc1--;
         }       
    } 
    }
    ////////////////////////
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //// afzayesh volt division
    void incvoltdiv (void)
    {
    glcd_outtextxyf (2,5,"incvoltdiv");
    delay_ms(300);
    for(i=2;i<20;i++){
    for(j=2;j<62;j++)
    glcd_clrpixel(j,i);}
    if ( strcmp(A,"2") || y == 2){
    sprintf (A,"%2d",5);
    glcd_outtextxy ( 12,55,A);
    strcpy (A,"5");
    z=5;}
    else
    {if(strcmp (B,"1") || y==1) ///// namayesh adad 2
    sprintf (A,"%2d",2);
    glcd_outtextxy ( 12,55,A);
    z = 2; 
     } }
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void decvoltdiv (void)
    {
    glcd_outtextxyf (2,5,"decvoltdiv");
    delay_ms(300);
    for(i=2;i<20;i++){
    for(j=2;j<62;j++)
    glcd_clrpixel(j,i);
    }
    if(strcmp (A,"5") || z==5){
    sprintf (B,"%2d",2);
    glcd_outtextxy(12,55,B);
    y =2;
    } 
    //////
    if (strcmp(A,"2") || z==2) ;
    sprintf(B,"%2d",1);
    glcd_outtextxy(12,55,B);
    strcpy(B,"1");
    y =1;
    }
    تو این برنامه در تابع decvoltdiv مقدارB زمانی 1 میشه که A برابر 2 باشه (( توسط تابع incvoltdiv )) و 2 شدن A هم در تابع incvoltdiv اتفاق میفته و اونهم زمانیکه مقدار B برابر 1 باشه...!!!

    به بیان دیگه مقدار A وابسته به B و مقدار B هم وابسته به A میشه... بنابر این در این برنامه هرگز مقدار A برابر 2 و مقدار B برابر 1 نمیشه...!!

    درست مثل دونفر آدم به اسم A و B که سر وارد شدن به جائی با هم تعارف میکنن!! A به B میگه تا شما وارد نشی منهم وارد نمیشم و B هم به A میگه من فقط پشت سر شما وارد میشم... نتیجه این میشه که هیشکی وارد نمیشه ...!!!

    یه کمکی بکنید که این موضوع رو حل کنم... باور کنید سه روزه گرفتار همین موضوعم...!!

    ممنون.

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  3. #2
    مدير بخش STM32 sadmonew آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    صادق محمدي
    نوشته ها
    2,002
    تشکر
    6,283
    تشکر شده 3,115 بار در 1,408 پست

    پیش فرض

    سلام مهندس
    سوال:
    1- متغيرهاي z و y براي چه قسمتي به كار ميرن؟
    -------------------------------------------------------------------
    2- چرا متغير هاي A و B رو به اون صورت تعريف كردين؟
    توي برنامه مشخصه كه اين متغير، فقط سه كاراكتر 1 يا 2 يا 5 رو در خودش ذخيره ميكنه. پس به اين صورت تعريف كنيد.
    کد:
    unsigned char A[1];//// baraye sprintf voltdiv
    unsigned char B[1];//// baraye sprintf voltdiv
    -------------------------------------------------------------------
    3- متغير A رو ابتداي برنامه مقدار دهي كردين اما متغير B رو نه!
    ---------------------------------------------------------------------------------------------------------------------------
    براي دستور if درستش اينه كه بنويسيد:
    کد:
    if ( strcmp(A,"2")==0 || y == 2){
    __________________________________________________ ______________________________________
    مهندس اي كاش، اسم متغيرها رو بهتر انتخاب ميكردين(يه پيشنهاد). اينطوري راحت تر ميشه مشكل برنامه رو متوجه شد.
    ویرایش توسط sadmonew : 03-07-2012 در ساعت 00:03
    _____________________________________
    _____________________________________

  4. تشکرها از این نوشته :


  5. #3
    کاربر علاقه مند
    تاریخ عضویت
    Aug 2011
    نوشته ها
    77
    تشکر
    46
    تشکر شده 29 بار در 26 پست

    پیش فرض

    نقل قول نوشته اصلی توسط sadmonew نمایش پست ها
    سلام مهندس
    سوال:
    1- متغيرهاي z و y براي چه قسمتي به كار ميرن؟
    -------------------------------------------------------------------
    2- چرا متغير هاي A و B رو به اون صورت تعريف كردين؟
    توي برنامه مشخصه كه اين متغير، فقط سه كاراكتر 1 يا 2 يا 5 رو در خودش ذخيره ميكنه. پس به اين صورت تعريف كنيد.
    کد:
    unsigned char A[1];//// baraye sprintf voltdiv
    unsigned char B[1];//// baraye sprintf voltdiv
    -------------------------------------------------------------------
    3- متغير A رو ابتداي برنامه مقدار دهي كردين اما متغير B رو نه!
    ---------------------------------------------------------------------------------------------------------------------------
    براي دستور if درستش اينه كه بنويسيد:
    کد:
    if ( strcmp(A,"2")==0 || y == 2){
    __________________________________________________ ______________________________________
    مهندس اي كاش، اسم متغيرها رو بهتر انتخاب ميكردين(يه پيشنهاد). اينطوري راحت تر ميشه مشكل برنامه رو متوجه شد.
    ممنون

    آرایه های کاراکتری A و B برای تبدیل مقادیر ثابت به رشته کاراکتری از طریق دستور sprintf بکار میرن... با دستور sprintf مقدار میگیرن و سپس در طول برنامه چک میشن که مقدارشون چی بوده... یعنی رو lcd چی ارسال شده ....
    y و z برای محکم کاری هستند و مقدارشون با A و B یکی است...!! چون شک داشم که دستور strcmp کار کنه ازشون استفاده کردم... شاید بعدا پاکشون کردم.

    برای مقدار دهی اولیه متغیر A و عدم مقدار دهی B.... با اینکار خواستم بعد از روشن روشن اسکوپ مقدار voltdivision برابر 5 باشه و از طرفی بشه یه مقدار اولیه برای کار با اون دوتا تابع داشت.

  6. #4
    مدير بخش STM32 sadmonew آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    صادق محمدي
    نوشته ها
    2,002
    تشکر
    6,283
    تشکر شده 3,115 بار در 1,408 پست

    پیش فرض

    نقل قول نوشته اصلی توسط roberty نمایش پست ها
    ممنون

    آرایه های کاراکتری a و b برای تبدیل مقادیر ثابت به رشته کاراکتری از طریق دستور sprintf بکار میرن... با دستور sprintf مقدار میگیرن و سپس در طول برنامه چک میشن که مقدارشون چی بوده... یعنی رو lcd چی ارسال شده ....
    Y و z برای محکم کاری هستند و مقدارشون با a و b یکی است...!! چون شک داشم که دستور strcmp کار کنه ازشون استفاده کردم... شاید بعدا پاکشون کردم.

    برای مقدار دهی اولیه متغیر a و عدم مقدار دهی b.... با اینکار خواستم بعد از روشن روشن اسکوپ مقدار voltdivision برابر 5 باشه و از طرفی بشه یه مقدار اولیه برای کار با اون دوتا تابع داشت.
    سلام
    مهندس جواب گرفتين؟ لطفا نتيجه رو بگيد.

  7. #5
    کاربر علاقه مند
    تاریخ عضویت
    Aug 2011
    نوشته ها
    77
    تشکر
    46
    تشکر شده 29 بار در 26 پست

    پیش فرض

    نقل قول نوشته اصلی توسط sadmonew نمایش پست ها
    سلام
    مهندس جواب گرفتين؟ لطفا نتيجه رو بگيد.
    نه آقا... نشد...

    مجبور شدم کلا دو حالت برای توابع voltdiv تعریف کنم ... یکی 5 و دیگری 2... اینجوری اون بدبختی که گفتم پیش نمیاد ولی دامنه کاری اسیلوسکوپ هم کمتر میشه...

  8. #6
    کاربر علاقه مند
    تاریخ عضویت
    Aug 2011
    نوشته ها
    77
    تشکر
    46
    تشکر شده 29 بار در 26 پست

    پیش فرض

    اين برنامه رو ببينيد:

    کد:
    #include <mega32a.h>
    #include <glcd.h>
    #include <font5x7.h>
    #include <delay.h>
    #include <stdio.h>
    #include <string.h>                                  
    int vdc1=0;
    int vdc2=0;
    unsigned char A[20];
    void incvoltdiv(void);
    void decvoltdiv (void);
    void main(void)
    {
    GLCDINIT_t glcd_init_data;
    glcd_init_data.font=font5x7;
    glcd_init_data.readxmem=NULL;
    glcd_init_data.writexmem=NULL;
    glcd_init(&glcd_init_data);
    while (1)
          { 
          if (vdc1==0 && vdc2==0){ 
          sprintf(A,"%2d",5);
          strcpy(A,"5");
          glcd_outtextxy( 12,55,A);  
           } 
         //kelid 5
         if(PINB.4 ==0){
         delay_ms(50);
         if(PINB.4 ==0)
         incvoltdiv();
         vdc1++;
         if(vdc1>3)
         vdc1=3; 
         }
         if(vdc1>3)
         vdc1=3;
         // kelid 6
         if(PINB.5 ==0){
         delay_ms(50);
         if(PINB.5 ==0)
         decvoltdiv();
         vdc2++;
         }
         if(vdc2>3)
         vdc2=3;
         }
    }
    ////afzayesh volt division
     void incvoltdiv (void)
    {
    if(strcmp(A,"2")==0){
    sprintf(A,"%2d",5);
    glcd_outtextxy(12,55,A);
    }
    else
    glcd_outtextxy(17,55,"2");
    }
    //// kahesh volt division
    void decvoltdiv (void)
    {
    if(strcmp(A,"5")==0){
    sprintf(A,"%2d",2);
    glcd_outtextxy(12,55,A);
    }
    else
    glcd_outtextxy(17,55,"1");
    }
    دوتا کانتر داريم... vdc1 و vdc2 که اولي تعداد دفعات زده شدن پوش باتن پنجم و دومي هم تعداد دفعات زده شدن پوش باتن ششم رو ميشماره.

    در اول برنامه از طريق دستور sprintf مقدار آرايه کاراکتري A رو برابر 5 ميکنم... اين يعني وقتي دستگاه روشن ميشه رو lcd عدد 5 رو داريم...

    با دستور sprintf آرايه A رو مقدار دهي ميکنم و با دستور glcd_outtextxy هم اون مقدار رو در مختصاتي خاص از lcd ميفرستم... البته ال سي دي گرافيکي!!

    تو اين برنامه دوتا تابع داريم incvoltdiv و decvoltdiv..

    در تابع اولي ميخوام از طريق دستور strcmp چک کنم که اگر بر روي lcd عدد 2 فرستاده شده بود با اجراي تابع بشود 5 و اگر عدد 1 فرستاده شده بود بشود 2 ...

    و در تابع دومي از طريق همون strcmp ميخوام اگر در lcd عدد 2 بود بشه 1 و اگر 5 بود بشه 2....


    اما مشکل...

    آقا نميدونم چرا...برنامه بدون ارور کامپايل و run ميشه ولي براي هر دو تابع تنها قسمت else اجرا ميشن و اصلا وارد حلقه if نميشه...

    چيکار کنم ...؟

    ممنون از کمکتون.

  9. #7
    کاربر فعال
    تاریخ عضویت
    Mar 2010
    نوشته ها
    236
    تشکر
    101
    تشکر شده 246 بار در 163 پست

    پیش فرض

    شما ارایه a رو مقدار 5 میدید ( با Strcpy ) بعد از اون هم فقط دارید مقایسه میکنید
    جای دیگه ایی مقدار ارایه a عوض نمیشه که بخواد شرط if برقرار بشه

  10. #8
    مدير بخش STM32 sadmonew آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    صادق محمدي
    نوشته ها
    2,002
    تشکر
    6,283
    تشکر شده 3,115 بار در 1,408 پست

    پیش فرض

    سلام مهندس
    شما دو تا تصحيح تو برنامه انجام بده:
    1- متغير A رو به صورت تعريف كن:
    کد:
    char A[20];
    2- عدد 2 داخل دستور sprintf رو بردار به اين صورت:
    کد:
    sprintf(A,"%d",5);
    بعد اينكه اين كارهارو انجام دادي، كامپايل كن. به اميد خدا جواب ميده.
    _____________________________________
    _____________________________________

موضوعات مشابه

  1. تسلیت به مناسبت توهین به پیامبر اسلام
    توسط M.ABDOLLAHI در انجمن گفت و گوي آزاد
    پاسخ: 8
    آخرين نوشته: 15-09-2012, 15:20

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •