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.

[AVR][C] - opisy funkcji, dokumentacja itp

mirekk36 01 Cze 2009 12:45 2208 6
  • #1 01 Cze 2009 12:45
    mirekk36
    Poziom 42  

    Witam,

    mam pytanko, bo już mnie czasem szlaczek trafia, - jak czytać tą dokumentację GCC załącząoną w HTML gdy instaluje się AVRGCC ???

    albo może z jakiego innego źródła można mieć na szybko pod ręką normalne, ludzkie opisy - podstawowych bibliotek i standardowych poleceń w GCC dla AVRków oczywiście???

    chodzi mi o to, że np teraz muszę pobawić się trochę łańcuchami wysyłanymi przez UART no i przydałyby się może jakieś standardowe wbudowane funkcje zamiast robić je smamemu

    chodzi mi o takie rzeczy jak:

    int strcmp( const char *s1, const char *s2 );
    int strcasecmp(const char *s1, const char *s2);
    int strncasecmp(const char *s1, const char *s2, size_t n);

    void *memchr( void *s, char c, size_t n );

    i podobne , z różnych plików nagłówkowych nie tylko <string.h>

    tzn do tej pory zwykle grzebię gdzieś po necie i wyrywkowo znajdę jedno czy drugie polecenie a potem szlag mnie trafia, że ono jest od zawsze a ja w kodzie męczyłem się do tej pory z własnoręcznym rzeźbieniem

    reasumując - czy jest gdzieś jakaś dokumentacja , która jasno, prosto i po kolei opisuje biblioteki i ich zawartości - oraz jak korzystać z tych poleceń ???

    bo takie np : void *memchr( void *s, char c, size_t n );
    Zwraca wskaźnik do pierwszego wystąpienia c w pierwszych n bajtach s.

    ale jaki będzie ten wskaźnik gdy nie będzie żadnego wystąpienia c ???

    (jak na razie to pociąć się można - tzn ja ;) - jeśli chodzi o doczytanie się czegokolwiek w helpie GCC - a próbuję czytać index.html z folderu:

    C:\WinAVR-20080610\doc\gcc\HTML\gcc-4.3.0\gcc

    czy to może nie ten help ???)

    0 6
  • Pomocny post
    #2 01 Cze 2009 13:05
    Freddie Chopin
    Specjalista - Mikrokontrolery
  • #3 01 Cze 2009 13:47
    mirekk36
    Poziom 42  

    sorka - no nareszcie - w końcu mam co poczytać - no i ładny i teraz jasny dla mnie jest opis funkcji

    void *memchr( void *s, char c, size_t n );

    dzięki - wgryzam się już w to ;)

    Dodano po 35 [minuty]:

    o kurczę ale mam jeszcze takie "czary-mary" - i nie mogę tego skumać, pomoże ktoś jeszcze ?

    Cytat:
    char * strsep (char **sp, const char * delim)
    Parse a string into tokens.
    The strsep() function locates, in the string referenced by sp, the first occurrence of
    any character in the string delim (or the terminating ’\0’ character) and replaces it
    with a ’\0’. The location of the next character after the delimiter character (or NULL,
    if the end of the string was reached) is stored in sp. An “empty” field, i.e. one
    caused by two adjacent delimiter characters, can be detected by comparing the location
    referenced by the pointer returned in *sp to ’\0’.
    Returns:
    The strsep() function returns a pointer


    to polecenie do parsowania bardzo by mi się przydało ale

    .... co to znaczą te dwie gwiazdki ???? przed sp ?

    próbowałem tak:

    Code:
    char cmdbuf[20];
    
    char cmd[10];
    char sep[1] = {"="};
    UART_getstr(cmdbuf);   

    memcpy(cmd, cmdbuf,10);
    strsep(cmd, sep);
    PRINT(cmd);


    ale eclipse płacze mi że w linijce strsep dzieje się coś takiego:

    Cytat:
    "passing argument 1 of 'strsep' from incompatible pointer type"


    w efekcie nie mogę jakoś wyprintować tego co przed separatorem "="

    0
  • #4 01 Cze 2009 14:22
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Po pierwsze - char sep[1] = {"="}; - string taki ma DWA znaki, bo jeszcze musisz zmieścić '\0'. Proponuję więc tą kwestię zostawić kompilatorowi i wpisać: char sep[] = "=";

    Po drugie - skoro * to wskaźnik, to ** jest wskaźnikiem na wskaźnik [; Anyway - sama zmienna łańcuchowa to już wskaźnik, więc do funkcji przekazujesz po prostu adres takiej zmiennej.

    Zasadniczo - char cmd[10];

    cmd - wskaźnik na pierwszy element (char*)
    &cmd - adres wskaźnika na pierwszy element (char**)

    Dodaj więc owe '&' i gotowe.

    4\/3!!

    0
  • #5 01 Cze 2009 14:35
    mirekk36
    Poziom 42  

    hmmm no tak to wydaje się oczywiste, dzięki ale jednak mała zagwozdka w tym przypadku konkretnym, bo coś takiego nie działa:

    Code:
    char cmd[];
    
    char sep[] = "=";

    strsep(&cmd, sep);


    ale jak zrobiłem tak jak poniżej to działa:

    Code:
    char cmd[];
    
    char sep[] = "=";
    char *wsk;

    wsk = cmd;
    strsep(&wsk, sep);


    z czego to może wynikać?

    0
  • Pomocny post
    #6 01 Cze 2009 15:12
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Wpisując char cmd[]; nie przydzielasz żadnego rozmiaru na zawartość tego łancucha [;

    To o czym pisałem (puste nawiasy) odnosi sie jedynie do sytuacji, gdy nadajesz w tej samej linii wartość początkową i nie będziesz jej zmieniał (lub nigdy łańcuch/tablica nie będzie dłuższa).

    Zaś co do samych wskaźników na wskaźniki to istnieje szansa, że "wprost" nie działa, gdyż tak naprawdę kompilator sobie to optymalizuje i dlatego nie działą z char array[];

    4\/3!!

    0
  • Pomocny post
    #7 01 Cze 2009 15:44
    szelus
    Specjalista - Mikrokontrolery

    Z typami tablicowymi jest trochę "namieszane" w C, a przynajmniej może na to wyglądać, właśnie z uwagi na automatyczne dopasowywanie typów.

    Generalnie:

    Code:

    jakis_typ tab[];
    jakis_typ *wsk;

    tab jest tablicą, czyli ciągiem elementów typu jakis_typ ułożonych w pamięci jeden za drugim. Odwołanie w kodzie do samego 'tab' daje adres tablicy, a właściwie jej pierwszego elementu. Jako takie tab jest wartością takiego samego typu co wartość wsk, ale nie jest tego samego typu, co wsk, bo wsk jest zmienną, a tab tylko wartością.
    Wobec tego zapis &tab nie ma sensu, bo można pobrać adres zmiennej (np. &wsk), ale adres wartości.

    Typ ** oznacza wskaźnik na wskaźnik i w argumentach funkcji jest używany głównie do zwracania wartości wskaźnika (poprzez argument, a nie wartość funkcji).

    0