文字列パラメータを持つ関数


11

私のメインループ内には次の文字列があります:

String string1;

string1をパラメーターとして受け取り、それを使用してこの文字列をSMSとして送信する関数があります。

sendSMS(string1);

これはsendSMS()関数です(パラメーターなし):

void sendSMS()
{ sms.beginSMS(remoteNumber);
  sms.print(finalstr);
  sms.endSMS();
  lcd.setCursor(0, 0);
  lcd.print("Message sent!");
  delay(10000); 
}

私の質問は:

  1. 文字列入力パラメーターをsendSMSに配置するにはどうすればよいですか?
  2. sendSMS()の関数プロトタイプも使用する必要がありますか?(3回表示されるように、1つはプロトタイプに、1つは宣言に、1つは呼び出しにあります)。または、メインloop()の前に関数プロトタイプを使用する必要はありませんか?

回答:


10
  1. ただ変える

    void sendSMS()

    void sendSMS(const String& thisIsAString)

    次に、を使用して関数内のパラメータにアクセスできますthisIsAString

  2. いいえ、プロトタイプは必要ありません。


8
:私はむしろ何も(コピーコンストラクタ、デストラクタ)のために実行される追加のコードを避けるために、参照することによって文字列を渡すために助言するvoid sendSMS(String& thisIsAString)文字列引数が関数によって変更されるようにされていない場合は、さらに良いconst参照のか:void sendSMS(const String& thisIsAString)
jfpoilpret 14年

2

Stringを二度と使用しないように言います。コードが大きくなり、メモリ使用量が重要になると、行き止まりにぶつかります。もっと便利だと思いますが、char配列を試してみてください。何かのようなもの:

bool sendSMS(int remoteNumber, char *finalstr){
  bool isFinished = 0;
  sms.beginSMS(remoteNumber);
  for (int i=0;i<sizeof(finalstr);i++){
      sms.print(finalstr);
  }
  sms.endSMS();
  lcd.setCursor(0, 0);
  lcd.print("Message sent!");
  delay(10000);
  isFinished = 1;
  return isFinished;
}

関数をboolに変更しました。これは、コードを続行する前に完了する必要があるifステートメント内で使用できることを意味します。

自分でメモリを配列に割り当てる必要があります。次のように宣言します。

char stringArray[33] = {'\0'};

ここでは、データ用に32バイトを割り当て、「文字列の終わり」を意味する文字用に1バイトを追加しています(それは\ 0です)。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.