数组类型'char [n]'和'uint8 [n]'是不可分配的

问题描述

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

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

要做什么:

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

我知道,如果我调用函数并将*label*edit放进去,我可以得到我想要的任何东西,但是问题是将*edit的文本与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;

我还有另一个函数,它是相同的代码,但是上面的valueOfVaruint8,我也不能转换它:

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个元素,否则您将调用未定义的行为。

,

TextTLabel中的TEditSystem::String,它是C ++ Builder 2007和更早版本中System::AnsiString的别名,并且适用于C ++ Builder 2009及更高版本中的System::UnicodeString。您没有说出使用的是哪个版本,但这在您的示例中有很大的不同。

您不能像尝试使用char[7]那样直接将{em>任何分配给固定数组,例如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);