2017-01-27 9 views
0

私は実際にESP8266 core for Arduinoを使用してESP8266上でソフトウェアを開発することは理解できません。関数呼び出し時にStringを渡すと、基本的に私のプログラムがクラッシュします。私は非常に長いStringでこの関数を呼び出すの二つの方法を試してみた文字列パラメータ直接変数と関数の呼び出し

void SimpleFunc(String str) 
{ 
    ... 
} 

:私は、パラメータとしてStringと機能を持っています。 最初の方法新しいString変数を作成し、それを渡すことです:

String veryLongString = "veeeerryyyy loooong ........."; //Much longer in reality!!! 
SimpleFunc(veryLongString); 

第二の方法直接Stringを渡すことです:

クラッシュにおける第二のスケッチ結果を実行
SimpleFunc("veeeerryyyy loooong ........."); 

。 ... \ esp8266 \ 2.3.0 \コア\ esp8266 \ umm_malloc/umm_malloc.cライン::〜文字列()で1163

文字列で

umm_assimilate_up:ここでは、スタックの一部です。 .. \ esp8266の\ 2.3.0 \コア\ esp8266/WString.cppライン720

_umm_freeで... esp8266 2.3.0 \ \コア\ \ esp8266 \ umm_malloc/umm_malloc.cライン1287

無料... \ esp8266 \ 2.3.0 \ cores \ esp8266 \ umm_malloc/umm_malloc.c行1733

String ::〜String()at ... \ esp8266 \ 2.3.0 \ cores \ esp8266/WString.cpp行720

このように関数を呼び出す点で違いはありますか?最初のアプローチはなぜうまくいくのですか?あなたが参照

void foo(std::string const &str) 

基礎となる文字のいかなるコピーが作成されていないことで、文字列を呼び出す場合

+2

https://hackingmajenkoblog.wordpress.com/2016/02/04/the-evils-of-arduino-strings/ –

答えて

3

。あなたは値によって呼び出す場合

void food(std::string str) 

strのは、それが非常に長い場合にメモリ不足のマシンを実行することができ、高価な操作である、コピーされます。

関連する問題