【问题标题】:Two variables from different structs give me a compiling error when I match them当我匹配它们时,来自不同结构的两个变量会给我一个编译错误
【发布时间】:2014-12-23 18:28:00
【问题描述】:

所以我可能遗漏了一个关键点,因为我从来不擅长使用结构。

我有一个这样的结构:

 typedef struct Message
{
 int  op;           
 char local[128];   
 char remote[128];
int  port;   
} Mensaje;

所以我设置这个结构的值是这样的: 门萨赫门萨赫; mensaje.op=htonl(2);

现在我想从一个结构中获取信息并将其放入另一个结构中,这样我就可以发送它了。 我试试这个:

 mensaje2.remote=mensaje1.remote;

我得到这个错误:错误:从类型'char *'分配给类型'char [128]'时不兼容的类型

这绝对让我感到困惑,因为这两个东西都来自同一个结构。我一直在尝试弄乱操作员 -> 但没有成功。

我应该怎么做才能让一个没有值的结构 (mensaje2) 获得 mensaje1.remote 的值?

【问题讨论】:

  • C 还是 C++?选择一个
  • 这里的 C 和 C++ 有很大的不同。代码是 C 风格的,没有一个有头脑的 C++ 程序员会写出这样的代码。
  • @LightnessRacesinOrbit 但正如沃尔特所说,任何人都可以从代码中猜出它是 C。特别是对于typedef,您为什么要在 C++ 中这样做?
  • @iharob:我不会,但我见过成千上万的程序员编写的代码。因此,这实际上告诉我们 OP 的意图为零。
  • 评论不用于扩展讨论;此对话的其余部分是moved to chat

标签: c++ c struct


【解决方案1】:

由于历史原因,在 C 或 C++ 中不能直接复制数组。 :(

如果您使用 C++ 的 std::array<char, 128> 代替,那么您将能够做到:

struct Message
{
   int op;
   std::array<char, 128> local;
   std::array<char, 128> remote;
   int port;
};

int main()
{
   Message mensaje1, mensaje2;
   mensaje1.remote = mensaje2.remote;
}

不过,看起来你想要一个 字符串std::string 也可以复制!

struct Message
{
   int op;
   std::string local;
   std::string remote;
   int port;
};

int main()
{
   Message mensaje1, mensaje2;
   mensaje1.remote = mensaje2.remote;
}

否则您将不得不使用std::copy 手动复制数组元素:

struct Message
{
   int op;
   std::string local;
   std::string remote;
   int port;
};

int main()
{
   Message mensaje1, mensaje2;
   std::copy(
      std::begin(mensaje2.remote),
      std::end(mensaje2.remote),
      std::begin(mensaje2.remote)
   );
}

您收到的错误消息令人困惑,因为作为最后的努力,编译器在最终放弃之前尝试使用数组名称到指向其第一个元素的指针的隐式转换。

【讨论】:

  • 关于 std:: 的那部分......我现在无法实现它,但为什么会这样呢?这会导致较低的实施水平还是...?
  • @keont:哪一部分?我在几个地方使用了std::
  • 完全是我的错,我认为这是某种运算符。我对那种类型的表达式根本不熟悉,它们只是 C++ 还是 C 语言?
  • @keont:我不知道你指的是什么。 “那种表达方式”。 具体来说,你在问我什么?
  • 历史原因是什么意思?换句话说:对数组复制语义的有用定义是什么?如果根本不删除数组衰减或定义诸如“array = pointer 表示memcpy(array, pointer, sizeof array)”之类的东西,我看不到任何东西,乍一看,这两者对我来说都没有用,后者与现有的不冲突代码,所以历史原因不适用。
【解决方案2】:

数组是 C 中的二等公民,您不能分配数组。使用memcpy 复制数组或使用strcpy / strncpy 复制字符串。

【讨论】:

  • 数组不是二等公民。确实不能直接复制。
  • @LightnessRacesinOrbit 他们是,如果您不同意,请随时向 c-faq 的维护者 Steve Summit 发表评论:c-faq.com/aryptr/ptrkindofary.html
  • @LightnessRacesinOrbit 在这种情况下还建议编辑此维基百科条目en.wikipedia.org/wiki/First-class_citizen C 中的大多数对象可以使用赋值运算符复制,但数组(以及其他限制)不能,它非常适合二等公民包容。
  • @Puppy 我猜您没有看到答案中提到了strncpy,也许您不知道使用memcpy 您可以控制大小参数。我希望您自己的答案不会以同样的随意感而被否决。
  • +one, @Puppy 你的 memcpy 替代方案是什么?
【解决方案3】:

您必须将一个数组的内容复制到另一个数组中,使用strcpy

strcpy(mensaje2.remote, mensaje1.remote);

【讨论】:

  • 我不想比较我想...我不知道动词,我想把信息放在等号的左边。但这很有效,谢谢!
  • @keont:“分配”或“复制”。
  • @keont,如果不打扰其他人,你能用西班牙语写动词吗?
  • 不要 strcpy 任何东西。
  • 是的 iharob 我已经读过了,我不知道我是否应该得到提示:S 是漫长的一天。动词是asignar。但是如果我试着用英语说的话,我会想到 assignate 或类似的错误词。
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 2021-11-08
相关资源
最近更新 更多