Функции со строковыми параметрами
Внутри моего основного цикла есть такая строка:
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);
}
Мои вопросы:
- Как поместить строковый входной параметр в sendSMS?
- Нужно ли мне также использовать прототип функции для sendSMS()? (так что он появляется три раза: 1 в прототипе, 1 в объявлении и один в вызове). Или мне не нужно использовать прототип функции перед основным циклом()?
@user1584421, 👍12
3 ответа
Лучший ответ:
Просто изменись
void sendSMS()
в
void sendSMS(const String& thisIsAString)
Затем вы можете получить доступ к параметру внутри функции с помощью
thisIsAString
.Нет, прототип вам не нужен.
Вы можете изменить
void sendSMS()
в
void sendSMS(String myinputstring)
вы можете использовать myinputstring в вашем коде.
Это просто повтор другого ответа., @sempaiscuba
Не повторение другого ответа. Это *по копии*, а не *по ссылке*. Предпочитайте другой ответ, чтобы избежать копирования объекта., @Daniel F
Я бы посоветовал никогда больше не использовать 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).
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Что лучше использовать: #define или const int для констант?
- Как работать с аналоговыми контактами в цикле?
- Какие есть другие IDE для Arduino?
- Как использовать переменные и функции в нескольких файлах .ino
- Разница между void setup() и void setup(void)
- Будет ли .ino-скетч ардуино компилироваться непосредственно на GCC-AVR?
- Получение имени перечисления из экземпляра перечисления
Я бы скорее посоветовал передавать строку по ссылке, чтобы избежать выполнения дополнительного кода даром (конструктор копирования, деструктор):
void sendSMS(String& thisIsAString)
или, что еще лучше, константная ссылка, если строковый аргумент не будет изменен функцией:void sendSMS(const String& thisIsAString)
, @jfpoilpret