Skocz do zawartości

Rozbicie stringa na 2 zmienne liczbowe


Robert85

Pomocna odpowiedź

Tylko że ten wskaźnik wskazuje nie na napis (którego chciałaby funkcja) a na zmienną typu String, czyli strukturę której jednym z pól jest wskaźnik do funkcji. Czujesz różnicę?

String s = "test";

void setup()
{
    Serial.begin(115200);
    char *t = (char *)&s;
    char *u = s.c_str();
    Serial.println((uint16_t) t);
    Serial.println((uint16_t) u);
}

void loop() {}

Czy wypisane wartości będą takie same?

Link do komentarza
Share on other sites

Ok, to przeszło, ale wywala nieco niżej gdzie miałem:

char *p = payload2 + len;

(wypluło: cannot convert 'StringSumHelper' to 'char*' in initialization)

zamieniłem na:

char *p = payload2.c_str() + len;

ale i tak wywaliło to: invalid conversion from 'const char*' to 'char*' [-fpermissive]

Zdaję sobie sprawę jak banalny to temat, ale po dobie utknięcia na czymś takim, nie jestem już w stanie nawet logicznie myśleć 🙃

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Przed chwilą, Robert85 napisał:

invalid conversion from 'const char*' to 'char*' [-fpermissive]

Bo tak nie można, nie możesz wstawić wartości typu const char * do zmiennej typu char *.

Albo użyjesz czegoś w stylu:

const char *p = payload2.c_str() + len;

albo rzutowania (które tu jest akurat bez sensu).

 

Link do komentarza
Share on other sites

1 godzinę temu, ethanak napisał:

Bo tak nie można, nie możesz wstawić wartości typu const char * do zmiennej typu char *.


To co widać, było połączeniem funkcji z biblioteki HTTPClient.h i funkcji znalezionej na jakimś forum. Rozbijam się na tym, że funkcja HTTPClient pobiera dane ze zdalnego pliku tekstowego jako String a funkcja z neta potrzebuje char.

Funkcja, którą stworzyłeś wcześniej działa identycznie, ale tylko jeśli na sztywno daję zmienną jako char*:

 char *napis="640, 1530";

Jeśli zmieniam na:
String napis="640, 1530";

to wypluwa, że nie można konwertować stringa na char. 

Dlaczego upieram się przy tym "String"? Bo tylko na taki typ pobiera mi funkcja z HTTPClient.h:
String napis = http.getString();


 

Link do komentarza
Share on other sites

To ja już zwątpiłem ... mam u siebie funkcję która dostaje kody pilota właśnie jako string, robię jawne rzutowanie na wskaźnik char* i działa mi to 

void onSonyCodeChange(String s) {
int l = 0;// = atoi((char*)&s);
uint16_t lbit = 0;
char * tok = strtok((char*)&s,"&");
lbit = atoi(tok);
tok = strtok(NULL,"&");
l = atoi(tok);

irsend.sendSony(l,lbit,3);
if(l != 0)tmr.once(5,sendZero);
}

Z resztą nie jest to jedyne miejsce w kodzie gdzie robię takie operacje

Edytowano przez _LM_
Link do komentarza
Share on other sites

Ja się na programowaniu słabo znam, ale zrobiłbym to tak:

String zmienna= "123, 12976";
void setup() {
 
}

void loop() {
  int dlugosc= zmienna.length(); //liczy długość zmiennej
  int separator = zmienna.indexOf(',');//zwraca pozycję seperatora
  //podział zmiennej na dwa Stringi
  String liczbaA=zmienna.substring(0,separator);// zapisuje do zmiennej ilość znaków od 0 do seperatora
  String liczbaB=zmienna.substring(separator+1,dlugosc);// zapisuje do zmiennej znaki od seperatora+1 do końca
  //zmiana Stringów na Int
  int liczA=liczbaA.toInt();
  int liczB=liczbaB.toInt();
}

Kod na Arduino działa.

Link do komentarza
Share on other sites

@_LM_ Przede wszystkim robisz coś czego robić absolutnie nie wolno: używasz strtok do argumentu const, przy czym pewnie dlatego że kompilator Cię ochrzania rzutujesz sobie to na zwykły char*. Ogólnie strtok nie należy używać bo zmienia zawartość napisu na którym działa, chyba że dokładnie wiesz co robisz (a z kodu widzę, że niespecjalnie wiesz).

Poza tym to że błędny kod w pewnych przypadkach może działać nie oznacza jeszcze, że nie jest błędny. Ale co ja tam wiem...

 

Link do komentarza
Share on other sites

 

2 minuty temu, ethanak napisał:

chyba że dokładnie wiesz co robisz (a z kodu widzę, że niespecjalnie wiesz).

To wiem czy nie wiem? Skoro kod robi to czego od niego oczekuję czyli zwraca mi poszukiwane wartości. No i po co mi jest ten string później? Przecież jak wyjdę z funkcji to i tak go utracę

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.