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

Język C dla Atmeli: ograniczenie ilości wpisów w tablicy const char

18 Paź 2014 03:02 1785 12
REKLAMA
  • #1 14051095
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #2 14051102
    kspro
    Poziom 27  
    Posty: 509
    Pomógł: 158
    Ocena: 107
    Jeśli wkleiłeś fragment prawdziwego źródła to sprawa jest chyba prosta: zamiast cmd3[ ] dopisałeś omyłkowo po raz drugi cmd2[ ] i naprawdę trudno powiedzieć dlaczego kompilator nie wywala tego jako błąd i co w tej sytuacji robi z tablicą cmds[ ], czy skraca jej długość, czy wsadza w nią jakieś głupie adresy, czy jeszcze coś innego.
  • REKLAMA
  • #3 14051175
    Konto nie istnieje
    Konto nie istnieje  
  • #4 14052321
    vonar
    Poziom 28  
    Posty: 690
    Pomógł: 151
    Ocena: 30
    W tej wersji:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    teoretycznie powinno być wszystko w porządku. Bez pełnych źródeł trudno powiedzieć, w czym tkwi problem.

    A to:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    nie ma prawa zadziałać z strcmp_P (i prog_char tu nie pomoże).
  • #5 14059401
    Konto nie istnieje
    Konto nie istnieje  
  • #6 14059693
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Stawiam albo na jakiś subtelny błąd w efektach atrybutu PROGMEM, albo na błędne działanie funkcji GetToken(). Spróbuj wyświetlić tekst polecenia przed porównaniem go z tablicą nazw poleceń.

    Co do obsługi poleceń z argumentami - sporo łatwiej robi się to przy zastosowaniu notacji polskiej odwrotnej - trzymasz mały stosik argumentów liczbowych i wykonujesz polecenia na ostatnich z nich - żadnej kontekstowości, rozpoznawania poprawności argumentów itp. zbędnych wodotrysków powodujących komplikację kodu.
  • REKLAMA
  • #7 14059836
    Konto nie istnieje
    Konto nie istnieje  
  • #8 14059999
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    Czyściłeś cały projekt?
  • #9 14060476
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • Pomocny post
    #10 14060511
    vonar
    Poziom 28  
    Posty: 690
    Pomógł: 151
    Ocena: 30
    Oj! Rzeczywiście, przecież tablica cmds też była PROGMEM, a nie była właściwie odczytywana (a palnąłem, że „powinno działać” :oops: ).

    PosepnyCzerep napisał:
    pytanie więc brzmi czy cmd? znajdują się w RAMie czy też w pamięci programu.
    Tylko w pamięci programu.

    vonar napisał:
    Ciekawe dlaczego to składowanie tablicy w pamięci programu nie działa właściwie. Może chodzi o to, że to jest jakby tablica znaków w tablicy znaków?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Jest tutaj odczyt cmds z pamięci RAM zamiast pamięci programu.

    Możesz zostawić cmds z PROGMEM i poprawić TranslateCommand:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #11 14060791
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #12 14060815
    vonar
    Poziom 28  
    Posty: 690
    Pomógł: 151
    Ocena: 30
    PosepnyCzerep napisał:
    To nic nie daje.
    Fakt, zapomniałem "&". Powinno być:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Działanie dla dwóch elementów tablicy to rzeczywiście bardzo ciekawy przypadek.
  • #13 14060850
    Konto nie istnieje
    Konto nie istnieje  

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik dostosowuje program z książki "AVR Praktyczne projekty" dotyczący USART-DMA, napotykając problem z ograniczeniem liczby wpisów w tablicy komend. Po dodaniu większej liczby komend do tablicy, program nie rozpoznaje ich podczas działania. W odpowiedziach zasugerowano, że problem może wynikać z błędnego użycia atrybutu PROGMEM oraz funkcji strcmp_P. Po poprawkach, w tym zmianie definicji tablicy komend, problem został rozwiązany, a użytkownik uzyskał poprawne działanie programu. Kluczowe okazało się zrozumienie, jak PROGMEM wpływa na przechowywanie danych w pamięci programu oraz RAM.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA