Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 12 lut 2025, o 09:02


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 13 lis 2014, o 16:37 
Offline
Nowy

Dołączył(a): 08 lis 2014
Posty: 3
Pomógł: 0

Witam.
Jestem na początku drogi Arduino, męczę się nad opisanym niżej problemem,
może koledzy podpowiedzą - co robię źle.

Chcę dodać dwie wartości ciągów String,
a wynik zapisać do zmiennej char (WartoscA),
o ile w pętli przykładowej for - zmienna WartoscA jest wyświetlana prawidłowo,
to po opuszczeniu tej pętli przybiera wartość jakichś krzaczków.

Pytanie - co robię źle ?
Jak zrobić żeby po opuszczeniu pętli for WartoscA była oczekiwana ?

Podejrzewam że to jest coś związane ze zmianą typu zmiennej, ale szukając
rozwiązania nie mogę na nic trafić, albo nie rozumiem problemu / nie wiem gdzie szukać.
Gdyby ktoś mógł mnie naprowadzić byłbym wdzięczy.



Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2014, o 17:30 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Zasięg zmiennej 'char ZmiennaC[]' jest tylko do nawiasu klamrowego pętli. Wszystkie zmienne automatyczne istnieją tylko wewnątrz bloku kodu w której zostały zdefiniowane. W wyrażeniu WartoscA = ZmiennaC przypisujesz tylko wskaźnik na zmienną 'ZmiennaC'. Po wyjściu z pętli 'ZmiennaC' przestaje istnieć, obszar pamięci zajęty dotychczas przez ZmiennaC zostaje wykorzystany do czegoś innego, wskaźnik WartoscA wskazuje na śmieci.

Po co w ogóle takie kombinacje? Ta zamiana ze String na tablicę znaków?


Autor postu otrzymał pochwałę

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2014, o 19:32 
Offline
Nowy

Dołączył(a): 08 lis 2014
Posty: 3
Pomógł: 0

Dzięki serdeczne za odpowiedź, a ja nad tym siedziałem ostatnie dwa wieczory.
wystarczy zadeklarować ZmiennaC na początku i już działa ;)

Krótko - po co mi to ?
Jak już pisałem jestem początkujący - Arduino mam od paru dni.
Znalazłem w sieci sterowanie wyjściami poprzez stronę html.
tam za odczyt ze strony odpowiada konstrukcja
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Aby umieścić wiele przycisków - chcę to zrobić w pętli, i dlatego potrzeba
mi zastąpić konstrukcję "GET /?status=ON" zmienną.
Ponieważ ta zmienna ma typ char, chciałem połączyć 2 ciągi char np "GET /?status=" i dołączyć "ON" a następnie zapisać w zmiennej.
Problem w tym że nie znalazłem instrukcji jak połączyć ciągi typu char (Jak taka istnieje proszę o napisanie).

W następnym ciągu myślowym - stworzyłem sobie zmienne typu String które mogłem już dodać.
i teraz chciałem to podstawić String zamiast "GET /?status=ON"

Ale tutaj znowu problem - więc znalazłem instrukcję do zmiany typu String na char i ją zastosowałem,
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i wszystko by było dobrze gdyby nie te krzaczki - i tu dziękuję za pomoc.

To moje pierwsze zetknięcie z C++, wcześniej coś tam programowałem w języku Clipper.
No i jak widać mam trochę problemów ze zrozumieniem typów zmiennych i wskaźników.

Jeszcze takie pytanie korzystając z uprzejmości;
czy można dodać typ char do char - i jak się to robi ?
od czego zależy czy zmienna jest widoczna jako "czysta" zmienna, czy jako wskaźnik do innej zmiennej,
bo mam problem ze zrozumieniem tego faktu - jeżeli jest na to jakaś prosta odpowiedź.

Dziękuję za pomoc. Rysiek S.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2014, o 22:48 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Klasa String w C++ to pewne rozszerzenie typu łańcuchowego z C (tablic znaków zakończonych znakiem '\0' czyli tzw ASCIIZ). Objawia się to to m.in. w uproszczeniu operacji na ciągach, np., łączenie dwóch łańcuchów jest tak proste jak dodanie dwóch liczb (W C to wyrażenie nie ma najmniejszego sensu, a pewnie nawet nie da się skompilować.):

Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


No ale nadal jest to ciąg znaków ASCIIZ (czyli chyba można sobie darować karkołomne konwersje ze string na char*).

rysieks napisał(a):
czy można dodać typ char do char - i jak się to robi ?

No char do char to raczej zwykle nie ma sensu

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


ale char do String rozszerzy string o ten znak.

Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


rysieks napisał(a):
od czego zależy czy zmienna jest widoczna jako "czysta" zmienna, czy jako wskaźnik do innej zmiennej,


W przypadku typow prostych (int, char, float) jest specjalny operator "uwskaźnikowienia", natomiast w przypadku tablic (w tym tablic znakowych ASCIIZ) jest to trochę ukryte - tablica jest już wskaźnikiem, element tablicy jest "zwykła" zmienną.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lis 2014, o 15:48 
Offline
Nowy

Dołączył(a): 08 lis 2014
Posty: 3
Pomógł: 0

Dziękuję za wszystkie uwagi, poszerzają one moją nikłą widzę.

Jednak dalej mam problem - może nie z zamianą String na char,
ale chyba ze zmienną tablicową typu char*

Po prostu w części void loop() konstruuję określony ciąg znaków (i to działa)
ale nie mogę zapisać tych ciągów do tablicy
typu char* PinKodONpytaj oraz char* PinKodOFczytaj.

Jak kolega XOR mi naświetlił jest to chyba wskaźnik do tablicy,
a ja nie potrafię go obsłużyć tak domniemam.

Użycie funkcji strcat(), strcpy() też nic nie daje (albo źle używam)

Funkcja czasem po kompilacji zapisuje poprawnie 4 wartości, a czasem 1
pozostałe to powtórzenia
np;

PinKodONpytaj {"GET /?status=ON__4","GET /?status=ON__4","GET /?status=ON__4","GET /?status=ON__4"}
PinKodOFpytaj {"GET /?status=ON__4","GET /?status=ON__4","GET /?status=ON__4","GET /?status=ON__4"}


prawidłowo wartości powinny być

PinKodOFpytaj {"GET /?status=ON__1","GET /?status=ON__2","GET /?status=ON__3","GET /?status=ON__4"}
PinKodOFpytaj {"GET /?status=OF__1","GET /?status=OF__2","GET /?status=OF__3","GET /?status=OF__4"}

pomimo że przed zapisem dane wyglądają prawidłowo, jeżeli je drukuję.


I tutaj moja prośba o skierowanie na właściwe tory, bo nijak nie mogę tego ugryźć.
Mogę stworzyć tablicę String i tam zapisać wartości - niema z tym problemu.

Chodzi szczególnie o;

char* KodPinONpytaj[]
char* KodPinOFpytaj[] zapisane w liniach 13 do 20

które podstawiane są do (linia 102, 106);
if(strstr((char *)Ethernet::buffer + pos, KodPinONpytaj[i] ) != 0) w części void loop()

i zapis do tablicy char* KodPinONpytaj[] w części void setup ()
I z tym zapisem właśnie mam problem, z gwiazdką przed tablicą też próbowałem.
Zapis w liniach 62 do 78,
a tak naprawdę to chodzi o linie 67 i 76 !!!

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Jakie linijki trzeba tam dopisać (do 67 i 76 )
żeby funkcjonowało to z tą nieszczęsną tablicą typu char* prawidłowo ?
Pozostała część kodu o ile podstawię tablice "PinKodONpytaj" i "PinKodOFpytaj" już wypełnione wartościami
działa prawidłowo.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO