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

Problem z obliczeniem CRC

gafek 18 Gru 2009 17:57 1112 2
  • #1 7405939
    gafek
    Poziom 17  
    Mam problem z kompilacją jednej z funkcji. Funkcja oblicza sumę kontrolną nagłówka IP, ale to najmniej ważne.

    
    unsigned short netChecksum(void *data, unsigned short len)
    {
        register unsigned long sum = 0;
    
        for (;;) {
            if (len < 2)
                break;
    		
    		sum += *((unsigned short *)data);
    	             data+=2;
                              len -= 2;
        }
        if (len)
            sum += *(unsigned char *) data;
    
        while ((len = (unsigned short) (sum >> 16)) != 0)
            sum = (unsigned short) sum + len;
    
        return (unsigned short) sum ^ 0xFFFF;
    }
    


    kiedy kompiluję to w tej funkcji otrzymuję błąd:
    expression must be a pointer to a complete object type

    ze wskazaniem na błąd w : data+=2;

    niestety nie znam się aż tak bardzo na wskaźnikach, a ten komunikat niewiele mi mówi. Może ktoś pomoże ??

    Pracuje na Codevision AVR

    Dzięki !
    Andrzej
  • #2 7406082
    boogdan
    Poziom 15  
    Cytat:
    expression must be a pointer to a complete object type
    -> z tego co kompilator wypisał, to wychodzi ze nie dodasz dwa do wskaźnika na void, co mnie dziwi, powinien przecież przesunąć go o dwa bajty.
    zrzutuj wskaźnik na int8 albo uint8 i wtedy dodaj dwa, lub na int16 czy uint16 i dodaj jeden.
    coś mniej więcej takiego:
    data = (unsigned char *)data + 2;
  • #3 7406875
    Dr.Vee
    VIP Zasłużony dla elektroda
    Mnie z kolei to nie dziwi, bo w C arytmetyka na wskaźnikach polega na zmianie adresu w pamięci o wielokrotość rozmiaru danego typu. Kompilator musiałby znać rozmiar typu void, a ten jest niezdefiniowany.

    Przekaż do funkcji wskaźnik const uint8_t* data i wszystko będzie ok.
REKLAMA