اطلاعیه

Collapse
No announcement yet.

مشکل با ارسال آرایه 3 بعدی به تابع

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

    مشکل با ارسال آرایه 3 بعدی به تابع

    سلام
    من تو برنامه ای که دارم می نویسم، 5 تا آرایه به صورت [5][10][2]char array دارم که در حین اجرای برنامه، باید به صورت
    char array [const][k][j]

    مقدار دهی بشن.
    اما وقتی برنامه رو با avr studio دیباگ می کنم، مقادیر سر جاشون نمی شینن و به صورت پراکنده توی آرایه قرار می گیرن. در حالیکه اندیس های j و k رو دائماً چک می کنم و مقادیرشون همونی هست که باید باشه. ایراد از کجا می تونه باشه؟
    در ضمن برنامه رو برای mega16 می نویسم.

    ممنون

    #2
    پاسخ : مشکل در مقدار دهی آرایه ها

    سلام
    سورس برنامتون رو بذارید تا مطالعه بشه

    دیدگاه


      #3
      پاسخ : مشکل در مقدار دهی آرایه ها

      فکر می کنم باید اصلاح کنم! آرایه ها فقط تا اندیس k=1 مقدار دهی میشن. یعنی دو اندیس اول

      نوشته اصلی توسط mhheydarchi
      سلام
      سورس برنامتون رو بذارید تا مطالعه بشه
      سورس برنامه رو نمی تونم بذارم! چون این قسمتی از یه پروژه هست و مسلماً فهمیدن ارتباط بین اجزای برنامه خیلی مشکل میشه. سعی می کنم فقط اون قسمتش رو استخراج کنم بذارم اینجا
      مرسی

      دیدگاه


        #4
        پاسخ : مشکل در مقدار دهی آرایه ها

        فکر کنم اگه خود برنامه رو بذارم بهتره!
        اول به طور خلاصه میگم که این برنامه یک تلفن گویا هست که قراره یک سری کاراکتر عددی رو که کاربر از طریق تلفن وارد می کنه، بگیره و داخل یک سری آرایه ذخیره کنه و ...
        آرایه های من به همون شکلی که در بالا گفتم هستن که در این برنامه به صورت عضوی از استراکچر test تعریف شدن. در قسمتی از برنامه این آرایه ها رو به یک تابع به اسم rep_mark می فرستم و داخل تابع با اندیس های j و k مقدار دهی میشن
        array[1][k][j]=*fin;


        اما نمی دونم چی میشه که تا اندیس k=1 بیشتر مقدار نمی گیرن. هر جای برنامه نا مفهوم بود بگین تا توضیح بدم. گر چه کلاً نا مفهومه!

        #include <mega16.h>
        #include <delay.h>
        #include <stdio.h>
        #include <stdlib.h>
        #include <math.h>

        /****************Massage addresses****************/
        #define HI_M 1
        #define ID_M 2
        #define PAS_M 3
        #define ERR_M 4
        #define CLS_NO_M 5
        #define MRK_M 6

        /****************Passwords****************/
        #define APAS 12346
        #define BPAS 56732
        #define CPAS 22010
        #define DPAS 11967
        #define EPAS 83171

        /****************Class numbers***************/
        #define A_CLS_1 101
        #define A_CLS_2 102

        #define B_CLS_1 201
        #define B_CLS_2 202

        #define C_CLS_1 301
        #define C_CLS_2 302

        struct profile{
        char name[30];
        char mark[2][10][5];
        }A,B,C;

        /************Variables**************/
        unsigned long int n=0,pass;
        long int j,i,k;
        unsigned long int id,num,fac;
        char input[6],temp[6],*fin;

        /************Functions**************/
        void rep_mark(char array[2][10][5],int cls1,int cls2);
        char *code_iden(void);
        unsigned long int atoint(char *str);

        void message(int addr)
        {
        PORTA=addr;
        }

        unsigned long int atoint(char *str)
        {
        i=0;
        num=0;
        for(i=0;*str!=11;i++)
        {
        if(i==0)fac=1;
        else fac=(fac*10);
        if(*str) num=num+(*str * fac);
        str++;
        }
        return num;
        }

        void rep_mark(char array[2][10][5],int cls1,int cls2)
        {
        int no;
        message(CLS_NO_M);
        no=atoint(code_iden());
        if(no==cls1)
        {
        message(MRK_M);
        for(k=0;k<10;k++)
        {
        fin=code_iden();
        for(j=0;j<5;j++)
        {
        array[0][k][j]=*fin;
        fin++;
        }
        }
        }
        else if(no==cls2)
        {
        message(MRK_M);
        for(k=0;k<10;k++)
        {
        fin=code_iden();
        for(j=0;j<5;j++)
        {
        array[1][k][j]=*fin;
        fin++;
        }
        }
        }
        }


        char *code_iden(void)
        {
        i=0;
        do{
        while(!PINC.3);
        input[i]=((PINC&0xf0)>>4);
        i++;
        }while(input[i-1]!=11);
        j=0;
        for(i-=2;i>=0;i--)
        {
        temp[j]=input[i];
        j++;
        }
        temp[j]=11;
        return temp;
        }

        // External Interrupt 0 service routine
        interrupt [EXT_INT0] void ext_int0_isr(void)
        {
        ++n;
        if(n>1)
        {
        PORTD.3=0;
        message(HI_M);
        LP: message(ID_M);
        id=atoint(code_iden());
        switch (id)
        {
        case 88001:
        while(pass!=APAS)
        {
        message(PAS_M);
        pass=atoint(code_iden());
        }
        rep_mark(A.mark,A_CLS_1,A_CLS_2);
        break;
        case 88002:
        while(pass!=BPAS)
        {
        message(PAS_M);
        pass=atoint(code_iden());
        }
        rep_mark(B.mark,B_CLS_1,B_CLS_2);
        break;
        case 88003:
        while(pass!=CPAS)
        {
        message(PAS_M);
        pass=atoint(code_iden());
        }
        rep_mark(C.mark,C_CLS_1,C_CLS_2);
        break;
        default:
        message(ERR_M);
        goto LP;
        }

        }
        }

        // USART Receiver interrupt service routine
        interrupt [USART_RXC] void usart_rx_isr(void)
        {
        }

        // USART Transmitter interrupt service routine
        interrupt [USART_TXC] void usart_tx_isr(void)
        {
        }

        // Standard Input/Output functions

        // Declare your global variables here

        void main(void)
        {
        DDRD=0x7a;
        PORTD=0xff;
        DDRA=0xff;
        DDRC=0x00;
        PORTC=0x0f;

        // External Interrupt(s) initialization
        // INT0: On
        // INT0 Mode: Low level
        // INT1: Off
        // INT2: Off
        GICR|=0x40;
        MCUCR=0x02;
        MCUCSR=0x00;
        GIFR=0x40;

        // USART initialization
        // Communication Parameters: 8 Data, 1 Stop, No Parity
        // USART Receiver: On
        // USART Transmitter: On
        // USART Mode: Asynchronous
        // USART Baud rate: 9600
        UCSRA=0x00;
        UCSRB=0xD8;
        UCSRC=0x86;
        UBRRH=0x00;
        UBRRL=0x5F;

        // Analog Comparator initialization
        // Analog Comparator: Off
        // Analog Comparator Input Capture by Timer/Counter 1: Off
        ACSR=0x80;
        SFIOR=0x00;

        // Global enable interrupts
        #asm("sei&quot

        while (1)
        {
        };
        }

        دیدگاه


          #5
          پاسخ : مشکل در مقدار دهی آرایه ها

          نوشته اصلی توسط احسان محمودی
          سلام
          char array [const][k][j]



          ممنون
          چرا Const رو توی ایندکس آوردید .؟ شاید آرایتون 3 بعدی هستش ساپورت نکنه. یکبار 2 بعدیش کنید امتحان کنید یه وقت دیدید درست شد!

          دیدگاه


            #6
            پاسخ : مشکل در مقدار دهی آرایه ها

            نوشته اصلی توسط علیفری


            چرا Const رو توی ایندکس آوردید .؟ شاید آرایتون 3 بعدی هستش ساپورت نکنه. یکبار 2 بعدیش کنید امتحان کنید یه وقت دیدید درست شد!
            const که نوشتم یعنی یه عدد ثابت. یه جا 0 میدم و جای دیگه 1. چرا سه بعدی ساپورت نکنه؟

            دیدگاه


              #7
              پاسخ : مشکل در مقدار دهی آرایه ها

              سلام
              هلپ کدویژن رو دیدم. آرایه ها رو تا 8 بُعد ساپورت می کنه
              من برنامه مشابهی رو ( برنامه زیر ) نوشتم و با TurboC تست کردم. بدون هیچ مشکلی کار کرد. اما همین برنامه توی کدویژن درست اجرا نمیشه.


              کد:
              #include <stdio.h>
              
              struct test {
              char name[30];
              char mark[2][10][5];
              }a,b,c;
              
              int i,j;
              void func(char array[][10][5]);
              
              void func(char array[][10][5])
              {
              
              for(i=0;i<10;i++)
              	{
              	for(j=0;j<5;j++)
              	array[0][i][j]='a';
              			
              	}
              }
              
              int main ()
              {
              clrscr();
              func(b.mark);
              for(i=0;i<10;i++)
              	{
              	printf("\n");
              	for(j=0;j<5;j++)
              	printf("%c",b.mark[0][i][j]);			
              	}
              }



              در واقع اشکالش اینجاست که وقتی برنامه وارد تابع ()func میشه، اندیس دوم array رو 2 میبینه. چون از اندیس 2 بیشتر رو مقدار دهی نمی کنه. در حالیکه اندیس دوم من 10 هست نه 2!
              فکر می کنم اندیس اول ( 2 ) رو به جای اندیس دوم ( 10 ) در نظر می گیره. چون وقتی اندیس اول رو از 2 به 3 تغییر دادم، این بار تا 3 تا اندیس رو مقدار دهی کرد. احتمالاً کدویژن اصول خاص خودش رو در این باره داره که من نمی دونم. oo: کسی می دونه باید چیکار کرد؟

              دیدگاه


                #8
                پاسخ : مشکل با ارسال آرایه 3 بعدی به تابع

                در ضمن همونطور که می دونید طبق اصول، تابع فراخوانی شده باید به صورت زیر تعریف بشه:

                void func(char array[][10][5]);


                یعنی جای اندیس اول باید خالی باشه. اما ظاهراً کدویژن با این نوع تعریف مشکل داره و منم مجبور میشم همه اندیس ها رو بهش بدم

                دیدگاه


                  #9
                  پاسخ : مشکل با ارسال آرایه 3 بعدی به تابع

                  جالبه! برنامه بالا رو با آرایه دو بعدی ( [10][5]array ) هم تست کردم بازم همین مشکل رو داره! ممکنه یه نفر اینو با کدویژن تست کنه؟ دیگه دارم به کدویژن شک می کنم.

                  دیدگاه


                    #10
                    پاسخ : مشکل با ارسال آرایه 3 بعدی به تابع

                    خوب بالاخره معلوم شد ایراد از کجاست! همش از این avr studio ی ... بود! من نتایج برنامه رو تو این نرم افزار کذایی می دیدم و فکر می کردم برنامه ایراد داره. اما وقتی با پروتئوس تست کردم دیدم هیچ مشکلی نیست!
                    نتیجه گیری اخلاقی:
                    آیا از بیکاری مفرط رنج می برید؟ آیا حوصله تان سر رفته؟ ما به شما نرم افزار مفرح avr studio را پیشنهاد می کنیم. حداقل چند روز و در صورت تمایل قلبی تا مدت ها سر کار خواهید بود.

                    دیدگاه


                      #11
                      پاسخ : مشکل با ارسال آرایه 3 بعدی به تابع

                      سلام
                      عذر میخوام، بنده تقاضای سورس کردم اما وقت نکردم Online بشم
                      خدا رو شکر که علاوه بر حل مشکل شما، به نتایج اخلاقی قابل استفاده هم رسیدیم

                      دیدگاه

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