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

C/Codevision - wskaźniki - co robię źle?

tomhandyman 15 Wrz 2008 12:23 1521 6
  • #1 5537035
    tomhandyman
    Poziom 13  
    Zadanie polega na zapisie "x" danych z portu szeregowego do 16-to bitowych rejestrów, oraz na odczycie tychże rejestrów. Żeby to uprościć chciałem wykorzystać wskaźniki. Program się wykłada w poleceniu "wsk_rejestr=&rejestr;" komunikatem "Error: a value of type 'unsigned int [255] *' can't be assigned to an entity of type 'unsigned int *' ". Jak prawidłowo można wykorzystać wskaźnik w tym celu?

    
    typedef unsigned char  u8;
    unsigned int rejestr[255];
    unsigned int *wsk_rejestr;
    
    
    void zapisz_dane_do_rejestru(u8 adres startowy,u8 ilosc)
    {
    unsigned char x;
    wsk_rejestr=&rejestr;
    for (x=0;x<ilosc;x++)
        {
        //     rejestr[adres startowy+x]= rx_buffer[10+(x<<1)];
        //    rejestr[adres startowy+x]=(rejestr[adres startowy]<<8)+ramka_in[11+(x<<1)];
        }
    }
    
    void odczytaj_dane_z_rejestru(u8 adres startowy,u8 ilosc)
    {
    unsigned char x;
    tx_buffer[2]=(ilosc<<1);
    tx_wr_index=3;
    for (x=0;x<ilosc;x++)
        {
        //  tx_buffer[tx_wr_index++]= (unsigned char)(rejestr[adres startowy+x] >> 8);
        //  tx_buffer[tx_wr_index++]= (unsigned char)(rejestr[adres startowy+x]&0xFF);
        }
    }
    


    Czy ktoś mógłby pomóc?

    Proszę łaskawie zapoznać się , z p.11.1 regulaminu - tytuł poprawiłem.
    [zumek]
  • #3 5537208
    tomhandyman
    Poziom 13  
    Działa. Nasunęło mi się drugie pytanie, jeśli tablica składa się z elementów typu int, czy odczytując fizyczny adres pierwszego elementu mogę zmieniać w pamięci RAM tą tablicę poprzez zmianę komórek 8-io bitowych bezpośrednio wpisując daną. Zdaję sobie sprawę z ryzyka, że można w ten sposób zmienić inne zmienne. Jeśli pierwszy element tablicy jest adresem, jak go odczytać jako adres pierwszego bajtu (nie zmiennej)?
  • #6 5537387
    szelus
    Poziom 34  
    
    adres_lo = (unsigned int)przyklad;
    

    Adres jako taki, jest typem wskaźnikowym, innym niż int, więc bez jawnej konwersji kompilator będzie się "czepiał".

    P.S.
    Freddie Chopin napisał:
    adres zmiennej to adres nizszego bajtu.


    Pojęcie "niższy" zabrzmiało mi tu trochę niejednoznacznie. Domyślam się, że miałeś na myśli właśnie pierwszy, w sensie pierwszy w pamięci. Osobiście staram się używać właśnie określenia "pierwszy bajt zmiennej", jeżeli mam na myśli lokalizację w pamięci oraz pojęcia "(naj)młodszy bajt zmiennej", jeżeli mam na myśli najmniej znaczący bajt.
    Nie czepiam się ;), tylko chciałem uświadomić początkującemu koledze istnienie takiego niuansu...
REKLAMA