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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 13 cze 2025, o 05:07


    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 ] [ Zaznacz wszystko ]
    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 ] [ Zaznacz wszystko ]
    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 1 gość


    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