eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikas->tab[i]
Ilość wypowiedzi w tym wątku: 11

  • 1. Data: 2013-05-17 05:18:35
    Temat: s->tab[i]
    Od: "Zbynio" <...@d...pl>

    Witam,
    AvrStudio AVR
    Czy taka operacja może się źle skompilować ?

    Mam strukturę i do niej wskaźnik i w niej tablice i różne takie

    i gdzieś w kodzie robie sobię

    while (i--) {
    s->tab[i] = s->costam[i];

    albo coś podobnego tyle, że

    uint8_t *ptr = (uint8_t *) &struktura;

    i dalej to samo

    while (i--) {
    s->tab[i] = ptr[i];

    Czy ma to prawo nie działać ? Tak jakby się dane nie przepisywały.


  • 2. Data: 2013-05-17 08:00:23
    Temat: Re: s->tab[i]
    Od: Zbych <a...@o...pl>

    W dniu 2013-05-17 05:18, Zbynio pisze:
    > Witam,
    > AvrStudio AVR
    > Czy taka operacja może się źle skompilować ?
    >
    > Mam strukturę i do niej wskaźnik i w niej tablice i różne takie
    >
    > i gdzieś w kodzie robie sobię
    >
    > while (i--) {
    > s->tab[i] = s->costam[i];
    >
    > albo coś podobnego tyle, że
    >
    > uint8_t *ptr = (uint8_t *) &struktura;
    >
    > i dalej to samo
    >
    > while (i--) {
    > s->tab[i] = ptr[i];
    >
    > Czy ma to prawo nie działać ? Tak jakby się dane nie przepisywały.

    Tak, jak coś spie@#$@#sz. Słyszałeś o czymś takim jak debuger?


  • 3. Data: 2013-05-17 08:41:44
    Temat: Re: s->tab[i]
    Od: Marcin <m...@o...pl>

    On May 17, 5:18 am, "Zbynio" <i...@d...pl> wrote:
    > Witam,
    > AvrStudio AVR
    > Czy taka operacja może się źle skompilować ?
    >
    > Mam strukturę i do niej wskaźnik i w niej tablice i różne takie
    >
    > i gdzieś w kodzie robie sobię
    >
    > while (i--) {
    > s->tab[i] = s->costam[i];
    >
    > albo coś podobnego tyle, że
    >
    > uint8_t *ptr = (uint8_t *) &struktura;
    >
    > i dalej to samo
    >
    > while (i--) {
    > s->tab[i] = ptr[i];
    >
    > Czy ma to prawo nie działać ?  Tak jakby się dane nie przepisywały.

    Przy zalozeniu, ze "s" to wskaznik na strukture a nie sama struktura,
    powinno byc ok. Na szybko sobie sprawdzilem w Keilu na inny procesor,
    czy z punktu widzenia C jest ok.
    Wersja "s->tab[i] = ptr[i];" troche optymistycznie przyjmuje, ze adres
    poczatku struktury jest tozsamy z poczatkiem pierwszej tablicy w niej
    zawartej (jesli jest pierwszym elementem struktury). Tu bedzie
    probowac przepisywac kolejne bajty z poczatku struktury do tablicy,
    bedacej gdzies w tej strukturze. Jak dla mnie to ryzykowne, pozniejsze
    zmiany w typedef structury na pewno cos popsuja.
    Marcin


  • 4. Data: 2013-05-17 09:06:51
    Temat: Re: s->tab[i]
    Od: "Zbynio" <...@d...pl>


    "Marcin" <m...@o...pl> wrote in message
    news:2b2eefb0-906c-4404-b58d-f29a0422569c@m4g2000vbr
    .googlegroups.com...

    >> Przy zalozeniu, ze "s" to wskaznik na strukture a nie sama struktura,
    >> powinno byc ok. Na szybko sobie sprawdzilem w Keilu na inny procesor,
    >> czy z punktu widzenia C jest ok.
    >> Wersja "s->tab[i] = ptr[i];" troche optymistycznie przyjmuje, ze adres
    >> poczatku struktury jest tozsamy z poczatkiem pierwszej tablicy w niej
    >> zawartej (jesli jest pierwszym elementem struktury). Tu bedzie
    >> probowac przepisywac kolejne bajty z poczatku struktury do tablicy,
    >> bedacej gdzies w tej strukturze. Jak dla mnie to ryzykowne, pozniejsze
    >> zmiany w typedef structury na pewno cos popsuja.

    No właśnie. Co do panowania nad strukturą to nad nią panuję, bo mam ją po to
    żeby była to taka swoista "lookup table". Le to jedno miejsce nie działa i
    już wczoraj się dziwiłem co jest nie tak, robiłem podwójne inicjowaie
    wskaźników, dla pewności.
    Czy znaczy mam nie przyjmować do wiadomości, że adres struktury to początek
    pierwszego elementu? To jest wtgodne, bo raz rozmawiam ze struktuą, albo
    przez strukturę po elementach

    s->tab1[]
    s->tab2[]....

    a raz traktuję ją jako ciągły obszar jak kawałek ramu liczony od wskaśnika
    ustawionego na początek. Wszędzie mi działa tylko to kopiowanie nie działa.

    Ale jak wpiszę:

    s->tab[i] = ptr[0x98]; czy inny 0x to dane w tab[i] są dobre :-) Te co
    siedzą tam względem ptr. Tak jakby zmiennej nie brał pod uwagę. Zupełnie
    irracjonalna sprawa.


  • 5. Data: 2013-05-17 09:19:40
    Temat: Re: s->tab[i]
    Od: "J.F" <j...@p...onet.pl>

    Użytkownik "Zbynio" napisał w wiadomości
    >Czy taka operacja może się źle skompilować ?

    Wszystko sie moze zle skompilowac jak jest blad kompilatora :-)
    Czas zajrzec w wygenerowany kod w assemblerze.

    >Mam strukturę i do niej wskaźnik i w niej tablice i różne takie
    >i gdzieś w kodzie robie sobię

    >while (i--) {
    >s->tab[i] = s->costam[i];

    Poprawnie.

    >albo coś podobnego tyle, że
    >uint8_t *ptr = (uint8_t *) &struktura;
    >i dalej to samo
    >while (i--) {
    >s->tab[i] = ptr[i];

    tez poprawnie.

    >Czy ma to prawo nie działać ? Tak jakby się dane nie przepisywały.

    A "i" jest prawidlowe ? Nie traktowane jako ujemne ?

    J.


  • 6. Data: 2013-05-17 09:30:33
    Temat: Re: s->tab[i]
    Od: ajt <a...@u...com.pl>

    W dniu 2013-05-17 09:06, Zbynio pisze:
    > a raz traktuję ją jako ciągły obszar jak kawałek ramu liczony od
    > wskaśnika ustawionego na początek. Wszędzie mi działa tylko to
    > kopiowanie nie działa.

    Pokazujesz tylko fragmenty kodu, oczekując podpowiedzi, co jest źle.
    Tymczasem błąd tkwi pewnie w kodzie którego nie pokazałeś :)
    --
    Pozdrawiam
    Andrzej
    www.radom.ws


  • 7. Data: 2013-05-17 09:42:18
    Temat: Re: s->tab[i]
    Od: Marcin <m...@o...pl>

    > No właśnie. Co do panowania nad strukturą to nad nią panuję, bo mam ją po to
    > żeby była to taka swoista "lookup table". Le to jedno miejsce nie działa i
    > już wczoraj się dziwiłem co jest nie tak, robiłem podwójne inicjowaie
    > wskaźników, dla pewności.
    > Czy znaczy mam nie przyjmować do wiadomości, że adres struktury to początek
    > pierwszego elementu? To jest wtgodne, bo raz rozmawiam ze struktuą, albo
    > przez strukturę po elementach
    >
    > s->tab1[]
    > s->tab2[]....
    >
    > a raz traktuję ją jako ciągły obszar jak kawałek ramu liczony od wskaśnika
    > ustawionego na początek. Wszędzie mi działa tylko to kopiowanie nie działa.
    >
    > Ale jak wpiszę:
    >
    > s->tab[i] = ptr[0x98]; czy inny 0x to dane w tab[i] są dobre :-) Te co
    > siedzą tam względem ptr. Tak jakby zmiennej nie brał pod uwagę. Zupełnie
    > irracjonalna sprawa.

    Czy w strukturze oprocz tablic sa jeszcze jakies inne dane ?
    najlepiej podaj tu definicje calej struktury, bedzie wiadomo co w niej
    siedzi.
    Takie moje gdybanie bez znajomosci kodu. Na AVRy dosc dawno nie
    pisalem, ze moze kompilator cos optymalizuje ( struct packed ??? ale
    zastanawiam sie, czy packed dla 8 bitowej platformy ma znaczenie ??) .

    Tablice zawarte w strukturze sa typu uint8_t ??

    Sprobowalem taki kawalek kodu ale __UWAGA__ nie w AvrStudio !!
    /*********************************/
    typedef struct tdAvrStruct {
    UINT8 i;
    UINT8 tablica[10];
    UINT16 tablica16 [10];
    UINT16 licznik;

    } AVR_STRUCT;


    AVR_STRUCT myStruct, *pmyStruct;
    UINT16 j;


    pmyStruct = &myStruct;

    for (j=0; j < 10; j++)
    pmyStruct->tablica[j] = j;

    for (j=0; j y 10; j++)
    pmyStruct->tablica16[j] = 3 * pmyStruct->tablica[j];
    /*********************************/

    i po wykonaniu mam w tablica16 trzykrotnie zwiekszone wartosci
    wczesniej zainicjalizowane w tablica.

    mozesz tez sprobowac zamiast :

    while (i--) {
    s->tab[i] = ptr[i];

    czegos takiego:
    while (i--){
    s->tab[i] = * (ptr + i );
    }
    teoretycznie to samo jak ptr[i], ale moze faktycznie kompilator cos
    miesza?
    Marcin



  • 8. Data: 2013-05-17 22:03:09
    Temat: Re: s->tab[i]
    Od: "Zbynio" <...@d...pl>


    "ajt" <a...@u...com.pl> wrote in message
    news:5195dc98$0$1224$65785112@news.neostrada.pl...
    >W dniu 2013-05-17 09:06, Zbynio pisze:
    >> a raz traktuję ją jako ciągły obszar jak kawałek ramu liczony od
    >> wskaśnika ustawionego na początek. Wszędzie mi działa tylko to
    >> kopiowanie nie działa.
    >
    > Pokazujesz tylko fragmenty kodu, oczekując podpowiedzi, co jest źle.
    > Tymczasem błąd tkwi pewnie w kodzie którego nie pokazałeś :)

    void test(void) {

    size_t i;

    uint8_t buf[32];

    uint8_t *ptr = (uint8_t *)&mystruct;

    eeprom_read_block((void*)&buf[0], (const void*)(EEDATA), 34);

    for (i=buf[0]; i<buf[1]; i++) {

    f->A[i] = ptr[ buf[2 + i] ];

    }

    }

    W eepromie siedzą numery póll struktury, które mam sobie pobrać.

    adres 0 to początek

    adres 1 ilosc

    2..34 dane. I dane tam są


  • 9. Data: 2013-05-17 22:10:50
    Temat: Re: s->tab[i]
    Od: "Zbynio" <...@d...pl>


    "Zbynio" <...@d...pl> wrote in message
    news:51968cfd$0$1248$65785112@news.neostrada.pl...

    Tam jest buf[34], teraz ręcznie to przepisałem z błędem

    void test(void) {

    size_t i;

    uint8_t buf[34];

    uint8_t *ptr = (uint8_t *)&mystruct;

    eeprom_read_block((void*)&buf[0], (const void*)(EEDATA), 34);

    for (i=buf[0]; i<buf[1]; i++) {

    f->A[i] = ptr[ buf[2 + i] ];

    }

    }



  • 10. Data: 2013-05-17 22:30:31
    Temat: Re: s->tab[i]
    Od: "Zbynio" <...@d...pl>


    "Zbynio" <...@d...pl> wrote in message
    news:51968eca$0$1257$65785112@news.neostrada.pl...
    >

    Aż wstyd się przyznać :-)

    W #define EEDATA pomyliłem adres w eepromie i patrzyłem na to 100 razy, a
    były 2 cyferki zamienione miejscami i czytał z obszaru eepromu gdzie były
    zera :-) Oh LOL :-)
    2 dni na akie coś :-)

strony : [ 1 ] . 2


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: