【问题标题】:How to use a #define statement in order to set an array of bytes?如何使用#define 语句来设置字节数组?
【发布时间】:2013-10-02 10:22:21
【问题描述】:

我正在编程Arduino,我想使用#define 语句来设置要传递给Ethernet.begin() 函数的字节数组。此时我正在使用以下代码,一切都按预期工作:

#define MAC_ARRAY { 0x43, 0xA3, 0xDA, 0x0D, 0xF5, 0xA5 }

void setup() {
  byte mac[] = MAC_ARRAY;

  if (Ethernet.begin(mac) == 0) {
    ...
  }
}

正如您在上面的代码中看到的,每次我使用MAC_ARRAY 值时,我都必须在整个源代码中声明byte mac[] = MAC_ARRAY;。但是我想避免说明(我还认为“在漫长的道路上”可能存在内存问题,因为 mac[] 变量已实例化)并且以某种方式将正确的 MAC_ARRAY 直接传递给 Ethernet.begin() 函数。

有可能吗?如果是这样,我应该如何更改#define MAC_ARRAY ... 语句?

【问题讨论】:

  • 不,不可能将“文字”数组传递给函数,除非你有一个 C++11 兼容的编译器/标准库,并且函数本身是使用 std::initializer_list 类编码的。
  • 你的代码已经简单正确了,没必要乱来

标签: c++ arrays arduino macros


【解决方案1】:

正如 joachim Pileborg 已经提到的,如果你有一个与 c++11 兼容的编译器,则可以将一个文字数组传递给一个函数,并且该函数 (Ethernet.begin) 有一个 begin(std::initializer_list) 变体。

但是,您的示例接近解决方案。使mac global(如果可能,const)并删除定义:

uint8_t const mac[] = { 0x43, 0xA3, 0xDA, 0x0D, 0xF5, 0xA5 };
   //^^^^^ -> if begin isn't able to handle const, remove the const here.

void setup() {
  if (Ethernet.begin(mac) == 0) {
    ...
  }
}

这只会使 mac 实例化一次并重复使用它(没有内存问题)。

有一些可能性,取决于代码:

  1. Ethernet.begin 使用引用/指针作为参数定义。这意味着您传递的只是一个小于 6 字节(sizeof(mac))的引用。而mac只在内存中存储一​​次。

  2. 这里的 mac 必须声明为 const。因此编译器可以对其进行优化并将该值直接合并到机器指令操作码中。因此,您必须使用优化标志进行编译。见here

  3. 如果两者都不是,那么它仍然可以,因为 mac 仍然被实例化一次,并且将通过堆栈内存按值(复制)传递。

最好的是...byte const macbegin(byte const*),因此编译器将决定节省内存和时间的最佳方式。


使其全球化没有缺点。一个定义将导致翻译的操作码,如果优化,也可能全局 const 将(见上面的案例 2)。但是一个 const 将导致一个实例也有一个 opcoder(在初始化 mac 时),其余的则在此实例的引用/别名中(寻址值)。行为由Ethernet 的实现定义。

【讨论】:

  • 您说“这只会使 mac 实例化一次并重用它(没有内存问题)”......内存到底发生了什么?这些语句消耗相同数量的内存(闪存,RAM,...)?如果有的话,使用#defineconst 时内存级别有什么区别?
  • 为什么你把const放在/**/里面?
  • 因为我不知道 Ethernet.begin() 是否可以处理 const。 const if possible :)
  • BTWEthernet.begin() 函数似乎不支持const 语句:编译器生成invalid conversion from 'const byte*' to 'uint8_t*' 错误。
  • 使用 uint8_t 代替字节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
  • 1970-01-01
  • 2012-01-29
相关资源
最近更新 更多