Skocz do zawartości

Rozbicie stringa na 2 zmienne liczbowe


Pomocna odpowiedź

@_LM_ Czy jesteś na 100% pewien, że (char *)&S jeśli S jest typu String to wskaźnik do napisu, czy może wskaźnik do zmiennej (to dwie różne rzeczy)? Nie wprowadzaj ludzi w błąd.

 

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?

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ć 🙃

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).

 

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();


 

(edytowany)

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_

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.

@_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...

 

 

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ę

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...