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

Jak usunąć to ostrzeżenie? Program w Keilu.

Marek_Gorecki 25 Paź 2018 16:57 756 8
REKLAMA
  • #1 17517459
    Marek_Gorecki
    Poziom 16  
    Posty: 494
    Pomógł: 2
    Ocena: 30
    WItam,

    Napisałem w Keilu program i mam taki fragment:

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


    Zmienne są tak zdefiniowane:

    uint8_t cnt;
    volatile uint8_t Received[Max_Rxd1_size];

    Wszystko działa mi prawidłowo, ale kompilator daje mi ostrzeżenie tego typu:

    ../Src/main.c(225): warning: #223-D: function "strlen" declared implicitly
    cnt= strlen(Received);

    Jak mozna sobie z tym poradzić?
  • REKLAMA
  • #2 17517488
    ex-or
    Poziom 28  
    Posty: 785
    Pomógł: 147
    Ocena: 151
    brakuje
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Ponadto strlen zwraca wartość o typie size_t czyli bliżej mu do unsigned int więc za chwilę możesz mieć kolejny warning
  • REKLAMA
  • #3 17517516
    Marek_Gorecki
    Poziom 16  
    Posty: 494
    Pomógł: 2
    Ocena: 30
    Dodałem #include <string.h>

    Ale teraz, chyba tak jak mówisz nie ma już warningu, lecz jest bład:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #4 17517590
    ex-or
    Poziom 28  
    Posty: 785
    Pomógł: 147
    Ocena: 151
    Czy tablica koniecznie musi być volatile?

    Druga rzecz: domyślnie typ char zdaje się jest unsigned, ale jeśli została ustawiona opcja --signed_chars to będzie kolejna niezgodność.
  • #5 17517618
    Marek_Gorecki
    Poziom 16  
    Posty: 494
    Pomógł: 2
    Ocena: 30
    Zmienna Received jest wpisywana w przerwaniu, więc musi być volatile.
    Mógłbym ją kopiować do normalnej zmiennej tuż przed uzyciem funkcji strlen , ale to chyba droga bardzo siermiężna.

    Nie da się inaczej?
    Chyba lepiej będzie samemu napisać tą funkcję stlen, bo ta jest mocno chimeryczna.
  • Pomocny post
    #6 17517690
    Konto nie istnieje
    Poziom 1  
  • #7 17518159
    Marek_Gorecki
    Poziom 16  
    Posty: 494
    Pomógł: 2
    Ocena: 30
    Dziekuję.
    Zrobiłem strlen((const char *)Received);
    I teraz nie ma warninga.
    Może na wszelki wypadek, przed tą instrukcją zatrzymać na chwilę przerwania?
  • #8 17518258
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #9 17519126
    Marek_Gorecki
    Poziom 16  
    Posty: 494
    Pomógł: 2
    Ocena: 30
    Nie wiem gdzie w Keilu jest taki przełącznik C/C++.
    Jest pole w którym mam zaznaczone C99 Mode.
    Więc chyba kompiltor kompiluje w C.

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik napotkał ostrzeżenie kompilatora w programie napisanym w Keilu, związane z użyciem funkcji `strlen` na tablicy `Received`, która jest zdefiniowana jako `volatile uint8_t`. Po dodaniu nagłówka `#include `, ostrzeżenie zniknęło, ale pojawił się błąd związany z niekompatybilnością typów. Użytkownik dowiedział się, że `strlen` wymaga wskaźnika do typu `const char *`, co można rozwiązać poprzez rzutowanie: `strlen((const char *)Received)`. Zwrócono również uwagę na ryzyko związane z używaniem `strlen` w kontekście przerwań, sugerując, że warto rozważyć zatrzymanie przerwań przed wywołaniem tej funkcji, aby uniknąć błędów w przypadku zmiany zawartości tablicy.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA