اطلاعیه

Collapse
No announcement yet.

چرا حلقه با دستور break شکسته نمی شود؟

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    چرا حلقه با دستور break شکسته نمی شود؟

    سلام دوستان
    میشه کمکم کنید شدیدا نیاز دارم...
    من این برنامه رو نوشتم که اگر بعد ده ثانیه یا کلید # زده شد حلقه را بشکند و به صفحه اصلی بیاید ولی کار نمی کند مشکل کجاست؟
    [code=c]
    #include <mega16.h>
    #include <stdio.h>
    #include <delay.h>
    #include <lcd.h>
    #define xtal 8000000
    #asm
    .equ __lcd_port=0x1B ;PORTA
    #endasm

    #define c1 PINB.4
    #define c2 PINB.5
    #define c3 PINB.6
    #define c4 PINB.7
    unsigned char buffer[32];
    int i;
    unsigned char scan[4]={0XFE,0XFD,0XFB,0XF7};
    unsigned char arrkey[16]={
    1,2,3,15,
    4,5,6,14,
    7,8,9,13,
    10,0,11,12};
    unsigned char key;

    unsigned char keypad(unsigned char wait){
    unsigned char r,c,k=0;
    unsigned int i,l;
    DDRB=0X0F;
    PORTB=0XFF;
    l=(wait*1000)+1000;

    for (i=0; i<l; i++){
    for (r=0; r<4; r++){
    c=4;
    PORTB=scan[r];
    delay_us(10);
    if(c1==0) c=0;
    if(c2==0) c=1;
    if(c3==0) c=2;
    if(c4==0) c=3;

    if (!(c==4)){
    k=arrkey[(r*4)+c];
    while(c1==0);
    while(c2==0);
    while(c3==0);
    while(c4==0);
    delay_ms(100);
    return k;
    }
    }
    delay_ms(1);
    }
    k=100;
    return k;
    }
    void check_pass(){
    lcd_clear();
    lcd_putsf("in : "
    for (i=0; i<10; i++){
    key = keypad(10);
    if(key==100 || key==11) break;
    sprintf(buffer,"%d",key);
    lcd_puts(buffer);
    delay_ms(10);
    }
    }

    void main(void){
    lcd_init(16);
    DDRD=0xff;
    PORTD=0;
    TCNT0=0x00;
    OCR0=0x00;
    lcd_clear();
    lcd_putsf("0=check password"
    while (1){
    key=keypad(10);
    if (key==0) check_pass();
    }
    }
    [/code]

    #2
    پاسخ : چرا حلقه با دستور break شکسته نمی شود؟

    brek فقط حلقه جاری رو میشکنه و بقه حلقه ادامه پیدا میکنه بجاش exit for استفاده کنید
    تنها موردي كه همه آدما يقين دارن خدا در حقش زیاد لطف کرده
    داشتن عقله زيادتر از دیگر آدم ها است

    دیدگاه


      #3
      پاسخ : چرا حلقه با دستور break شکسته نمی شود؟

      نوشته اصلی توسط aliila
      brek فقط حلقه جاری رو میشکنه و بقه حلقه ادامه پیدا میکنه بجاش exit for استفاده کنید
      سلام
      وقتی که exit for را وارد می کنم ارور می دهد

      دیدگاه


        #4
        پاسخ : چرا حلقه با دستور break شکسته نمی شود؟

        brek فقط حلقه جاری رو میشکنه و بقه حلقه ادامه پیدا میکنه بجاش exit for استفاده کنید
        دوست عزیز شما منظورتون دستور continue هست...دستور break کاملا از حلقه خارج میکنه...

        دوم اینکه شما مطمئنید که شرطی که در if قرار دادید اجرا میشه؟؟؟
        یه دور کامل کدتون رو خودتون دستی چک کنید ببینید که اصن شرط تحقق پیدا میکنه یا نه...اگه هم نمیتونید به جای Break یه کاری کنید که مثلا یه ال ای دی روشن بشه..اون وقت میتونید ببینید که آیا واقعا اون شرط درست میشه یا نه.
        تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

        www.intelart.ir


        ساخت کنترلر دما PID فازي با AVR [آموزشی]

        دیدگاه


          #5
          پاسخ : چرا حلقه با دستور break شکسته نمی شود؟

          نوشته اصلی توسط punisher.x64
          دوست عزیز شما منظورتون دستور continue هست...دستور break کاملا از حلقه خارج میکنه...

          دوم اینکه شما مطمئنید که شرطی که در if قرار دادید اجرا میشه؟؟؟
          یه دور کامل کدتون رو خودتون دستی چک کنید ببینید که اصن شرط تحقق پیدا میکنه یا نه...اگه هم نمیتونید به جای Break یه کاری کنید که مثلا یه ال ای دی روشن بشه..اون وقت میتونید ببینید که آیا واقعا اون شرط درست میشه یا نه.
          دوست عزیز به جای break ال سی دی گذاشتم و جواب داد بنابراین شرط انجام میشه
          راستی بجای اون قسمت break به این صورت می نویسم ارور میده :
          [code=c] if(key==100 || key==11){
          break
          }[/code]

          دیدگاه


            #6
            پاسخ : چرا حلقه با دستور break شکسته نمی شود؟

            نوشته اصلی توسط aliila
            brek فقط حلقه جاری رو میشکنه و بقه حلقه ادامه پیدا میکنه بجاش exit for استفاده کنید
            اون برا بیسیک هستش :mrgreen: :mrgreen:
            .The best question deserves a better answer
            =-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=
            «پناه»می برم «به خدا»
            از عـیبی که ، «امروز» در خود می بینم، و «دیروز» «دیگران را» به خاطر، «هـمان عیـب» ملامت کرده ام.
            محتاط باشیم، در «سرزنش» و «قضاوت کردن دیگران». وقتی نه از «دیروز او» خبر داریم و نه از "فردای خودمان" .

            دیدگاه


              #7
              پاسخ : چرا حلقه با دستور break شکسته نمی شود؟

              وقتی شرط حلقه محقق شده و از حلقه خارج میشوید باید دوباره مقدار key رو به غیر از 100 یا 11 تغییر بدید
              ---
              به نظر میاد تابع keypad شما همیشه مقدار 100 رو بر میگردونه
              [code=c]key = keypad(10);
              if(key==100 || key==11) break;[/code]
              [code=c]while (1){
              key=keypad(10);
              if (key==0) check_pass();
              }[/code]

              دیدگاه


                #8
                پاسخ : چرا حلقه با دستور break شکسته نمی شود؟

                نوشته اصلی توسط voyager2020
                وقتی شرط حلقه محقق شده و از حلقه خارج میشوید باید دوباره مقدار key رو به غیر از 100 یا 11 تغییر بدید
                ---
                به نظر میاد تابع keypad شما همیشه مقدار 100 رو بر میگردونه
                [code=c]key = keypad(10);
                if(key==100 || key==11) break;[/code]
                [code=c]while (1){
                key=keypad(10);
                if (key==0) check_pass();
                }[/code]
                خب دقیقا من باید چیکار کنم ؟

                دیدگاه


                  #9
                  پاسخ : چرا حلقه با دستور break شکسته نمی شود؟

                  من دقیقا نمیدونم برنامه ی شما چکار میکنه- ولی اگر تابع کیپد رو خودتون نوشتید از کد های اماده و تست شده به جاش استفاده کنید ببینید جواب میده یا نه!
                  الگوریتم برنامهی شما خیلی تو در تو و درهم برهمه- در حالی که برنامه خیلی ساده و معمولیه! اگر بتونید برنامه ات رو دوباره و ساده تر بنویسید راحت تر میتونی دیباگ کنید
                  --
                  برای شروع در ابتدا یا انتهای حلقه ی while مقدار key رو به غیر از 11 یا 100 تغییر بدید یا یه مقدار اولیه براش بذارید
                  اگر جواب نداد تابع keypad رو دوباره بررسی کنید -در این تابع شما دوبار return دارید (خطوط 48 و 53) که در خط 53 قبل از اون مقدار k رو به 100 تغییر دادید !!! و ظاهرا همیشه مقدار 100 رو بر میگردونه
                  اگر میتونید این مقدار k=100 رو به قبل از هر دو return منتقل کنید یا یکبار از return استفاده کنید

                  دیدگاه

                  لطفا صبر کنید...
                  X