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

BASCOM i operator AND - błąd podczas kompilacji.

JarekPrzybyl 15 Kwi 2015 11:30 873 8
  • #1 14618890
    JarekPrzybyl
    Poziom 15  
    Pomóżcie koledzy, bo pomroczność jasna ogarnęła albo mnie, albo kompilator Bascoma.

    Taki fragment kodu:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Czemu to się właściwie nie chce skompilować? Odpowiedź kompilatora brzmi
    "104 3 parameters expected" a ja za diabła nie wiem, jaki trzeci paramettr miałby tu brakować. Wykonuję operację AND na dwóch bitach: bicie zmiennej byte oraz osobnym bicie miganie. Całość ma uzależniać stan LED'a sygnalizującego pewien proces od bitu bezpośrednio wskazującego fakt pojawienia się tego procesu oraz zmiennej bitowej "miganie" przełączanej w przerwaniu, a powodującej, że LED ma migać. Miało to być eleganckie i proste, a tymczasem nie chce się skompilować. Dlaczego?

    Kiedy z czystej ciekawości usunąłem negację, zostawiając samo "Led_open = Zawor.1 And Miganie", komunikat kompilatora się zmienił na "Invalid datatype". Samo led_open=zawor.1 działa dobrze.
  • #2 14618939
    GarrutoSan
    Poziom 29  
    Mam jedno pytanie:

    Czy ten kod, który próbujesz kompilować, ma wyglądać tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Czy tak:

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #3 14618945
    JarekPrzybyl
    Poziom 15  
    Jak to pierwsze, drugiego zapisu szczerze mówiąc nie rozumiem.

    Jeśli chodzi Ci o kolejność wykonywania działań, to pożądany przeze mnie efekt ma być (not zawor.1) and miganie, w sumie to jest też dobre pytanie, jaka jest kolejność wykonywania działań przez bascomowy kompilator. Ale to nie zmienia zasadniczego problemu, po skasowaniu "not" program się też nie kompiluje
  • #4 14619165
    yokoon
    Poziom 29  
    Witam.
    Operatory logiczne są stosowane przy operacjach na bajtach, bitach, zmiennych liczbowych.
    Nie na operacjach zmiennych tekstowych.
    Poczytaj w help.
  • #5 14619171
    GarrutoSan
    Poziom 29  
    Mi bardziej chodziło o ilość zadań w jednym wierszu.
    Wiele czasu minęło od zabawy z tymi rzeczami, więc już się nie udzielam :)
  • #6 14619229
    JarekPrzybyl
    Poziom 15  
    @yokoon - ale tu przecież nie ma zmiennej tekstowej! Jest odwołanie do konretnego bitu zmiennej typu byte.

    @Garruto - ok, rozumiem, ale tu nawet jeśli wyeliminuję NOT, dalej jest błąd, więc to raczej nie ten problem.
  • #7 14619270
    yokoon
    Poziom 29  
    Np.Dim Zawor As Byte otóż dla tej zmiennej podana jest tylko jej wielkość jako bajtowa, nie ma konkretnej wartości.

    Przykładowo: Zawor = Zawor And &B00111111
    To jest tylko przykład musiał byś jakoś dostosować do swoich potrzeb.
  • #8 14619299
    Konto nie istnieje
    Konto nie istnieje  
  • #9 14619329
    JarekPrzybyl
    Poziom 15  
    Naprawdę zakładasz, że ja tej zmiennej nigdzie nie nadaję wartości? :)
    Kod, który podałem to fragment pokazujący istotę problemu, miałem wrażenie, że jest to na tyle oczywiste, że nie muszę o tym jakoś szczególnie wyraźnie pisać...


    Ale do rzeczy: z tego, co udało mi się ustalić, problemy tutaj są dwa:
    Pierwszy to przypisanie wyniku takiej operacji logicznej wprost do portu. Z absolutnie dla mnie niezrozumiałej przyczyny Bascom na to nie pozwala, jeśli to samo zrobię z inną zmienną typu bit umieszczoną zamiast odwołania do portu, kod zaczyna się kompilować (z poprawką na problem drugi, o którym niżej)
    Drugi problem to kolejność działań: najwyraźniej kompilator nie rozumie zapisu

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Trzeba to robić na dwa kroki:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Zatem z jednej eleganckiej linijki robią się trzy:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Dodano po 3 [minuty]:

    @niveasoft - właśnie chciałem uniknąć stosowania instrukcji warunkowych, bo raz, że chodzi o coś, co będzie się wykonywać w przerwaniu, dwa, że całość musze upchnąć do attiny i każdy bajt na wagę złota.
    Jak się jednak okazuje, kompilator bascoma pracuje tak przedziwnie, że trzy proste operacje logiczne kompiluje do większego rozmiaru niż If-Then-Else. Nic, będzie z warunkami, dzięki za pomoc!
REKLAMA