logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Wskaźnik do zmiennej umieszczony w strukturze w "Atmel Studio"

WaldekMarek 10 Lip 2017 15:23 1833 11
  • #1 16579061
    WaldekMarek
    Poziom 11  
    Witam.


    Chcę stworzyć menu z różnymi elementami do wyświetlania na ekranie.

    Chcę w strukturze umieścić wskaźnik do zmiennej.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    będą tam jeszcze inne dane ale później.
    Stworzyć pozycję menu
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    No i potem gdzieś to wyświetlać.

    Wszystko narazie działa, ale mam pytanie dlaczego kompilator każe mi w strukturze dać zmienną " volatile uint8_t " ?
    Chciałem dać "int" ale mi wyświetla ostrzeżenie.
    Przecież taka zmienna nie pomieści adresów z całej przestrzeni adresowej pamięci danych procesora.


    Procesorek xmega256A3BU
    Wyświetlacz 128x64 ST7565
    Wszystko oparte o przykłady z książek tmf Układy Peryferyjne i Praktyczne projekty
    Kod pisany w AtmelStudio7
  • #2 16579090
    grko
    Poziom 33  
    Nie sądzę aby kompilator cokolwiek Ci kazał:) Zauważ, że rozmiar wskaźnika na AVR jest równy 2. Niezależnie od typu:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kompilator zapewne "czepia" się o właściwy typ wskazywany przez Twój wskaźnik. Więc jeżeli LicznikPodswietlenia jest typu volatile uint8_t to twój wskaźnik również musi pokazywać na taki typ.
  • #3 16579210
    WaldekMarek
    Poziom 11  
    Chyba źle rozumiem wskaźniki.
    Czyli jeżeli dobrze rozumiem to wskaźnik zawsze jest dwu bajtowy, a ja myślałem że podaję długość wskaźnika.
    To co mam zrobić żeby się nie czepiał. Chcę w ten sposób wyświetlać różne zmienne które są różnych typów.
    Czy można do struktury podać typ zmiennej?
  • #4 16579413
    tmf
    VIP Zasłużony dla elektroda
    W prosty sposób nie uda ci się tego zrobić. Ostrzeżenie można łatwo wyeliminować jwnie rzutując typ, ale to tylko maskuje problem. Musisz wiedzieć na jakiego typu zmienną wskazuje wskaźnik. Ty napisałeś kompilatorowi, że wskaźnik wskazuje na zmienną typu uint8_t. Jeśli zrobisz dereferencję wskaźnika to uzyskasz wartość o typie uint8_t. Jeśli wskaźnik będzie wskazywał na zmienną typu uin16_t to jego dereferencja ciągle da ci tylko uint8_t. Problem można rozwiązać o ile z góry wiesz na co wskazuje wskaźnik, poprzez rzutowanie lub stworzenie unii. Jeśli nie wiesz na jaką zmienną rzeczywiście wskazuje wskaźnik to musisz sobie tą informację jawnie dodać. Może prościej zamiast wartości liczbowych od razu wrzucić tam łańcuch tekstowy?
  • #5 16579587
    Konto nie istnieje
    Konto nie istnieje  
  • #6 16579592
    grko
    Poziom 33  
    R-MIK napisał:
    Zrób wskaźnik do danej o rozmiarze void.


    Chyba o typie void. A dokładnie to void *. Bo sam void to nie ma rozmiaru z tego co mi wiadomo (C99).
  • #7 16579595
    Konto nie istnieje
    Konto nie istnieje  
  • #8 16579608
    grko
    Poziom 33  
    R-MIK napisał:

    Właśnie dlatego, że nie ma rozmiaru to nie ma ostrzeżeń. Można umieścić co się chce ale jak w assemblerze trzeba wiedzieć czy dane traktować jako string, int, long, itp.


    Nie dlatego, że nie ma rozmiaru to nie ma ostrzeżeń. Nie ma rozmiaru bo jest typem niepełnym oraz nie generuje ostrzeżeń bo zachodzi niejawna konwersja do typu void * każdego innego typu wskaźnikowego i vice versa.

    BTW: Rozwiązanie z unią wydaje się tutaj lepsze moim zdaniem.
  • #9 16580894
    trol.six
    Poziom 31  
    WaldekMarek napisał:
    Chcę w ten sposób wyświetlać różne zmienne które są różnych typów.

    Liczba jest binarna, do wyświetlania trzeba ją skonwertować aby przyjęła formę tekstu. Za pomocą jakiej funkcji będziesz konwertował?

    Reprezentacje typów liczb sa różne, szczególnie typ całkowitoliczbowy i zmiennoprzecinkowy, będą wymagały różnych funkcji konwertujacych.
  • #10 16588460
    WaldekMarek
    Poziom 11  
    Dziękuję za odpowiedzi na mój problem.
    Zmusiły mnie do poczytania literatury i głębszego zastanowienia się nad problemem.
    Przyznam że nie wszystkie wypowiedzi zrozumiałem do końca.
    Na mój dzisiejszy stan wiedzy wymyśliłem następujące może trochę niezbyt eleganckie rozwiązanie.
    Dodałem do struktury dwa pola i teraz wygląda tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Zmienne 8, 16 i 32 bit w zupełności mi wystarczą.
    Struktura ma jeszcze inne pola do przechowywania tekstu i wywoływania funkcji, ale to nie jest przedmiotem problemu.

    Tworząc pozycje menu wpisuję zmienne w odpowiednie pola. Zależy mi na wpisywaniu zmiennych a nie liczby jako tekstu, ponieważ po wyświetleniu ekranu zmienne mają wyświetlać aktualne wartości i je ciągle uaktualniać.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Tracę na tym trochę pamięci wstawiając puste pola w strukturę menu i rozbudowując funkcję wyświetlającą, ale przynajmniej mam podpowiedź kompilatora jak wstawię jakąś zmienną nie tam gdzie trzeba.

    Mam jeszcze pytanko dotyczące słówka "volatile" w typie wskaźnika w strukturze.
    Czy poprawne jest wstawienie go w strukturze, a potem podanie wskaźnika do zmiennej bez "volatile". Zmienna zegar nie jest typu "volatile".
    Kompilator niby się nie burzy.

    Pozdrawiam
  • Pomocny post
    #11 16588656
    tmf
    VIP Zasłużony dla elektroda
    Te twoje trzy wskaźniki uimeść w unii - bedziesz miał jeden wskaźnik, do którego odwołasz się przez pola unii.
    W sturktudrze można użyć volatile i można takiemu polu przypisać zmienną nie-volatile.
  • #12 16589620
    WaldekMarek
    Poziom 11  
    Dziękuję za odpowiedzi.
    Zamykam temat
REKLAMA