Funkcje z parametrami łańcuchowymi

11

W mojej głównej pętli znajduje się ten ciąg:

String string1;

Mam funkcję, która weźmie ciąg1 jako parametr i użyje go, aby wysłać ten ciąg jako SMS.

sendSMS(string1);

To jest funkcja sendSMS () (bez parametrów):

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

Moje pytania to:

  1. Jak umieścić parametr wejściowy ciągu w sendSMS?
  2. Czy muszę także używać prototypu funkcji dla sendSMS ()? (tak, że pojawia się trzy razy, 1 w prototypie, 1 w deklaracji i jeden w zaproszeniu). Czy nie muszę używać prototypu funkcji przed główną pętlą ()?
użytkownik1584421
źródło

Odpowiedzi:

10
  1. Po prostu zmień

    void sendSMS()

    do

    void sendSMS(const String& thisIsAString)

    Następnie można uzyskać dostęp do parametru wewnątrz funkcji za pomocą thisIsAString.

  2. Nie, nie potrzebujesz prototypu.

Facet z kapeluszem
źródło
8
Radziłbym raczej przekazać String przez referencję, aby uniknąć wykonania dodatkowego kodu za darmo (copy-konstruktor, destruktor): void sendSMS(String& thisIsAString)lub nawet lepiej, stałej referencji, jeśli argument łańcucha nie ma być modyfikowany przez funkcję:void sendSMS(const String& thisIsAString)
jfpoilpret
2

Powiedziałbym, żeby nigdy więcej nie używać String. Gdy kod staje się większy, a użycie pamięci będzie krytyczne, trafisz w ślepy zaułek. Wiem, że jest to wygodniejsze, ale daj szansę tablicom char. Coś jak:

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;
}

Zmieniłem funkcję na bool. Oznacza to, że możesz użyć go w instrukcji if, gdzie chciałbyś, aby został on uzupełniony przed kontynuowaniem kodu.

Będziesz musiał samodzielnie przydzielić pamięć dla tablicy; zadeklaruj to w ten sposób:

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

Tutaj przeznaczam 32 bajty na dane i jeden dodatkowy bajt na znak, który oznacza „koniec łańcucha” (to jest \ 0).

dBm
źródło
0

Możesz się zmienić

void sendSMS()

do

void sendSMS(String myinputstring)

możesz użyć myinputstring w swoim kodzie.

pythosanck
źródło
To tylko powtórzenie drugiej odpowiedzi.
sempaiscuba