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

Programowanie C Wskaźnik na Tablicę wskaźników w pamięci programu

Tomcio7 07 Lis 2011 20:38 2255 15
REKLAMA
  • #1 10114063
    Tomcio7
    Poziom 17  
    Posty: 297
    Pomógł: 8
    Ocena: 19
    Witam

    Chcę aby tablice Z1...Z5 były zapisane w pamięci programu, różnią się rozmiarem pomiędzy sobą:

    const char Z1[] __attribute__((__progmem__)) = {...};
    ...
    const char Z5[] __attribute__((__progmem__)) = {...};


    Tutaj mam tablice wskaźników również zapisaną w pamięci programu
    const char* TABLICA_WSKAZNIKOW[] __attribute__((__progmem__)) = {
    Z1, Z2, Z3, Z4, Z5
    };

    Pytanie:
    W jaki sposób dostać wskaźnik np. na tablicę Z2?

    char *wskaźnik = &(TABLICA_WSKAZNIKOW[1]); //nie działa..
  • REKLAMA
  • #2 10114071
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    a jak odczytuje się dane z pamięci programu?
  • REKLAMA
  • #3 10114101
    Tomcio7
    Poziom 17  
    Posty: 297
    Pomógł: 8
    Ocena: 19
    pgm_read_byte(adres)

    odczytać dane z tablic Z1..Z5 prosto.

    Pytanie
    Jak dostać wskaźnik do Z2 przy użyciu TABLICY_WSKAŹNIKÓW
  • #4 10114142
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    sam sobie odpowiedziałeś na pytanie.
  • REKLAMA
  • #5 10114157
    Pituś Bajtuś
    Poziom 28  
    Posty: 934
    Pomógł: 137
    Ocena: 10
    Duet AVR + avr-gcc jest zbyt kaleki żeby bez bólu zębów zrealizować to zadanie.
  • REKLAMA
  • #6 10114164
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Głupoty wygadujesz
  • #7 10114188
    Tomcio7
    Poziom 17  
    Posty: 297
    Pomógł: 8
    Ocena: 19
    char *wsk = pgm_read_byte(&TABLICA_WSKAZNIKOW[1]);

    W takim razie to u mnie nie działą
  • #8 10114197
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Bo to nie działa na etapie definiowania wskaźnika.

    Skąd kompilator ma znać adres tych zmiennych?
  • #10 10114233
    Tomcio7
    Poziom 17  
    Posty: 297
    Pomógł: 8
    Ocena: 19
    Freddie Chopin napisał:
    To wskaźniki mają rozmiar jednego bajtu! Łał!

    4\/3!!


    Podziękował
  • #12 10123736
    Tomcio7
    Poziom 17  
    Posty: 297
    Pomógł: 8
    Ocena: 19
    Dla operacji
    char *wsk = pgm_read_dword(&TABLICA_WSKAZNIKOW[adres]);

    otrzymuję ostrzeżenie:
    "initialization makes pointer from integer without a cast"

    Mam problem z wyeliminowaniem ostrzeżenia.
  • #13 10123989
    szulat
    Poziom 23  
    Posty: 647
    Pomógł: 24
    Ocena: 110
    Tomcio7 napisał:
    Dla operacji
    char *wsk = pgm_read_dword(&TABLICA_WSKAZNIKOW[adres]);

    otrzymuję ostrzeżenie:
    "initialization makes pointer from integer without a cast"

    Mam problem z wyeliminowaniem ostrzeżenia.

    to najpierw przeczytaj to ostrzeżenie :)

    char *wsk = (char*)pgm_read_dword(&TABLICA_WSKAZNIKOW[adres]);
  • #14 10124834
    Tomcio7
    Poziom 17  
    Posty: 297
    Pomógł: 8
    Ocena: 19
    to już dawno zrobiłem, tylko rzutowanie prowadzi do takiego ostrzeżenia:

    warning: cast to pointer from integer of different size

    a tego już obejść nie potrafię.
  • Pomocny post
    #15 10125770
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2205
    A od kiedy to wskaźniki na AVR mają wielkość podwójnego słowa (32-bity)?
    Może kolega np. zainteresuje się sizeof(typ)?
  • #16 10126046
    Tomcio7
    Poziom 17  
    Posty: 297
    Pomógł: 8
    Ocena: 19
    i wszystko jasne :)

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy sposobu uzyskania wskaźnika do tablicy Z2, która jest częścią tablicy wskaźników zapisanej w pamięci programu na platformie AVR. Użytkownik zdefiniował tablice Z1...Z5 jako stałe w pamięci programu z użyciem atrybutu __progmem__. W odpowiedziach poruszono kwestie dotyczące odczytu danych z pamięci programu oraz problemów z rzutowaniem wskaźników. Użytkownicy sugerowali użycie funkcji pgm_read_byte oraz pgm_read_dword do uzyskania wskaźników, a także zwrócili uwagę na różnice w rozmiarze wskaźników na platformie AVR. W końcu, użytkownik zrozumiał problem związany z rzutowaniem wskaźników i ich rozmiarami.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA