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

[bascom] nazwa etykiety jako zmienna

mpo 06 Lut 2012 11:49 1936 11
REKLAMA
  • #1 10503207
    mpo
    Poziom 12  
    Takie zagadnienie:
    Mam trzy zestawy danych oznaczone etykietami.
    Jak w kodzie przekazać nazwę etykiety jako zmienną i czytać dane wskazywane przez tą etykietę?

    Czyli chciałbym uzyskać taki efekt:

    
    dim etykieta as string*2
    dim x as byte
    dim y as byte
    dim z as byte
    
    select case z
    case 1:etykieta="E1"
    case 2:etykieta="E2"
    case 3:etykieta="E3"
    end select
    restore etykieta
    for y=1 to 5
    read x
    print x
    next
    end
    
    E1:
    Data &H00 , &H01 , &HEF , &H02 , &H03
    E2:
    Data &H0A , &H01 , &H02 , &H03 , &HFF
    E3:
    Data &H0F , &H01 , &HFD , &H02 , &H03
    


    Oczywiście polecenie 'restore etykieta' nie zadziała, ale jak uzyskać podobny efekt?
  • REKLAMA
  • #2 10503655
    Mundi1970
    Poziom 24  
    Jak to było?.. "Programy się kompiluje, a nie komplikuje." :)
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #3 10503906
    mpo
    Poziom 12  
    Mundi1970 napisał:
    Jak to było?.. "Programy się kompiluje, a nie komplikuje." :)
    Kod: text
    Zaloguj się, aby zobaczyć kod


    No dobra, w takim prostym przykładzie który podałem, to ma sens. :spoko:
    A jeżeli takich etykiet będę miał kilkaset, to co? Pisać takiego 'select case' na kilkaset pozycji?
    Ogólne pytanie jest takie, czy da się przekazać zmienną w jakiś sposób pozycję z której ma czytać polecenie 'read'?
    Taki odpowiednik niedziałającego polecenia 'restore zmienna_wskazujaca_na_etykiete'
  • REKLAMA
  • #4 10504338
    Mundi1970
    Poziom 24  
    Myślę że bardziej pomocny będzie LookUp, zamiast Restore, Read i 100 etykiet.

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #5 10504450
    mpo
    Poziom 12  
    Mniej więcej w ten sposób mam to teraz zrobione, ale jest to hmmm... nieestetyczne.
    Jeżeli szukane dane znajdują się na końcu tablicy, to za każdym razem musi być niepotrzebnie czytana prawie cała zawartość tablicy (czy przez 'read' czy 'lookup').
    Jeżeli wykonuje się to kilkadziesiąt razy na sekundę, to przy dużych tablicach procesor może się nie wyrobić.
    No i w momencie, gdy liczba bajtów w wierszu nie jest stała, to rozwiązanie powyższe odpada.
  • REKLAMA
  • #6 10504560
    Mundi1970
    Poziom 24  
    Oj chyba nie wiesz jak Lookup działa ;). Do Lookup przekazujesz dwa parametry, gdzie pierwszy to przesunięcie danych, a drugi adres danych. Do adresu danych dodawane jest przesunięcie, a następnie zostaje pobrana dana. Czas pobrania pierwszego elementu jest taki sam, jak dla tysięcznego elementu.
  • #7 10505383
    mpo
    Poziom 12  
    Zasugerowałem się funkcją lookdown, bo też ją używam. :oops:
    Faktycznie lookup nie będzie czytał całej tabeli.
    Ale problem z różnymi długościami wierszy pozostaje.

    No i moje generalne pytanie też bez odpowiedzi.
  • #8 10506406
    SylwekK
    Poziom 32  
    Wydaje mi się, że ten problem z długością wierszy nie będzie tu przeszkadzał. Skoro w jednej pętli zdecydowałeś się przestawiać początek tablicy to wnioskuję, że za każdym razem pobierasz taką samą ilość danych.
    Aha, zawsze można zrobić dodatkową tablicę, w której deklarujesz ile zmiennych do pobrania jest w konkretnej linii.
    Najlepiej jakbyś przedstawił do czego chcesz to w praktyce wykorzystać.
  • #10 10508262
    mpo
    Poziom 12  
    SylwekK napisał:
    Wydaje mi się, że ten problem z długością wierszy nie będzie tu przeszkadzał. Skoro w jednej pętli zdecydowałeś się przestawiać początek tablicy to wnioskuję, że za każdym razem pobierasz taką samą ilość danych.
    Aha, zawsze można zrobić dodatkową tablicę, w której deklarujesz ile zmiennych do pobrania jest w konkretnej linii.
    Najlepiej jakbyś przedstawił do czego chcesz to w praktyce wykorzystać.


    Łączę się z urządzeniem i wysyłam uniwersalne zapytanie o typ urządzenia i dostaję odpowiedź np E12, E33, E175, itd.
    Każdy typ urządzenia posiada specyficzny zestaw poleceń (bajty o określonej wartości), które urządzenie akceptuje i są one umieszczone w tabeli.
    Dlatego chciałbym na podstawie pierwszej odpowiedzi (zapisanej w jakiejś zmiennej) ustawić wskaźnik na odpowiedni zestaw.

    Cytat:

    Na Twoje generalne pytanie jest odpowiedź: LOADLABEL


    Ale LOADLABEL również jako argument przyjmuje nazwę etykiety a nie zmienną zawierającą nazwę.
  • #11 10508328
    Konto nie istnieje
    Poziom 1  
  • #12 10514334
    SylwekK
    Poziom 32  
    mpo napisał:
    Łączę się z urządzeniem i wysyłam uniwersalne zapytanie o typ urządzenia i dostaję odpowiedź np E12, E33, E175, itd.


    No to pozostaje Ci tylko select case + restore (co wydaje mi się najczytelniejszym rozwiązaniem)
    Można też ze zmiennych, które odczytujesz pozbyć się pierwszej literki i zamienić resztę na liczbę , którą traktujesz jako mnożnik dla lookup tylko że...
    w takim wypadku w każdej linii DATA musi być tyle samo danych i numeracja "etykiet" musi być co 1 nawet jak dana kombinacja nie występuje.
REKLAMA