Thông báo

Collapse
No announcement yet.

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

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • 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

  • #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


    • #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


      • #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


        • #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


          • #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


            • #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


              • #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


                • #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...
                  X