Arduino的新操作员

Mic*_*rst 2 c++ arduino new-operator arduino-ide

我被告知(特别是在Arduino上的C++标准库,以及Stack Overflow问题C++字符串和Arduino字符串的答案.如何组合它们?))Arduino编译器没有实现new运算符.但是,我已经为使用它的Arduino(在Arduino IDE中)编写了一个程序,它运行得很好.

void setup() {
    Serial.begin(9600);
}

void loop() {
    char* array;
    char c;
    unsigned arraySize;

    Serial.write("Enter a 1 digit number.\n");

    do {
        c = Serial.read();
    } while(c < '0' or c > '9');
    arraySize = c-'0';

    Serial.write("You wrote ");
    Serial.write(c);
    Serial.write(".\n");
    Serial.write("Now enter ");
    Serial.write(c);
    Serial.write(" lower-case letters.\n");

    array = new char[arraySize];

    for (unsigned i = 0; i < arraySize;) {
        array[i] = Serial.read();
        if (array[i] >= 'a' and array[i] <= 'z')
            i++;
    }

    Serial.write("You entered: ");

    for (unsigned i = 0; i < arraySize; i++) {
        Serial.write(array[i]);
        Serial.write(" ");
    }
    Serial.write("\n");
}
Run Code Online (Sandbox Code Playgroud)

以下是演示其功能的示例输出:

Enter a 1 digit number.
You wrote 5.
Now enter 5 lower-case letters.
You entered: h e l l o
Enter a 1 digit number.
You wrote 9.
Now enter 9 lower-case letters.
You entered: w a s s u p m a n
Enter a 1 digit number.
You wrote 9.
Now enter 9 lower-case letters.
You entered: h o w y a d o i n
Enter a 1 digit number.
You wrote 4.
Now enter 4 lower-case letters.
You entered: c o o l
Enter a 1 digit number.
You wrote 7.
Now enter 7 lower-case letters.
You entered: i t w o r k s
Enter a 1 digit number.
Run Code Online (Sandbox Code Playgroud)

那么为什么我一直听到这个?这些人是错的,还是我只是误解了他们的意思?

ang*_*rge 13

new并被delete定义为Arduino发行版的一部分 /usr/share/arduino/hardware/arduino/cores/arduino/new.h::

/* Header to define new/delete operators as they aren't provided by avr-gcc by default
   Taken from http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=59453 
 */
#ifndef NEW_H
#define NEW_H

#include <stdlib.h>

void * operator new(size_t size);
void operator delete(void * ptr); 

__extension__ typedef int __guard __attribute__((mode (__DI__)));

extern "C" int __cxa_guard_acquire(__guard *);
extern "C" void __cxa_guard_release (__guard *);
extern "C" void __cxa_guard_abort (__guard *); 

extern "C" void __cxa_pure_virtual(void);

#endif
Run Code Online (Sandbox Code Playgroud)

new.h包含在Printable.h如此你得到它在你的Arduino基本具备.但是这些运算符在AVR Libc中没有定义.我的这些设计选择的解释:libc中的人认为这是一个坏主意,而Arduino的人都是关于易用性:如果你想newdelete,请他们.


mic*_*ion 9

正如你已经证明,new并且delete 的工作原理上的Arduino.问题是你的Arduino有2K的RAM用于全局变量,堆栈和堆组合,所以你为它编写的任何实质程序都必须高度了解内存使用情况.

因此,对于像这样的嵌入式系统,通常最好使用静态分配(或者在某些情况下可能是每类动态分配)而不是通用动态分配:对于简单程序,您不需要动态分配,并且复杂的程序,你买不起.