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 lip 2025, o 19:40


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
    Autor Wiadomość
    PostNapisane: 14 kwi 2014, o 17:10 
    Offline
    Użytkownik

    Dołączył(a): 28 paź 2013
    Posty: 28
    Pomógł: 1

    Witam wszystkich. Straciłem już wszystkie włosy na głowie i nadal nie mogę dojść do ładu z pewnym "nienormalnym" zachowaniem aplikacji :(

    Domyślam się, że problemem jest moja nie wiedza, a nie "głupi" kompilator, czy uC :)

    Ale do żeczy:

    Mam kod jak poniżej...

    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.


    Problemem jest to, że w miejscu programu oznaczonym jako ...A... pozyskuję wartość do zmiennej ADCValue. Wartość ta jest z zakresu 0..255. Następnie spodziewałbym się że po wywołaniu funkcji Voltage, będę miał zapisany w pamięci (wskazywanej przez *BFR) ciąg znaków zgodnie z ciałem funkcji Voltage... To znaczy dla wartości 0 pamięć powinna wyglądać tak: 'Z', 'E', 'R', 'O', \0, dla wartości 255 tak: 'M', 'A', 'X', \0, a dla wartości pośrednich tak: 'P', 'O', 'S', 'R', \0

    W miejscu programu ...B... "wyświetlam" zawartość pamięci spod adresu wskazywanego przez: BFR. I niestety mam cały czas spacje, te z inicjalizacji zmiennej :(

    Nie pomaga już nawet na sztywno przypisywanie wartości do zmiennej ADCValue tuż przed wywołaniem Voltage. Ani też nie pomogłą wykomentowanie ciała funkcji Voltage i na sztywno wstawienie kodu:

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


    Potrafi ktoś to wytłumaczyć i pokazać mi, co jest nie tak?

    Z góry dziękuję i pozdrawiam...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 14 kwi 2014, o 17:55 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 maja 2012
    Posty: 233
    Lokalizacja: Gdynia
    Pomógł: 15

    Użyj funkcji strcpy

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


    Oczywiście wcześniej

    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 kwi 2014, o 18:10 
    Offline
    Użytkownik

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

    Pomógł: 101

    czarusgg napisał(a):
    Voltage (BFR);


    Zmienna jest przekazywana do funkcji "przez wartość", nieprawdaż? A więc...pewnie już wiesz co :-)

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



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 14 kwi 2014, o 19:03 
    Offline
    Użytkownik

    Dołączył(a): 28 paź 2013
    Posty: 28
    Pomógł: 1

    Tak też próbowałem...

    Voltage (&BFR);

    I też kiszka :( Poza tym, że wtedy na pierwszym znaku mam śmieci :)

    I teraz w takim razie zapytanie, czy char* BFR nie powoduje zadeklarowanie wskaźnika na znak (bajt) identycznego jak wskaźnik na tablicę bajtów? Samo to powoduje, że BFR tak de facto jest wskaźnikiem. Także w tym wypadku do funkcji trafia wskaźnik...

    Ale pokombinuje w tym kierunku...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 14 kwi 2014, o 19:36 
    Offline
    Użytkownik

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

    Pomógł: 101

    czarusgg napisał(a):
    I teraz w takim razie zapytanie, czy char* BFR nie powoduje zadeklarowanie wskaźnika na znak (bajt) identycznego jak wskaźnik na tablicę bajtów? Samo to powoduje, że BFR tak de facto jest wskaźnikiem. Także w tym wypadku do funkcji trafia wskaźnik...


    Owszem, wszystko się zgadza...prawie...do funkcji trafia kopia wskaźnika. Przy wyjściu z funkcji kopia jest niszczona. Musisz albo przekazać zmienną przez referencję albo przerobić funkcję na zwracającą wartość.

    czarusgg napisał(a):
    Tak też próbowałem...

    Voltage (&BFR);

    I też kiszka :( Poza tym, że wtedy na pierwszym znaku mam śmieci :)

    A w funkcji przypisanie wyglądało tak?
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Jest pewien problem w Twoim kodzie, mianowicie jak już uda Ci się przypisać nowy ciąg do zmiennej BFR to tym samym stracisz dostęp do inicjalnego ciągu spacji. Powinieneś mieć jakąś zmienną typu const, która zawsze będzie przechowywać adres ciągu i drugą zmienną, roboczą do której przypisywać można biążący ciąg.

    A tak w ogóle w mikroklockach stałe ciągi znaków definiuje się w pamięci flash, ale może na razie to zostawmy.

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



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 14 kwi 2014, o 19:41 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 07 lut 2013
    Posty: 600
    Pomógł: 47

    A nie powinieneś zainicjować bufor w ten sposób:


    char BFR[25];

    Ale mogę się mylić.

    _________________
    https://www.instagram.com/myfirstquadcopter/



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 14 kwi 2014, o 20:01 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 06 maja 2012
    Posty: 233
    Lokalizacja: Gdynia
    Pomógł: 15

    Jak dasz
    czarusgg napisał(a):
    Voltage (&BFR);


    to funkcja Voltage

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


    a dalej tak jak xor napisał

    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: 15 kwi 2014, o 00:00 
    Offline
    Użytkownik

    Dołączył(a): 28 paź 2013
    Posty: 28
    Pomógł: 1

    Dziękuję, pomogło. Zrozumiałem to w ten sposób...

    Skoro przekazuję do funkcji wskaźnik char* B, To tak naprawdę owszem, przekazuję w tym wskaźniku adres na pamięć z moimi spacjami, ale operacji dokonuję na samym wskaźniku a nie tej pamięci. Stąd, jeśli przypisałem B = "ZERO", to defacto, 'Z' oraz 'E' stało się adresem wskazującym na coś tam ('Z' * 256 + 'E'), 'R', '0', \0 zaś mazało po pamięci za tym wskaźnikiem niszcząc inne zmienne bądź co bardziej prawdopodobne mazało po stosie :) Gdy zacząłem się do tego obszaru odwoływać poprzez wskazanie *B, zaczęło działać. No i do funkcji przekazywałem nie sam wskaźnik a faktyczny adres (w nim) moich inicjalizacyjnych spacji poprzez operator pobrania adresu &. Czy dobrze to zrozumiałem. Generalnie dziękuję, działa jak trzeba :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 kwi 2014, o 07:37 

    Pomógł: 0

    Zasada wskaźników to jest bardzo dobrze wytłumaczona w BB oraz w "Szkoła Programowania C" Praty



    Góra
      
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 kwi 2014, o 09:36 
    Offline
    Użytkownik

    Dołączył(a): 28 paź 2013
    Posty: 28
    Pomógł: 1

    :) OK, Wrócę do BB zanim Mirek to zobaczy :oops:
    Jeszcze raz dziękuję wszystkim za odpowiedzi, wskazówki i wyjaśnienia.

    PS. To jak do ciężkiej anielki działają moje dotychczasowe urządzenia :?:



    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: 10 ] 

    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