问题描述
我正在尝试转换两种类型的值:char
和uint8
。
我有一个函数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;
我还有另一个函数,它是相同的代码,但是上面的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);
请确保a
和b
都至少指向N
个元素,否则您将调用未定义的行为。
Text
或TLabel
中的TEdit
是System::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);