【问题标题】:Array type 'char [n]' and 'uint8 [n]' is not assignable数组类型 'char [n]' 和 'uint8 [n]' 不可赋值
【发布时间】:2020-08-14 18:42:56
【问题描述】:

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

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

我正在尝试做的事情:

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

我知道,如果我调用这个函数并将*label*edit 放入我想要的任何东西,但问题是在var 中关联*edit 的文本的转换。

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

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];

【问题讨论】:

  • 您不能将任何内容分配给静态数组。如果您需要一次性分配新值,请考虑使用std::array

标签: c++ c++builder rad-studio


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

【讨论】:

  • 但我并没有尝试在 uint var[n] 中分配 char var[n],反之亦然,我试图将 edit->Text 的文本放入 char var [n] 和单位 var[n]。
  • 好吧,你仍然可以使用std::copy。编辑了答案。
【解决方案2】:

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

您不能像您尝试做的那样使用operator=任何东西 直接分配给固定数组,例如char[7]uint8[7]。您需要将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);

【讨论】:

  • 直截了当,很好的解释,另一个问题和另一个正确答案......它工作得很好,非常感谢Remy!
猜你喜欢
  • 1970-01-01
  • 2015-03-08
  • 2021-02-25
  • 1970-01-01
  • 2013-05-14
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
相关资源
最近更新 更多