Rất cần sự giúp đỡ của mọi người

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • phienbinh
    Banned
    • Apr 2008
    • 28

    #1

    Rất cần sự giúp đỡ của mọi người

    Bác nào rành C xin giai thích dùm đoạn code sau: (rất cám ơn)
    Code:
    { int i;
     unsigned int crc_value=0xffff;
     while(data_length--)
       {crc_value^=*data_value++;
        for(i=0;i<8;++)
         {if(crc_value&0x0001) crc_value=(crc_value>>1)^0xa001;
           else crc_value=crc_value>>1;
          }
        }
     return(crc_value);
     }
    Last edited by ngohaibac; 14-11-2008, 09:06. Lý do: Thêm tag code
  • Zz_Bi_zZ
    Thành viên tích cực
    • Nov 2007
    • 766

    #2
    Nguyên văn bởi phienbinh Xem bài viết
    Bác nào rành C xin giai thích dùm đoạn code sau: (rất cám ơn)
    { int i;
    unsigned int crc_value=0xffff;
    while(data_length--)
    {crc_value^=*data_value++;
    for(i=0;i<8;++)
    {if(crc_value&0x0001) crc_value=(crc_value>>1)^0xa001;
    else crc_value=crc_value>>1;
    }
    }
    return(crc_value);
    }
    có chi đâu hè , u lấy tờ giấy ra đọc biểu thức tới đâu , tính ra kết quả ngay chỗ đó , chỉ rắc rối chỗ crc_value^=*data_value++;
    - B1 : tính data_value ++
    - B2 : lấy data_value sau đó nhân với nhau
    - B3 : crc_value = crc_value XOR với (tích 2 data_value vừa nhân ấy )
    phân tích từ từ như thế sẽ ra thui

    Comment

    • love_ac
      Thành viên tích cực
      • May 2008
      • 126

      #3
      crc_value^=*data_value++;
      - B1 : tính data_value ++
      - B2 : lấy data_value sau đó nhân với nhau
      - B3 : crc_value = crc_value XOR với (tích 2 data_value vừa nhân ấy )
      Thứ tự ưu tiên của phép toán thôi (cao nhất đến thấp nhất)
      1.(),++,--.
      2.*,/,%
      3.+.-
      4.^
      Last edited by love_ac; 13-11-2008, 08:16. Lý do: thêm

      Comment

      • phienbinh
        Banned
        • Apr 2008
        • 28

        #4
        cám ơn các bác đã tận tình chỉ bảo, nhưng thú thật là tui không biệt C, nên nhờ các bác giải thích dùm ý nghĩa các lệnh trên để tui có thể việt lại đoạn code trên bằng VB.Cám ơn nhiều

        Comment

        • ngohaibac
          Moderator
          • Sep 2005
          • 600

          #5
          Nguyên văn bởi Zz_Bi_zZ Xem bài viết
          có chi đâu hè , u lấy tờ giấy ra đọc biểu thức tới đâu , tính ra kết quả ngay chỗ đó , chỉ rắc rối chỗ crc_value^=*data_value++;
          - B1 : tính data_value ++
          - B2 : lấy data_value sau đó nhân với nhau
          - B3 : crc_value = crc_value XOR với (tích 2 data_value vừa nhân ấy )
          phân tích từ từ như thế sẽ ra thui
          Nguyên văn bởi love_ac Xem bài viết
          crc_value^=*data_value++;
          - B1 : tính data_value ++
          - B2 : lấy data_value sau đó nhân với nhau
          - B3 : crc_value = crc_value XOR với (tích 2 data_value vừa nhân ấy )
          Thứ tự ưu tiên của phép toán thôi (cao nhất đến thấp nhất)
          1.(),++,--.
          2.*,/,%
          3.+.-
          4.^
          Cho mình hỏi tại sao lại lấy data_value nhân với nhau nhỉ ?? Các bạn có biết kiểu dữ liệu của data_value không ??

          Theo mình nghĩ thì data_value là con trỏ kiểu dữ liệu trùng với crc_value đó.

          Chúc các bạn thành công.
          Technical sale at WT Microelectronics S'pore
          Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
          Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com

          Comment

          • thavali
            Thành viên tích cực
            • Mar 2006
            • 246

            #6
            Nguyên văn bởi phienbinh Xem bài viết
            Bác nào rành C xin giai thích dùm đoạn code sau: (rất cám ơn)
            Code:
            { int i;
             unsigned int crc_value=0xffff;
             while(data_length--)
               {crc_value^=*data_value++;
                for(i=0;i<8;++)
                 {if(crc_value&0x0001) crc_value=(crc_value>>1)^0xa001;
                   else crc_value=crc_value>>1;
                  }
                }
             return(crc_value);
             }
            dòng lệnh này viết sai nên ko chạy được:
            crc_value^=*data_value++;
            dấu * làm cho câu lệnh chẳng có nghĩa gì cả. Mà nói chung là ko nên viết rờm ra như thế, chỉ làm khó đọc. Những người viết code đã mỉa mai lối viết quá rờm ra như sau:
            Code:
            http://www.gnu.org/fun/jokes/helloworld.html

            Comment

            • VNarmy
              Moderator
              • Feb 2007
              • 1413

              #7
              Nguyên văn bởi thavali Xem bài viết
              dòng lệnh này viết sai nên ko chạy được:
              crc_value^=*data_value++;
              dấu * làm cho câu lệnh chẳng có nghĩa gì cả. Mà nói chung là ko nên viết rờm ra như thế, chỉ làm khó đọc. Những người viết code đã mỉa mai lối viết quá rờm ra như sau:
              Code:
              http://www.gnu.org/fun/jokes/helloworld.html
              Ai bảo dấu * ko có ý nghĩa. Đây là cách viết ngắn gọn của C. Toàn văn câu lệnh của nó là:

              Tăng con trỏ lên 1, lấy giá trị của nó xor với CRC rồi lưu vào CRC.

              Dấu sao ở đây là toán tử giá trị của con trỏ chứ ko phải nhân đâu nhé.

              Dù sao cũng cảm ơn bạn vì câu chuyện cười.
              AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
              Xem thêm tại Online Store ---> Click here
              Mob: 0982.083.106

              Comment

              • thavali
                Thành viên tích cực
                • Mar 2006
                • 246

                #8
                đồng ý, nhưng khi đó phải khai báo data_value là con trỏ.
                type * data_value
                Đọan code trên ko thể hiện điều này, nên dấu * ko có nghĩa gì cả.

                Comment

                • phienbinh
                  Banned
                  • Apr 2008
                  • 28

                  #9
                  Cám ơn mọi người đã chỉ bảo. Tui đã hiểu ý nghĩa của đoạn code trên và đã viết lại được trên VB. Nếu bạn nào có làm điều khiển biến tần(inverter) bằng PLC hay pc thông qua cổng truyền thông Rs232-485 thì đoạn code trên giúp cho ta rất nhiều.

                  Comment

                  Về tác giả

                  Collapse

                  phienbinh Tìm hiểu thêm về phienbinh

                  Bài viết mới nhất

                  Collapse

                  Đang tải...