数组类型 'char [n]' 和 'uint8 [n]' 不可赋值

Array type 'char [n]' and 'uint8 [n]' is not assignable

我正在尝试转换两种类型的值:charuint8

我有一个函数someFunction(TLabel *label, TEdit *edit)。在此函数内部,我有一个变量 char var[6+1].

我想做什么:

获取字母数字文本(TEdit *edit 的输入),转换该文本并将其放入 var.

我知道如果我调用这个函数并放入 *label*edit 我可以得到我想要的任何东西,但问题是转换以关联 [=21= 的文本] 在 var.

我的代码示例(函数内部):

char var[6+1];
label->Text = "Some text";
var = edit->Text;
    
//I will put var value inside of an another char (like a #define) that is in a struct, but doesn't matter for now
my_struct.valueOfVar = var;

我还有一个功能,同样的代码但是上面的valueOfVar是一个uint8,我也无法转换它:

uint8 valueOfAnotherVar[6+1];

问题不在于数组中元素的类型,而是您不能像这样将一个静态数组分配给另一个静态数组:

char a[7];
uint8 b[7];
a = b; // error

相反,如果您想复制数组中的值,可以像这样使用 std::copy

std::copy(std::begin(b), std::end(b), std::begin(a));

如果你有一个动态数组,你仍然可以使用std::copy,但是你必须使用数组的大小:

std::copy(b, b + N, a);

确保 ab 都指向至少 N 个元素,否则您将调用未定义的行为。

TLabelTEditTextSystem::String,它是 C++Builder 2007 及更早版本中 System::AnsiString 的别名,以及 C++Builder 2009 及更高版本中的 System::UnicodeString。您没有说明您使用的是哪个版本,但这在您的示例中有很大的不同。

您不能将 任何东西 直接分配给固定数组,例如 char[7]uint8[7],就像您使用 operator=试图做。您将需要 转换 并将 String 数据复制到分配的数组内存中,例如:

char var[6+1] = {};
label->Text = "Some text"; // OK - String has a constructor for 'const char*'

// if using CB2007 or earlier:
strncpy(var, edit->Text.c_str(), 6);

// if using CB2009 or later:
strncpy(var, AnsiString(edit->Text).c_str(), 6);

然后你可以使用其中之一将 var 的内容复制到 valueOfVar:

memcpy(my_struct.valueOfVar, var, 7);
std::copy(var, var+7, my_struct.valueOfVar);
std::copy_n(var, 7, my_struct.valueOfVar);