Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

bledy po przejsciu na nowsza wersje Bascom AVR

szeryfff 07 Sty 2010 23:02 2673 11
  • #1 07 Sty 2010 23:02
    szeryfff
    Poziom 24  

    Witam!
    Moj problem polega na tym, ze program, ktory kompilowal sie bez problemu w wersji 1.11.8.5 (chyba cos takiego), nie kompiluje sie w wersji 1.11.9.8.
    Wywala takie bledy:

    Code:
    Error : 213   Line :   223   String expected for assignment [STR(T)]  , in File : L:\bascom\moje programy\TIDv3.2.bas
    
    Error : 31    Line :   223   Invalid datatype [[0011] 200[STR(T)]]  , in File : L:\bascom\moje programy\TIDv3.2.bas
    Error : 213   Line :   223   String expected for assignment [STR(DROGA)]  , in File : L:\bascom\moje programy\TIDv3.2.bas
    Error : 31    Line :   223   Invalid datatype [[0011] 200[STR(DROGA)]]  , in File : L:\bascom\moje programy\TIDv3.2.bas
    Error : 7     Line :   0     IF THEN expected [ 223]  , in File :
    Error : 123   Line :   0     END IF expected  , in File :


    Linijka 223 wyglada tak:
    Code:
    Text = Chr(znak) + Chr(&B0000001) + Format(str(t) , "  ") + Format(str(droga) , "   00")


    Zmienna T to integer, droga to long.

    Jakby ktos mogl mi pomoc to bede wdzieczny.
    Pozdrawiam[/code]

    0 11
  • #2 08 Sty 2010 18:29
    medicb
    Poziom 28  

    Wyszła jeszcze nowsza wersja od tamtych więc może na niej będzie poprawnie, szukaj na stronie prodcenta.

    0
  • #4 08 Sty 2010 21:21
    szeryfff
    Poziom 24  

    Kurcze, z calym kodem moze byc problem, bo nie chcialbym go udostepniac. Po czym wnosisz ze blad mam gdzies powyzej? Zastanawia mnie fakt, ze w starszej wersji bylo oki.

    Jak zrobie cos takiego :
    Dim Tstr as String*3
    Tstr = str(T)
    Text = Chr(znak) + Chr(&B0000001) + Format(Tstr , " ") + Format(str(droga) , " 00")

    to bledu "String expected for assignment [STR(T)]" juz nie ma, no ale nie chce mi sie robic tak w kazdym przypadku, bo jest ich kilka, i powstaja niepotrzebne zmienne.

    0
  • #6 08 Sty 2010 22:00
    szeryfff
    Poziom 24  

    przygotowalem okrojona wersje, w ktorej tez ten blad wystepuje (oczywiscie w starej wersji bez bledu):

    Code:
    'definiowanie procka
    
    $regfile = "m8def.dat"
    $crystal = 8000000

    'konfiguracja portów
    Ddrc.5 = 1 : Sda Alias Portc.5
    Ddrc.4 = 1 : Mrq Alias Portc.4
    Ddrc.3 = 1 : Scl Alias Portc.3

    Config Portd.2 = Input : Portd.2 = 1
    Config Portd.3 = Input : Portd.3 = 1

    Config Timer0 = Counter , Edge = Falling
    Config Timer1 = Timer , Prescale = 64

    Enable Interrupts


    Dim Text As String * 10                                     'przechowuje tekst do wyświetlenia


    Dim T As Integer



    Scl = 1                                                     'ustaw linie SCL w stan wysoki
    Sda = 1                                                     'ustaw linie SCL w stan wysoki
    Mrq = 1                                                     'ustaw linie SCL w stan wysoki
    Wait 1                                                      'czekaj 500ms

    Start Timer0
    Tcnt0 = 0
    T = 0                                                       'wlacza licznik 0
    Do

    Gosub Temperatura

    Loop                                                        'koniec petli


    Temperatura:
       Portc.2 = 0
       Config 1wire = Portb.0                                   '1 czujnik temperatury
       1wreset
       1wwrite &HCC
       1wwrite &H44
       Waitms 150
       1wreset
       1wwrite &HCC
       1wwrite &HBE
       T = 1wread(2)
       T = T * 10
       T = T / 16
       'Stt = Str(t)
       'Stt = Format(stt , "0-0")
       Text = Format(str(t) , "   ")
    Return


    bledy:
    Code:
    Error : 213   Line :   56    String expected for assignment [STR(T)]  , in File : L:\bascom\moje programy\test.bas
    
    Error : 31    Line :   56    Invalid datatype [[0011] 200[STR(T)]]  , in File : L:\bascom\moje programy\test.bas

    0
  • #7 08 Sty 2010 23:11
    mirekk36
    Poziom 42  

    Bascom to nie język C - a ty mu za dużo do myślenia dajesz w tej linijce ;)

    Code:
    Text = Format(str(t) , "   ") 


    tzn jako pierwszy parametr funkcji Format dajesz nie STRING tylko kolejną funkcję w postaci str(t). To może czasem przypadkowo zadziałać i tak może działo się w starszej wersji choć nie było zgodne z opisem działania funkcji w Bascomie

    a tymczasem jeśli zrobisz to prawidłowo np tak:

    Code:
       Dim Text As String * 10
    
       Dim Text1 As String * 10

       Text = Str(t)
       Text1 = Format(Text , "   ")


    czyli najpierw funkcją Str(t) zamienisz zmienną T typu integer do stringa, a potem ten właśnie string podasz jako pierwszy argument(paramtetr) funkcji Format to już wszystko będzie dobrze

    Natomiast gdyby to był język C to mógłbyś nawet coś takiego zrobić ;) :

    Code:
       Text = Format(str( T / 16 ) , "   ")


    widzisz? a tu? w Bascomie ! - hola hola - tak nie można

    0
  • #8 09 Sty 2010 12:43
    szeryfff
    Poziom 24  

    dzieki kolego, chyba masz raje :)

    widze ze znasz sie na bascomie, to moze bedziesz potrafil odpowiedziec mi na jeszcze 2 pytania :)
    1) czy w bascomie jest mozliwe takie dzialanie:
    dim droga as long
    dim droga1 as long

    droga1 = droga/12.54

    bo z moich prob wynika ze nie, i doje pory robilem tak, ze zmnienna droga mnozylem razy 100, i potem dzielilem przez 1254, no ale to sa juz dodatkowe operacje

    2) w jakims tutorialu do Bascom AVR znalazlem opis, ze zmnienna long przechowuje liczby od -2^32 do 2^32-1, natomiast w moim programie, jezeli do zmniennej typu long recznie wpisze wartosc 2000000, to po pewnych operacjach na wyswietlaczu mam zmienna ze znakiem minus (ale nie taka, jaka powinna byc ze znakiem plus).
    czy to wynika z tego, ze zmienna typu long jednak przechowuje mniejsze wartosci, czy moze ja cos robie zle w programie?

    pozdrawiam:)

    0
  • #9 09 Sty 2010 13:56
    mirekk36
    Poziom 42  

    Typy się kłaniają, typy danych, jeśli więc zrobisz tak:

    Code:
    dim droga as long 
    
    dim droga1 as single

    droga1 = droga/12.54


    to powinno zadziałać ;)

    przecież dzielisz nie przez liczbę całkowitą tylko zmiennoprzecinkową, a więc w wyniku też masz dostać zmiennoprzecinkową - dlatego trza wybrać typ single w Bascomie.

    Ale to z kolei spowoduje ci straszny rozrost kodu bo Bascom jak i każdy inny język dorzuci swoje programowe biblioteki dla obsługi liczb zmiennoprzecinkowych.

    Dlaczego czasem lepiej wykonac tych kilka dodatkowych operacji o których pisałeś hyhyhy

    popróbuj to sam ocenisz co i kiedy lepiej zastosować

    0
  • #10 09 Sty 2010 19:18
    szeryfff
    Poziom 24  

    oki, pewnie jest tak jak piszesz :)

    a moze znasz odpowiedz na moje drugie pytanie? :)

    0
  • #11 15 Sty 2010 11:44
    Freddy
    Poziom 43  

    Do d... tutorial, zobacz w helpie do Bascoma.

    Cytat:

    Long (four bytes). Longs are stored as signed 32-bit binary numbers ranging in value from -2147483648 to 2147483647.
    Single. Singles are stored as signed 32 bit binary numbers. Ranging in value from 1.5 x 10^–45 to 3.4 x 10^38
    Double. Doubles are stored as signed 64 bit binary numbers. Ranging in value from 5.0 x 10^–324 to 1.7 x 10^308

    0
  • #12 15 Sty 2010 12:27
    atom1477
    Poziom 43  

    Z tego co pamiętam to BASCOM sie sypie w symulacji programowej podczas operacji na zmiennych typu Long. I pewnie nie zostało to wciąż poprawione. Wiem wiem powinienem ściągnąć nowego BASCOMa.

    0