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

[AVR][Atmel Studio] - Wskaźnik na tablicę wskaźników

INTEII 15 Cze 2016 12:48 1308 7
  • #1 15744328
    INTEII
    Poziom 14  
    Witam,

    Piszę program i napotkałem na następujący problem:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    I w wyniku tego otrzymuję ostrzeżenia:
    Warning	133	initialization from incompatible pointer type [enabled by default]...
    Warning	134	unused variable 'Wskaznik' [-Wunused-variable]...
    

    Próbowałem już wszystkiego stąd prośba do Was o pomoc.

    Dziękuję i pozdrawiam.

    Dodano po 1 [godziny] 51 [minuty]:

    Witam,

    Udało mi się chyba rozwiązać problem - może komuś się przyda:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Program działa tak jak powinien, a kompilator nie zgłasza ostrzeżeń.

    Pozdrawiam.
  • #2 15745366
    JacekCz
    Poziom 42  
    Super że działa.

    jesli można coś wnieść, we własnym kodzie nie byłbym skłonny robić typedefa *) ani z const (const jest raczej atrybutem konkretnej zmiennej a nie typu) a już zwłaszcza z dialektowym słowem PROGMEM (które z kolei chyba jest makrem).

    1. To na poziomie "ekspresji" nie wnosi w moim odczuciu nic nowego.
    2. Może być dziwnie zaimplementowane (np słowo z dialektu może nie być skuteczne w jakimś kontekście)
    .3 najważniejsze dla mnie jest, że zarówno PROGMEM jak i const jest cechą zmiennej (a nie typu)

    *) w ogóle typedef się okazał ślepą uliczką w rozwoju języków, żaden z nowszych języków go nie powtarza, a nawet młodszy brat C++ "niedyskretnie" odsuwa na bok czyniąc mniej potrzebnym, choćby na nazwy struktur.
  • #3 15745845
    tmf
    VIP Zasłużony dla elektroda
    Akurat z const jeszcze jakiś sens to ma, a przynajmniej jest poprawne wg standardu języka. Natomiast w typedef absolutnie nie można używać makra PROGMEM, które jest rozwijane do odpowiedniego atrybutu, a zgodnie ze standardem języka, atrybuty nie mogą być przypisywane nowotworzonym typom przez typedef. Akurat w starych gcc to działa, lecz od dawna developerzy gcc chcą tą przypadkową funkcjonalność kompilatora usunąć, może nawet już to zrobili. W efekcie kod albo przestanie się kompilować (jeśli developerzy w takiej sytuacji pomyślą o wyrzuceniu błędu kompilacji), albo zacznie działać conajmniej dziwnie (jeśli gcc po prostu będzie ignorował atrybut w typedef). Stąd też nawet typy w nagłówku progmem, które dawniej były, typu prog_char itd. obecnie przy próbie wykorzystania wyrzucają błąd, lub ostrzeżenie, że są depreciated.
  • #4 15746309
    INTEII
    Poziom 14  
    Witam,

    Panowie dziękuję za cenne uwagi.
    Mam jednak do nich pytanie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Czy nie ma jakiegoś sposobu na uproszczenie tego zapisu?
  • #5 15746326
    JacekCz
    Poziom 42  
    nazwa typu "kłamie", jak chcesz znak to mów znak (zastanów się czy signed, czy unsigned, żeby po zmianie opcji kompilatora nie wyleciało w powietrze.) A jak liczbę (Intxxxx), to dlaczego inicjujesz literkami?


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


    Nie myślałeś o czymś takim?

    Po to zabawa typami, aby rzutowanie było zbędne. Rzutowanie to mina, ukrywa błędy koncepcyjne jakie byś popełnił, nie dawaj zbyt często.
  • #6 15746432
    Andrzej__S
    Poziom 28  
    A nie lepiej używać kwalifikatora __flash. Odczyt danych jest wtedy wygodniejszy, bo nie trzeba używać makr 'pgm_read_xxx()':
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #7 15746529
    INTEII
    Poziom 14  
    Witam,

    JacekCz
    To tylko przykład i nie przywiązywałem wagi czym zainicjuję tablice. Literki można potraktować jak wartości więc sens został zachowany. Ogólnie typy mam podzielone na UIntXX i IntXX oraz UChar i Char.

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

    Otrzymuję ostrzeżenie:
    Warning	1	initialization from incompatible pointer type [enabled by default]...


    Przy okazji zapytam, czy zapisu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Nie dałoby się jakoś uprościć?

    W skrajnym przypadku gdyby nie stosować "typedef" można by zrobić fajnego jamnika:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Andrzej__S
    Twój pomysł jest bardzo fajny pod warunkiem, że dane odczytywane z pamięci programu chciałbym modyfikować. W moim przypadku było by to rozwiązanie mało optymalne (kopiowanie danych do SRAM, a później z SRAM wysyłanie ich na wyświetlacz).
  • #8 15746644
    Andrzej__S
    Poziom 28  
    INTEII napisał:
    Twój pomysł jest bardzo fajny pod warunkiem, że dane odczytywane z pamięci programu chciałbym modyfikować. W moim przypadku było by to rozwiązanie mało optymalne (kopiowanie danych do SRAM, a później z SRAM wysyłanie ich na wyświetlacz).

    To były tylko przykłady, bo skąd mam wiedzieć, co Ty chcesz z tymi danymi robić. Nie bardzo rozumiem, w czym leży problem, żeby je wysyłać bezpośrednio do wyświetlacza. Zasada jest ta sama, jak w przypadku PROGMEM, tylko kod jest czytelniejszy.
REKLAMA