从char创建c ++中的校验和

时间:2014-04-08 13:25:32

标签: c++ checksum

我试着理解这个c ++代码:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    char temp[50];
    sprintf(temp,"%S",Edit1->Text);

    Send(temp);
}

void TForm1::Send(char *TX_String)
{
    unsigned char checksum = 0x02;

    while(*TX_String)
    {
        checksum ^= *TX_String++;               
    }

    checksum ^= 0x03;   
}

我的复制品如下:

#include <iostream>
using namespace std;

void prepareAndSend() {
    char Command[50];
    sprintf(Command,"%s", "65535V");

    unsigned char checksum = 0x02;

    char* p = Command;
    while(*p) {
        checksum ^= *p++;
    }
    checksum ^= 0x03;

    std:cout << checksum << std::endl;
}

int main() {         
    prepareAndSend();         
    return 0;
}

但是我收到错误:

error: lvalue required as increment operand checksum ^= *Command++;

此代码为从输入字段传递的文本创建校验和。我不熟悉c ++。任何想法为什么它不适合小提琴?

3 个答案:

答案 0 :(得分:1)

因为char *Command[50];char* TX_String不同。 char* TX_String是指向一系列字符的指针,而char *Command[50];是这样的指针数组。

试试这个:

void prepareAndSend() {
    char Command[50];
    sprintf(Command,"%s", "65535V");

    unsigned char checksum = 0x02;

    char* p = Command;
    while(*p)   {
        checksum ^= *p++;
    }   
    checksum ^= 0x03;
    std:cout << checksum << std::endl;
}

答案 1 :(得分:1)

在您的代码中,您会遇到此错误:

  char *Command[50];

错误:

error: lvalue required as increment operand checksum ^= *Command++;

基本上意味着你试图增加一些不是变量的东西。

这里的要点是当你有一个类似char a[10]的数组时,在编译程序时,它将为你分配10 char,并在程序集中分配名称a每当您使用它时,代码将被替换为数组开头的地址。因此a本身不是变量,但不能增加。

但是如果你定义一个char *b = a,那么你正在分配一个变量,它有一个指针,当然可以被操纵。然后b++有一个含义,即增加该地址。

答案 2 :(得分:0)

原始代码TX_String为char*,代码中的命令为char**

相反,使用类似的校验和函数接受char*,这将使调试更容易。

(并将char* Command[50]替换为char Command[50]