Функции со строковыми параметрами

Внутри моего основного цикла есть такая строка:

String string1;

У меня есть функция, которая принимает строку 1 в качестве параметра и использует ее для отправки этой строки в виде 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()? (так что он появляется три раза: 1 в прототипе, 1 в объявлении и один в вызове). Или мне не нужно использовать прототип функции перед основным циклом()?

, 👍12


3 ответа


Лучший ответ:

11
  1. Просто изменись

    void sendSMS()
    

    в

    void sendSMS(const String& thisIsAString)
    

    Затем вы можете получить доступ к параметру внутри функции с помощью thisIsAString.

  2. Нет, прототип вам не нужен.

,

Я бы скорее посоветовал передавать строку по ссылке, чтобы избежать выполнения дополнительного кода даром (конструктор копирования, деструктор): void sendSMS(String& thisIsAString) или, что еще лучше, константная ссылка, если строковый аргумент не будет изменен функцией: void sendSMS(const String& thisIsAString), @jfpoilpret


0

Вы можете изменить

void sendSMS()

в

void sendSMS(String myinputstring)

вы можете использовать myinputstring в вашем коде.

,

Это просто повтор другого ответа., @sempaiscuba

Не повторение другого ответа. Это *по копии*, а не *по ссылке*. Предпочитайте другой ответ, чтобы избежать копирования объекта., @Daniel F


2

Я бы посоветовал никогда больше не использовать String. Когда код станет больше и использование памяти станет критическим, вы зайдете в тупик. Я знаю, что это удобнее, но попробуйте массивы символов. Что-то вроде:

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 байта для данных и один дополнительный байт для символа, означающего «конец строки» (это \0).

,