【问题标题】:What does binary plus operator do to int Array in C二元加运算符对 C 中的 int Array 做了什么
【发布时间】:2022-01-08 20:28:13
【问题描述】:

我正在将一个不起眼的库从 C 移植到 dart。

一个属性是在这样的结构上定义的 unsigned char payload[256];

我将其解释为一个字符数组。所以我把它转换成 List<int> payload;

后来在原库中有这段代码

parser->handleDataValue( extendedCodeLevel, code, numBytes, parser->payload+i, parser->customData );

其中 'i' 是循环的索引

我把它翻译成

parser.handleDataValue(extendedCodeLevel, code, numBytes, parser.payload + i, parser.customData);`

现在我正在处理错误 The argument type 'int' can't be assigned to the parameter type 'List<int>'.

我了解问题的 dart 方面,但我不明白原始 C 语言编写其 dart 等效项的含义。

【问题讨论】:

  • 它执行指针运算。用 C 语言编写它的另一种方法是 &(parser->payload[i])
  • 对于任何数组或指针p 和索引i,表达式p[i] 完全等于*(p + i)。由此可以推断出p + i是一个指向索引i处元素的指针(即&p[i])。
  • @Someprogrammerdude 啊,这是否意味着它指向payload数组中的下一个元素?
  • @xerooperator:不。将 1 点添加到下一个元素。将i 点添加到从起点位移i 元素的元素。
  • 哦,我明白了,谢谢。

标签: c dart porting code-conversion


【解决方案1】:

我可能会将 C 中的 unsigned char payload[256]; 翻译成 Dart 中的 Uint8List payload;。这是未签名的“char”的实际列表。

然后可以通过以下方式模拟指针算法 Uint8List.sublistView(parser.payload, i),从ith值开始创建payload的数据视图,无需复制,就像C代码一样。

Q.v. Uint8List.sublistView.

【讨论】:

  • 比你。这正是代码所做的。最终得到了一个黑客解决方案,但我会改变这个,因为它是最有效的。感觉