L'opérateur new pour Arduino
J'ai dit (en particulier dans les répondre à C++ Standard Library sur un Arduino, et dans le Débordement de la Pile question Chaîne C++ et Arduino Chaîne. Comment les combiner?)) que le compilateur Arduino ne pas mettre en œuvre la new
de l'opérateur. Cependant, j'ai écrit un programme pour l'Arduino (dans l'IDE Arduino) qui l'utilise, et il fonctionne parfaitement.
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");
}
Voici un exemple de sortie de démontrer ses fonctionnalités:
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.
Alors, pourquoi ne j'entends ça? Ces gens ont tort, ou dois-je simplement mal comprendre leur signification?
Comme on dit dans l'armée, si la carte ne correspond pas au terrain, la confiance du terrain.
OriginalL'auteur Michael Dorst | 2013-04-29
Vous devez vous connecter pour publier un commentaire.
new
etdelete
est définie comme la partie de la carte Arduino distribution:/usr/share/arduino/hardware/arduino/cores/arduino/new.h
:La
new.h
est inclus dansPrintable.h
de sorte que vous obtenez dans votre Arduino de base comprend. Ces opérateurs ne sont pas définis dans AVR Libc. Mon interprétation de ces choix de conception: la Libc, les gens pensaient que c'était une mauvaise idée, alors que l'Arduino gens sont tous sur la facilité d'utilisation: si vous vouleznew
etdelete
, merci de les avoir.OriginalL'auteur angelatlarge
Comme vous l'avez démontré,
new
etdelete
ne de travail, en principe, sur un Arduino. Le problème, c'est que votre Arduino a 2K de RAM pour les variables globales, de la pile et du tas combiné, de sorte que tout programme considérable de vous écrire pour elle doit être très au courant de l'utilisation de la mémoire.Donc, pour un système embarqué comme cela, il est généralement préférable d'utiliser allocation statique (ou, éventuellement, par classe d'allocation dynamique dans certaines situations) plutôt que des fins générales de l'allocation dynamique: Pour des programmes simples, vous n'avez pas besoin de l'allocation dynamique, et pour des programmes complexes, vous ne pouvez pas permettre.
OriginalL'auteur microtherion
Juste parce que la plate-forme ne pas prédéfinir
operator new()
ne veut pas dire que vous ne pouvez pas le définir. Dans votre code, sans doute quelqu'un aura écrit une définition de la fonction d'allocation, donc, tout est bien.(Je suppose que vous êtes familier avec la différence entre le
new
expression et la fonction d'allocation, qui est très appeléoperator new()
.)Voici un bébé, un exemple de définition qui devrait obtenir un court programme:
Ce sera bien évidemment manquer de mémoire très rapide.
operator new
dans toutes ses formes, des définitions que le travail, n'est-ce pas la même chose quenew
être "mis en œuvre" sur la plate-forme Arduino? Que faire de ces gens veulent dire quand ils disent que l'Arduino ne prend pas en chargenew
oudelete
? De toute évidence, ils travaillent, quel est donc le problème?J'aime que ce qui est appelé un "bébé".
Il y a deux problèmes avec cet exemple: 1: essayez d'utiliser des exceptions sur un système embarqué, 2: en supposant que l'Arduino a un
std
espace de noms (il n'est pas).1) Un libre-debout la mise en œuvre est toujours nécessaire de fournir un certain sous-ensemble de la bibliothèque standard, qui comprend par exemple
std::size_t
. 2) Une alternative à jeter serait de mettre fin, ou invoquer tous les motifs de non-retour gestionnaire est approprié pour votre cas d'utilisation.Arduino fournit
size_t
, mais passtd::size_t
. Malgré l'utilisation d'un compilateur C++11, Arduino ne pas mettre en œuvre toutes les C++ stdlib, elle met en œuvre uniquement des aspects de la C stdlib et quelques-uns de ses propres extensions. La gestion des exceptions est disponible, mais découragé et il n'y a pas stdlib classes d'exception. Qui est-à-dire, la raison de cette réponse a si peu de voix, parce que c'est une réponse générique qui ne veut pas prendre Arduino idiosyncrasies en compte.OriginalL'auteur Kerrek SB