اطلاعیه

Collapse
No announcement yet.

کمک در مورد کپی و مقایسه دو اریه در کدویژن

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

    کمک در مورد کپی و مقایسه دو اریه در کدویژن

    سلام.
    من یک تابع نوشتم که درش از توابع اماده string برای کپی و مقایسه استفاده شده که برنامه رو براتون می زارم. حالا مشکل من اینجاست که ارایه دوبعدی که اطلاعات پرت سریال رو نگهداری میکنه رو اگه بخوام eeprom تعریف کنم ارور میده.
    کد:
    int k=10;
    eeprom int j;
     char num_lern[k][14];
    کد:
    void clip(void)
    {
    int i,k,h;
    int code;
    char number[4];
    wait_to_get('"');
    for(i=0;i<9;i++)getchar();
    for(i=0;i<=4;i++)
    number[i]=getchar();
    wait_to_get('"');
    code=atoi(number);
    if(PINC.7==0)
     {
      delay_ms(60);
      if(j==10)
      {
      lcd_putsf("sarry full flash");
      }
      j++;
      strcpy(num_lern[j],number);
      lcd_clear();
      lcd_gotoxy(0,1);
      lcd_puts(number);
      lcd_putsf("lern ok");
      }
     for(k=0;k<=10;k++)
     if(strcmp(number,num_lern[k])==0)
     {
     bizer=1;
     d_time=2;
     printf("ATH\r");
      lcd_clear();
     lcd_putsf("number mach");
     delay_ms(50);
     lcd_clear();
     } 
     
     
    }
    تو این تابع اگه کلید نگه داشته بشه شماره ها تو ارایه دو بعدی num_lern کپی میشن و بعد هروقت شماره ای بیاد اول چک میشه که تو ارایه هست یا نه بعد اگه بود دستور رو اجراء میکنه.علت ارور هم اینه که توابع string فقط در محدوده اسرم و فلش عمل میکنند.چطوری بنویسم برنامه پیچیده نشه :icon_razz:

    #2
    پاسخ : کمک در مورد کپی و مقایسه دو اریه در کدویژن

    سلام
    دقیقا همونطور که گفتین دستورات موجود در تابع string برای حافظه eeprom تعریف نشده و باید با استفاده از دستورات ابتدایی نوشتن و خوندن در حافظه eeprom مشکل رو حل کنید.
    فعلا بدجور سرم شلوغه اما تونستم در اسرع وقت یه مثال براتون قرار میدم.
    پس هرچه سریعتر برین سراغ دستورات اولیه کار با ذخیره داده در eeprom.
    موفق باشید
    چرا ناراحتی پاتریک!
    + امروز ی بچه دیدم سرچهارراه گل میفروخت
    - از دیدنش ناراحت شدی؟
    + نه
    پس چی ناراحتت کرده
    + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
    ------------------------------------------------------------------------------------------------------
    تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
    ------------------------------------------------------------------------------------------------------
    محصولات

    دیدگاه


      #3
      پاسخ : کمک در مورد کپی و مقایسه دو اریه در کدویژن

      خیلی گیرم.اگه امکان داره یک مثال بزنید.
      میتونم با دستور for یکی یکی بشمرم و تو ارایه در ایتوپرام کپی کنم ولی وقتی میخوام یک شماره رو مقایسه کنم چکار کن.
      کلافم کرده هرجور مینویسم ارور میده.اصل نمیشه جور دیگه ارایه ها رو به هم نسبت داد. :angry:
      :angry:

      دیدگاه


        #4
        پاسخ : کمک در مورد کپی و مقایسه دو اریه در کدو&#174

        کسی میتونه در مورد این تابع توضیح بده؟ایا به کار من میاد برای کپی یک ارایه در ایتوپرام؟
        کد:
        well, my intention is to store an array to eeprom. 
        I don't mind where to store the pointer of the array, but let's say I store this in eeprom. 
        Then I must copy the *array[0] to the flash memory. 
        So I done this(but it didn't work?!): 
        
        
        
        Code:
        
        eeprom char* eeprom zone_array[64]; 
        char str_buf[64]; 
        void eeprom_2_strcpy(char* dst,eeprom char* src) 
        { 
          while (*dst++ = *src++) ; 
        } 
        
        void main(void) 
        { 
        eeprom_2_strcpy(str_buf,*zone_array[z]); 
        } 
        
        
        
        
        
        neither with : 
        eeprom_2_strcpy(str_buf,zone_array[z]);
        تو این تابع از اشاره گرها استفاده شده که در یک انجمن خاجی پیداش کردم.که نویسنده هم مشکل من رو داشت.نوشتم مثل اینکه کار میکنه حالا موندم چطور با ارایه ای که تو sram هست مقایسه کنم. zone_array & با این دستور میشه

        دیدگاه


          #5
          پاسخ : کمک در مورد کپی و مقایسه دو اریه در کدویژن

          چرا هیچ کس کمک نمیکنه جور دیگه میپرسم شاید یکی جواب داد.این برنامه ای که نوشتم هست البته تعداد 10 تابع دیگه هم هست که اونارو حدف کردم.و درست کار میکند.مشکل من فقط سر تعریف کردن ارایه num_lern در ایتو پرام هست.فکر نمیکنم کار خیلی سختی باشه که هیشکی جواب نمیده یا مدل این انجمن همینه و همه فقط سوال میپرسند. :cry2:
          کد:
          #include <mega32.h>
          #include <stdlib.h>
          #include <string.h>
          int k=10;
          eeprom int j;
           char num_lern[k][14];
          
          // Alphanumeric LCD functions
          #include <delay.h>
          #ifndef RXB8
          #define RXB8 1
          #endif
          
          #ifndef TXB8
          #define TXB8 0
          #endif
          
          #ifndef UPE
          #define UPE 2
          #endif
          
          #ifndef DOR
          #define DOR 3
          #endif
          
          #ifndef FE
          #define FE 4
          #endif
          
          #ifndef UDRE
          #define UDRE 5
          #endif
          
          #ifndef RXC
          #define RXC 7
          #endif
          
          #define FRAMING_ERROR (1<<FE)
          #define PARITY_ERROR (1<<UPE)
          #define DATA_OVERRUN (1<<DOR)
          #define DATA_REGISTER_EMPTY (1<<UDRE)
          #define RX_COMPLETE (1<<RXC)
          
          // USART Receiver buffer
          #define RX_BUFFER_SIZE 8
          char rx_buffer[RX_BUFFER_SIZE];
          
          #if RX_BUFFER_SIZE <= 256
          unsigned char rx_wr_index,rx_rd_index,rx_counter;
          #else
          unsigned int rx_wr_index,rx_rd_index,rx_counter;
          #endif
          
          // This flag is set on USART Receiver buffer overflow
          bit rx_buffer_overflow;
          
          // USART Receiver interrupt service routine
          interrupt [USART_RXC] void usart_rx_isr(void)
          {
          char status,data;
          status=UCSRA;
          data=UDR;
          if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
            {
            rx_buffer[rx_wr_index++]=data;
          #if RX_BUFFER_SIZE == 256
            // special case for receiver buffer size=256
            if (++rx_counter == 0) rx_buffer_overflow=1;
          #else
            if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
            if (++rx_counter == RX_BUFFER_SIZE)
             {
             rx_counter=0;
             rx_buffer_overflow=1;
             }
          #endif
            }
          }
          
          #ifndef _DEBUG_TERMINAL_IO_
          // Get a character from the USART Receiver buffer
          #define _ALTERNATE_GETCHAR_
          #pragma used+
          char getchar(void)
          {
          char data;
          while (rx_counter==0);
          data=rx_buffer[rx_rd_index++];
          #if RX_BUFFER_SIZE != 256
          if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
          #endif
          #asm("cli")
          --rx_counter;
          #asm("sei")
          return data;
          }
          #pragma used-
          #endif
          
          // Standard Input/Output functions
          #include <stdio.h>
          #include <stdio.h>
          #define enter 0x0d 
          #define ctrl_z 0x1a
          #define bizer PORTD.7
          unsigned int d_time;
          /////////////////////
          void wait_to_get(char ch);
          void clip(void);
          /////////////////////////////
          // Timer1 output compare A interrupt service routine
          interrupt [TIM1_COMPA] void timer1_compa_isr(void)
          {
          // Place your code here
          if(d_time > 0)
              d_time--;
            else
              {
              bizer=0;
              }
           
          }
          
          // Declare your global variables here
          void main(void)
          {
          char buffer;
          
          PORTA=0x00;
          DDRA=0x08;
          PORTB=0x00;
          DDRB=0x00;
          PORTC=0xE0;
          DDRC=0x00;
          PORTD=0x00;
          DDRD=0x80;
          // Timer/Counter 1 initialization
          // Clock source: System Clock
          // Clock value: 7.813 kHz
          // Mode: CTC top=OCR1A
          // OC1A output: Discon.
          // OC1B output: Discon.
          // Noise Canceler: Off
          // Input Capture on Falling Edge
          // Timer1 Overflow Interrupt: Off
          // Input Capture Interrupt: Off
          // Compare A Match Interrupt: On
          // Compare B Match Interrupt: Off
          TCCR1A=0x00;
          TCCR1B=0x0D;
          TCNT1H=0x00;
          TCNT1L=0x00;
          ICR1H=0x00;
          ICR1L=0x00;
          OCR1AH=0x1E;
          OCR1AL=0x85;
          OCR1BH=0x00;
          OCR1BL=0x00;
          // Timer(s)/Counter(s) Interrupt(s) initialization
          TIMSK=0x10;
          
          // 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=0x98;
          UCSRC=0x86;
          UBRRH=0x00;
          UBRRL=0x33;
          // Global enable interrupts
          #asm("sei")
          while (1)
             {
             
             // Place your code here
             buffer=getchar();
              if(buffer=='+')
              { 
               buffer=getchar();
               if(buffer=='C')
                {
                
                 buffer=getchar();
                 if(buffer=='L')
                 {
                  buffer=getchar();
                  if(buffer=='I')
                   {
                   buffer=getchar();
                    if(buffer=='P')
                    { 
                    buffer=getchar();
                     if(buffer==':') clip(); 
                     }
                     
                   }
                  } 
                 
                 }
               }
                
                
                         
                         
             }
          }
          
          //////////////////////////////////
          void wait_to_get(char ch)
           { 
           while(ch != getchar());
           }
          
          
          /////////////////////////// 
          void clip(void)
          {
          int i,h;
          char number[4];
          wait_to_get('"');
          for(i=0;i<9;i++)getchar();
          for(i=0;i<=4;i++)
          
          number[i]=getchar();
          wait_to_get('"');
          if(PINC.7==0)
           {
            delay_ms(60);
            j++;
            strcpy(num_lern[j],number);
           }
           for(k=0;k<=10;k++)
           if(strcmp(number,num_lern[k])==0)
           {
           bizer=1;
           d_time=2;
           printf("ATH\r");
            
           } 
            
            
          }  
          
          ////////////////////////

          دیدگاه


            #6
            پاسخ : کمک در مورد کپی و مقایسه دو اریه در کدویژن

            کپی و مقایسه آرایه ها با استفاده از اشاره گر بسیار ساده است. برای عملیات مشکل تر که مقایسه دو آرایه است به روش به کار رفته در جواب های 2 و 3 در لینک زیر مراجعه کنید که یک شکل کلی را نشان می دهد و برای کاربرد شما باید مقداری تغییر کند:

            http://www.allinterview.com/showanswers/2868.html
            اوژن: به معنای افکننده و شکست دهنده است
            دانایی، توانایی است-Knowledge is POWER
            برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
            وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
            قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
            اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
            ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

            دیدگاه


              #7
              پاسخ : کمک در مورد کپی و مقایسه دو اریه در کدویژن

              مرسی مهندس جان کپی رو با اشارگر انجام دادم. نمیدونم درسته کار میکنه یا نه ولی مقایسه رو نتونستم.هرجور مینویسم بهم ارور میده.تا مقایه هم نتونم کنم از صحت کار کپی هم نمیتونم با خبر بشم.لطفا کمکم کنید.تابع رو میزارم اگه زحمت نیست اضافه کنید.من از لینکی که گداشتید جواب 3 رو نوشتم.بیزحمت نگاه کنید ببینید کجا اشتباست
              int k=10;
              eeprom int j;
              eeprom char num_lern[k][4];
              int str_cmp( char *str1 , char *str2)
              {


              while(*str1 != '\0&#039
              {
              if( *str1 == *str2)
              {
              str1++;
              str2++;
              }
              else
              break;
              }


              return 1;
              }
              این تعریف تابع

              void clip(void)
              {
              int i,k,h;
              int code,flag;
              char number[4];
              wait_to_get('"'
              for(i=0;i<9;i++)getchar();
              for(i=0;i<=4;i++)

              number[i]=getchar();
              wait_to_get('"'
              code=atoi(number);
              if(PINC.7==0)
              {
              j++;
              *num_lern[j]=*number;

              }

              for(i=0;i<=k;i++)
              if( str_cmp(num_lern[i],number))
              {
              bizer=1;
              d_time=2;
              printf("ATH\r"
              lcd_clear();
              lcd_putsf("number mach"
              delay_ms(50);
              lcd_clear();
              }


              }
              این هم تابعی که من نوشتم.برنامه کامل هم در دوپست بالاتر هست
              کار زیادی نمیخوام ,میخوام ارایه number در ارایه دوبعدی num_lern اول با نگه داشتن کلید کپی بشه بعد بدونه کلید number با ارایه num_lern مقایسه بشه و اگه مشابه بود شرط اجرا بشه.نمیدونم چرا انقدر اذیت میکنه. :angry:

              دیدگاه


                #8
                پاسخ : کمک در مورد کپی و مقایسه دو اریه در کدویژن

                یعنی جدا کسی جز مهندس کی نژاد تا به حال به این موضع برنخورده و بلد نیست
                شکل اصل مگه نباید به این شکل باشه
                کد:
                *num_lern[j]=*number;
                برای کپی کردن
                کد:
                for(i=0;i<=k;i++) 
                 
                if( *num_lern[i]==*number)
                برای مقایسه کردن.پس چرا مشکل داره.لازمه اشاره گر تعریف کنم.
                به این شکل که مینویسم دیگه ارور نمیده ولی کار هم نمیکنه

                دیدگاه


                  #9
                  پاسخ : کمک در مورد کپی و مقایسه دو اریه در کدویژن

                  دوستان درست شد.مشکلم تو for بود.این رو دوباره نوشتم که هم از مهندس کی نژاد تشکر کنم و هم برای این 80 نفری که تا به حال از این پست دیدن کردن وبلد نبودن درسی باشه.
                  برای نسبت دادن دو ارایه و مقایسه ان در ایپیرام بهترین و ساده ترین شکل اشاره گر هست که در پست بالا هردو رو گذاشتم. :applause:

                  دیدگاه

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