Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

WaldekMarek 10 Lip 2017 15:23 1494 11
  • #1 10 Lip 2017 15:23
    WaldekMarek
    Poziom 10  

    Witam.


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

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

    Kod: c
    Zaloguj się, aby zobaczyć kod

    będą tam jeszcze inne dane ale później.
    Stworzyć pozycję menu
    Kod: 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

    0 11
  • #2 10 Lip 2017 15:35
    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
    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.

    0
  • #3 10 Lip 2017 16:42
    WaldekMarek
    Poziom 10  

    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?

    0
  • #4 10 Lip 2017 18:16
    tmf
    Moderator Mikrokontrolery Projektowanie

    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?

    0
  • #5 10 Lip 2017 19:46
    22053
    Użytkownik usunął konto  
  • #6 10 Lip 2017 19:50
    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).

    0
  • #7 10 Lip 2017 19:52
    22053
    Użytkownik usunął konto  
  • #8 10 Lip 2017 20:03
    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.

    0
  • #9 11 Lip 2017 13:30
    trol.six
    Poziom 30  

    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.

    0
  • #10 14 Lip 2017 23:29
    WaldekMarek
    Poziom 10  

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

    0
  • Pomocny post
    #11 15 Lip 2017 09:19
    tmf
    Moderator Mikrokontrolery Projektowanie

    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.

    0
  • #12 15 Lip 2017 20:17
    WaldekMarek
    Poziom 10  

    Dziękuję za odpowiedzi.
    Zamykam temat

    0