Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[bascom] odczyt z tablicy wartości byte do zmiennej word

manekinen 07 Oct 2009 17:24 3551 9
  • #1
    manekinen
    Level 29  
    Hej, problem jest następujący. Mam długą tablicę, 99% znajdujących się w niej danych to są dane 1-bajtowe, ale kilka musze mieć 2-bajtowych. Więc aby zapisać w tablicy taką wartość 2-bajtową musze ją oznaczyć znakiem "%". Ok. Żeby ją odczytać, musze oczywiście odczytywać do zmiennej word. Ale gdy przychodzi do odczytania wartości 1-bajtowej, to w zmiennej word pojawiają się krzaki. Obojętne czy użyje word, long, czy integer, cała zmienna w krzakach.

    Problem można rozwiązać oznaczając każdą wartość w tablicy jako 2-bajtową, ale cała tablica zajmie dwa razy więcej miejsca w pmięci pełniąc taką samą funkcję.

    W helpie nie ma nic na ten temat (czyt. nie znalazłem), nie widziałem nigdy aby istniało jakiekolwiek maskowanie przy odczycie z tablicy lub cokolwiek innego.

    Pozdrawiam Paweł.

    przykład
    
    Dim Zmienna As Word
    ...
    Zmienna = Lookup(offset , Tab_znaki)
    ...
    Data 255 , 2 , 4 , 8 , 255
    Data 1023% , 2 , 4 , 8 , 1023%
    
  • #2
    User removed account
    Level 1  
  • #3
    manekinen
    Level 29  
    Quote:
    Bo wszystkie wartości w tablicy odczytywanej poleceniem Lookup muszą być tego samego typu.

    Mógłbyś podać źródło tej informacji? Czy po prostu wiesz to z autopsji? W helpie nic taiego nie napisano przy poleceniu lookup, zgrabnie ominięto ten problem tworząc dwie różne zmienne i odczytując byte do byte a word do word.

    Quote:
    Niezbyt to pocieszające bo nawet dla małych wartości musisz użyć zmiennej typu Word

    Zmienna word to nie problem bo to tylko dodatkowy bajt w ramie, ale chodzi o to że wszystkie dane bajtowe w tablicy musze zapisywać jako word co powiększa ją dwukrotnie bez potrzeby :(

    Myślałem żeby zamienić polecenie lookup na loadlabel i cpeek, ale wyliczanie adresu w tablicy będzie tak skomplikowane (przez to że raz byte a raz word) że prościej ominąć cały problem na siłe dodatkowym warunkiem i flagą.

    Cóż, dzięki.
  • Helpful post
    #4
    User removed account
    Level 1  
  • Helpful post
    #5
    ZbeeGin
    Level 39  
    LOOKUP nie wie jakiego typu są dane, które ma przeglądać. Równie dobrze możesz mieć tablicę słów (Word) a odczytywać ją bajt po bajcie przez LOOKUP, gdzie zmienną do której zwraca ona wartość będzie Byte. To otwiera pewne możliwości:

    1. Normalnie dane są jednobajtowe. Dane dwubajtowe, są w stałych i określonych miejscach oraz jest ich bardzo mało. Zatem można tak sparametryzować LOOKUP by w wyjątkowych pozycjach czytało słowa a nie bajty. To tylko kwestia właściwego ułożenia danych i ich ilości, która musi niestety być parzysta.

    2. Normalnie dane są jednobajtowe. Dane dwubajtowe są mniejsze niż 32767. Zgodnie z koncepcją kol. atom1477 czytasz bajty. Jeśli wartość jest słowem to najstarszy bit w nim jest ustawiony. Co warunkuje w programie także odczyt następnej danej (offset+1, z równoczesnym przesunięciem wskaźnika by ją przeskoczyć). Po prostym poskładaniu masz daną typu Word. Potem ten bit maskujesz bo jest zbędny, np. RESET Zmienna.15. Ten tryb nadaje się prawie wyłącznie do odczytu sekwencyjnego. No i dane muszą być zapisane jako Big endian by nie komplikować zbytnio.
  • #6
    manekinen
    Level 29  
    Atom1477 wrote:
    Skąd Lookup miał by wiedzieć jaką długość mają kolejne elementy?

    No tak, nie wie... ale dane zapisane są bajt po bajcie... więc jeśli lookup czytając do zmiennej typu word, automatycznie liczy sobie wszystko podwójnie, i wie gdzie zaczyna się tablica, to czemu prostu nie odczyta dwóch kolejnych bajtów? Logicznie rzecz biorąc powinien wylądować po prostu dwa razy dalej w tablicy, ale nic nie stoi na przeszkodzie aby te dane odczytać prawda? A odczytuje same krzaki. Nie żebym próbował komuś wmówić coś, po prostu nie rozumiem tego :)

    ZbeeGin wrote:
    Zatem można tak sparametryzować LOOKUP by w wyjątkowych pozycjach czytało słowa a nie bajty.

    Obliczanie adresu tych dwu-bajtowych danych raczej jest bezsensowne, trzeba by było stworzyć dodatkową tablicę która by mówiła nam którą wartość trzeba czytać jako bajt a którą jako słowo. Albo zrobić to na warunku. Tak czy siak wszystko komplikując.

    Dzięki za pomoc, w zasadzie już sobie poradziłem inaczej, ponieważ tych dwu-bajtowych jest tylko kilka, to niech stracę, na warunku zrobiłem, porównuje adres i jeśli trzeba odczytać dwu-bajtową to odczytuje w osobnej funkcji z osobnej tablicy do zmiennej typu word a potem sobie działam dalej. Śmieszne jest to że wcale nie musze odczytywać całej wartości, bo i tak za każdym odczytem wykorzystuje tylko jeden bit.
  • #7
    User removed account
    Level 1  
  • #8
    manekinen
    Level 29  
    No dobra ale to nie jest wytłumaczenie...
    atom1477 wrote:
    Czyli z dwóch danych robi Ci się jedna, większa, czyli krzak.

    Ale chcę wiedzieć jak to działa. Jak napisałem wyżej, dane które są w tablicy, _fizycznie_ są zapisane w pamięci flash bajt po bajcie i to parametr adres który używamy z poleceniem lookup przesuwa wskaźnik na kolejne bajty w pamięci flash. Przecież taki tablicowy word wygląda tak samo w pamięci flash jak tablicowy byte (tyle że są to dwa bajty następujące po sobie). Lookup w obydwu przypadkach nie wie co odczytuje, zna tylko adres w którym zaczyna się tablica w pamięci flash. Jak napisał ZbeeGin, (jeśli dobrze zrozumiałem) można odczytać z tablicy wartość word do zmiennej byte, najpierw starszą część a przesuwając offset o komórkę do przodu odczytać młodszą i sobie to skleić. Więc czemu nie działa to odwrotnie, czemu lookup do zmiennej word nie może odczytać dwóch następujących po sobie bajtów w pamięci...

    Dodano po 11 [minuty]:

    Nie sprawdzałem jak by się zachowało cpeek, to jest praktycznie to samo co lookup tyle że nie podajemy adresu w tablicy tylko adres w pamięci flash i z tego co widze można użyć zmiennej word, long, (kompilator nie wywala błędu). I tu nie widze problemu, czemu y nie dać mu adresu tablicy i odczytać dwóch wartości bajtowych w jedną zmienną word... lookup ma problemy z tym.
  • #9
    User removed account
    Level 1  
  • #10
    manekinen
    Level 29  
    atom1477 wrote:
    Otóż ten "adres" nie przesuwa o bajty, ale o długość zmiennej. Czyli jak masz Word to przesuwa o 2 bajty.

    Ale zawsze jest to wielokrotność 8 bitów. I przypuśćmy że nie jest istotne czy przesunie o długość zmiennej byte czy o długość zmiennej word...
    atom1477 wrote:
    Jeżeli więc odczytujesz do zmiennej typu Word, to Lookup zawsze będzie odczytywało po 2 bajty.

    ...ale i tak trafi na kolejne dane które mają ład i skład, więc czemu nie może tego normalnie przepisać do zmiennej word cokolwiek by to nie było :D Tylko bierze jakieś dane z kosmosu. O to mi chodzi. :D

    Dodano po 2 [minuty]:

    Quote:
    Podopisuj wszystkim wartościom „%” i odczytuj do zmiennej Word i problemu nie będzie.

    No i tak też pisałem na początku, ale długość tablicy to 440 bajtów (a jeszcze będzie nieco dłuższa), zamieniając wszystkie bajty na słowa podwoi się do kilobajta zaraz...