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

GCC-AVR -> wskaźnik do struktury

kedzi1 28 Cze 2008 22:23 2470 2
  • #1 5295212
    kedzi1
    Poziom 18  
    Piszę program w AVRStudio + WinAVR i mam problem. Kiedy deklarujemy funkcję i w jej argumentach wejściowych znajduje się wskaźnik np. do tabeli jest OK, ale jeżeli jest to wskaźnik do struktury kompilator wywala błędy.

    Przykład:

    
    #include <io.h>
    #include <iom32.h>
    
    struct bufor {
    unsigned char ramka[10];
    unsigned short rozmiar;
    };
    
    unsigned char Bufor2[100];
    struct bufor Bufor1;
    
    void funkcja1(struct bufor* Bufor1)
    {
    Bufor1.rozmiar=0;
    }
    
    void funkcja2(unsigned char* Bufor2)
    {
    Bufor2[10] = 10;
    }
    
    int main(void)
    {
    Bufor1.ramka[2]=100;
    
    funkcja1(Bufor1);
    funkcja2(Bufor2);
    
    while (1) {}
    }
    


    Podczas kompilacji błąd wygląda tak:

    
    ../structtest.c: In function 'funkcja1':
    ../structtest.c:16: error: request for member 'rozmiar' in something not a structure or union
    ../structtest.c: In function 'main':
    ../structtest.c:29: error: incompatible type for argument 1 of 'funkcja1'
    


    Pomocy. Muszę przekazać funkcji wskaźnik do struktury i nie wiem jak :(
  • Pomocny post
    #2 5295308
    BoskiDialer
    Poziom 34  
    ponieważ operujesz wskaźnikiem na strukturę musisz wskaźnik wyłuskać (komunikat błędu linia 16) i dopiero możesz się odwoływać. Masz dwie opcje:
    1/ (*Bufor1).rozmiar=0;
    2/ Bufor1->rozmiar=0;

    Przy stosowaniu operatora [] nie trzeba wyłuskiwać wskaźnika, gdyż zapis a[b] (lukier składniowy) jest przekształcany do *(a+b):
    
    	u8 i = 2;
    	char* ch = "test";
    	char ch2 = i[ch]; // kompiluje się i jest równoważne ch[i]
    

    Jednocześnie oznacza to, że tablica i wskaźnik na element bazowy tablicy są nie rozróżnialne, nie trzeba pobierać adresu na pierwszą komórkę tablicy jeśli wymagany jest wskaźnik - tablica jest wskaźnikiem na pierwszy element.
    przy wywołaniu funkcja1() musisz jednak uzyskać adres poprzez zapis funkcja1(&Bufor1) (komunikat błędu linia 29), gdyż nie operujesz tablicą(wskaźnikiem), a strukturą.
  • #3 5295454
    kedzi1
    Poziom 18  
    No tak! Podstawy C się kłaniają :P. Wielkie dzięki za pomoc! Program już działa.
REKLAMA