【问题标题】:How to define the length of a global array in a function on Arduino?如何在 Arduino 上的函数中定义全局数组的长度?
【发布时间】:2011-12-11 18:56:58
【问题描述】:

在 C++ 中(在 Arduino 上)可以实现这样的事情吗?

#include "stdio.h"

String str = "foo";

int i[strLength()]; // <- define length of array in function

int strLength() {
  return str.length();
}

int main(void) {
   ...
}

提前谢谢你!

【问题讨论】:

  • 您使用的是 C++ 还是 C? C 没有任何“字符串”对象。
  • 其实我使用的是 Arduino,我认为它使用的是 C++。
  • String 是什么类型?是std::string吗?您平台中的某些特定类型?
  • String 是一个 Arduino 字符串 (arduino.cc/en/Reference/StringObject)。 Arduino 不支持 STL 的任何部分。

标签: c++ arrays global arduino


【解决方案1】:

如果您使用的是 c++,正确的解决方案是 std::vector。 您需要查看 std::vector 的文档,但这里是您的代码到 std::vector 的转换。

然后,您可以像使用常规数组一样使用 std::vectors,使用“[]”运算符。

#include <cstdio>
#include <vector>

String str = "foo";

int strLength() {  // Needs to come before the use of the function
  return str.length();
}

std::vector<int> i(strLength() ); //Start at strLength


int main(void) {
   ...
}

【讨论】:

  • 你是说每个使用 C++ 的人都应该使用 std::vector 吗? OP 正在为 8 位微控制器编译代码,该微控制器具有 32 KB 的总程序内存并以 20 MHz 运行,因此避免使用模板和标准库可以节省大量资源,但我不确定能节省多少。
  • @David 无论哪种方式,他都必须动态分配他的数组。虽然诸如 iostream 之类的东西会产生很大的运行时间成本,但使用主要编译时间的 std::vector 的成本应该很小。
  • @David 但你是对的,在某些情况下,alloca 结合 Jim 的答案会比使用仅为堆设计的 std::vector 更好。
  • 抱歉,它实际上运行速度有点慢:16 MHz。
  • avr-gcc(Arduino 使用的编译器)目前不支持 STL 的任何部分,因此无法使用 std::vector
【解决方案2】:

没有。您需要 i 作为指针并在 main 中分配数组:

int *i = NULL;

// etc.

int main(void) {

    i = (int*) malloc(sizeof(*i)*strLength());

    // etc.
}

【讨论】:

  • 嗯,谢谢!在像 arduino 这样的嵌入式平台上使用这样的代码(使用 malloc)是个好主意吗?
  • @Marcel arduino 编译器可能支持alloca(它使用堆栈而不是堆但相同的接口),看看你是否可以包含
  • @Marcel 它似乎在我的机器上工作,所以语法是i = alloca(sizeof(*i)*strLength());。只要确保在不再需要数组之前不要从分配的任何函数返回(即不要创建一个单独的小函数来分配数组)。
  • @Marcel:通过将 i 声明为指针而不是数组,所有从 i 读取或写入的代码都会慢一点,因为编译器在编译时不知道数组在哪里实际上存储在内存中。每次它需要访问数组时,它必须首先将指针的值读入一个特殊的指针寄存器,然后它才能开始访问数组的实际值。这会使事情变慢,但您可能不会注意到,所以这没什么大不了的。
  • @DavidGrayson 预定义数组长度的另一个选项似乎不太优雅。我的程序中只有两个具有动态长度的数组。我看看速度够不够。谢谢!
【解决方案3】:

我知道这不是你所希望的,但我会做一些像这样不雅的事情:

String str = "foo";
#define MAX_POSSIBLE_LENGTH_OF_STR 16

...

int i[MAX_POSSIBLE_LENGTH_OF_STR];

这个想法是为数组分配比实际需要更多的空间,并且避免使用数组的额外部分。

或者,如果您不打算经常更改源代码中str 的定义,则可以通过以下方式节省一些 RAM:

String str = "foo";
#define LENGTH_OF_STR 3

...

int i[LENGTH_OF_STR];

【讨论】:

    猜你喜欢
    • 2011-05-26
    • 2018-05-24
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多