Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 24 kwi 2025, o 08:45


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 18 ] 
Autor Wiadomość
PostNapisane: 14 sty 2014, o 19:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 sty 2014
Posty: 336
Lokalizacja: Grodzisk Mazowiecki
Pomógł: 13

Witam
Próbuje zrealizować pewne zadanie
Chciałbym aby Działania wykonywane w procedurze na zmiennej X były przekazywane do zmiennej programu głównego Pwm

Składnia: [ Pobierz ] [ Ukryj ]
język basic4gl
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


To jest fragment kodu odpowiedzialny za to działanie. Niestety nie działa
Nie jestem pewien czy to tak ma być czy może jednak trzeba użyć np: declare function zamiast declare sub ?

_________________
"Nie programuj w święta - bug się rodzi"



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sty 2014, o 11:24 
Offline
Użytkownik

Dołączył(a): 19 lut 2013
Posty: 26
Pomógł: 2

nie znam tego dialektu ale w basiku sub oznacza procedurę nie mogąca zwracać danych. Trzeba ożyć funkcji np Declare Function Rozjasnic(x As Byte) as byte


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sty 2014, o 12:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 sty 2014
Posty: 336
Lokalizacja: Grodzisk Mazowiecki
Pomógł: 13

Też dochodzę do tego wniosku.
Próbowałem zrobić to jako Declare function w podany przez ciebie sposób
Niestety nie dokońca rozumiem co ma być wtedy w pętli głównej?

_________________
"Nie programuj w święta - bug się rodzi"



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sty 2014, o 16:59 
Offline
Użytkownik

Dołączył(a): 29 lis 2012
Posty: 1074
Lokalizacja: Sochaczew
Pomógł: 21

Po co chcesz upodabniać bascoma do C?
Nie możesz przepisać wartości x do wartości rozjasnic ?
Poza tym zmienne w bascomie są globalne. Tu nie ma zmiennych jak w C.
Robiąc coś na danej zmiennej gdzieś w podprogramie odczytasz to w pętli głównej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sty 2014, o 20:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Domyślnie w Bascomie argumenty do procedur lub funkcji są przekazywane przez referencje czyli przez adres. Oznacza to, że do procedury nie przekazujemy wartości zmiennej tylko jej adres. I wszystkie operacje dokonywane na tej zmiennej wewnątrz procedury są widoczne na zewnątrz np. w pętli głównej. Ten mechanizm jest podobny do wskaźników w C.
Argumenty można też przekazywać poprzez wartość. W tej sytuacji jest tworzona kopia zmiennej i operacje wewnątrz procedury są wykonywane na tej kopii i nie są widoczne na zewnątrz.

Na szybko napisałem malutki programik testowy
Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
język basic4gl
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Zmienna Pwm w kroku pierwszym ma wartość równą zero, ale w kroku drugim już ma wartość jaką przyjęła po modyfikacji w wewnątrz procedury Rozjasnij.

W takiej formie programu wszystkie działania na zmiennej Pwm wewnątrz procedury Rozjasnij są widoczne w pętli głównej.

matrix napisał(a):
Poza tym zmienne w bascomie są globalne. Tu nie ma zmiennych jak w C.

W Bascomie oprócz zmiennych globalnych są również zmienne lokalne czyli tworzone na stosie.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sty 2014, o 20:17 
Offline
Użytkownik

Dołączył(a): 29 lis 2012
Posty: 1074
Lokalizacja: Sochaczew
Pomógł: 21

jacekk232 napisał(a):
W Bascomie oprócz zmiennych globalnych są również zmienne lokalne czyli tworzone na stosie.

Ja tego tak nie traktuję a może raczej nie używam.
Przyjmuję że wszystkie zmienne zadeklarowane na początku mam globalne i w dalszej części programu tak się do nich odnoszę.
Nigdy z tego powodu nie miałem kłopotów.



Ostatnio edytowano 15 sty 2014, o 20:18 przez matrix, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sty 2014, o 20:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 sty 2014
Posty: 336
Lokalizacja: Grodzisk Mazowiecki
Pomógł: 13

Mam osiem zmiennych Pwm1 , Pwm2 ..... Pwm8
Chciałem zadeklarować kilka wspólnych procedur dla tych zmiennych, tak by nie robić podprogramów dla każdej z osobna.
Dla przykładu tutaj była procedura (rozjasnic) którą później mógłbym wykorzystać np:

Składnia: [ Pobierz ] [ Ukryj ]
język basic4gl
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Według podręcznika są dwa warianty gdzie: wariant1 Działania na wew. zmiennych nie są "widoczne na zewnątrz" i wariant2 działania na zmiennych wew. są na bieżąco "widoczne na zewnątrz"
Myślałem że to co pokazałem w pierwszym poście jest wariantem2

Pytałeś dlaczego próbuje upodabniać do C?
Czekam na kaskę a co za tym idzie na książkę Bluebook i wtedy się posypią pytania ale już nie w tym dziale :)
W wolnej chwili odrabiam opuszczone wcześniej lekcje i próbuje zgłębić te deklaracje szczególnie że mam teraz na stole mały projekcik w którym chciałem to wykorzystać.

_________________
"Nie programuj w święta - bug się rodzi"



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sty 2014, o 20:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Jak ja pisałem w Bascomie to też tak robiłem. I pewnie zdecydowana większość ludzi piszących w Bascomie tak robi. Ale nauka C wyrobiła we mnie inne podejście do pisania programów. I teraz jak mam coś napisać w Bascomie to odruchowo stosuję to co nauczyłem się podczas nauki C czyli stosowanie zmiennych lokalnych, dzielenie programu na funkcje itd.

tomson5 to co pokazałeś w pierwszym poście jest właśnie tym wariantem, w którym wszystkie operacje wewnątrz procedury są widoczne na zewnątrz. Jak możesz to pokaż cały kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sty 2014, o 20:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 sty 2014
Posty: 336
Lokalizacja: Grodzisk Mazowiecki
Pomógł: 13

Podczas pisania pojawiły się nowe wątki.

@jacekk232 sprawdziłem twój kod na szybko i okazuje się że coś tam jest zwracane z procedury.
Dokładnie to jest tak

krok1
pwm = 0

krok2
pwm = 1

Natomiast jak wywaliłem z procedury polecenie waitms 100 to w kroku2 pwm = 101
To już wcześniej zaobserwowałem że jeżeli w procedurze na sztywno wpisałem X = 10 to zmienna Pwm też przyjmowała wartość 10
Problem jest taki że pętla For Next nie zachowuje się w taki sam sposób jakby to miało miejsce w podprogramie
Chodzi mi o to że kręci się od 1 do 100 ale nie zwraca wartości X na zewnątrz po każdym kroku tylko na koniec.

uff... mam nadzieje że to rozumiecie :)

_________________
"Nie programuj w święta - bug się rodzi"



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sty 2014, o 20:38 
Offline
Użytkownik

Dołączył(a): 29 lis 2012
Posty: 1074
Lokalizacja: Sochaczew
Pomógł: 21

jacekk232 napisał(a):
teraz jak mam coś napisać w Bascomie to odruchowo stosuję to co nauczyłem się podczas nauki C czyli stosowanie zmiennych lokalnych, dzielenie programu na funkcje itd.

Ja też dzielę program na funkcje.

tomson5 napisał(a):
Chodzi mi o to że kręci się od 1 do 100 ale nie zwraca wartości X na zewnątrz po każdym kroku tylko na koniec.

No bo pętla FOR...NEXT tak się w bascomie zachowuje.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sty 2014, o 20:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

No ale jak chcesz badać ta wartość po każdym kroku? Przecież jak program wpadnie w procedurę a potem do pętli for to będzie w niej "siedział" tak długo aż wykona wszystkie kroki pętli for. Dopiero potem wyskoczy z pętli i z procedury i wróci do pętli głównej. Jeśli chcesz aby zmiana wartości zmiennej była widoczna po każdym kroku to chyba by trzeba było zrezygnować z pętli for i napisac to tak aby procedura Rozjasnij była wywoływana ileś tam razy co np. 100ms. I wtedy po każdym kroku program by wracał do pętli głównej z aktualna wartością zmiennej Pwm.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sty 2014, o 20:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 sty 2014
Posty: 336
Lokalizacja: Grodzisk Mazowiecki
Pomógł: 13

Właśnie tu poległem.
Myślałem że po takiej deklaracji X będzie Jakby tożsame ze zmienną PWM.
Wychodzi jednak na to że zanim pętla For Next nie skończy się nic z procedury nie wychodzi dopiero po skończeniu pętli :/
Pożytek z tego chociaż taki że zrozumiałem co to jest Declare Sub i z czym to się je. Pozostało mi jeszcze declare function.

Dzięki za pomoc

_________________
"Nie programuj w święta - bug się rodzi"



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sty 2014, o 21:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

tomson5 napisał(a):
Myślałem że po takiej deklaracji X będzie Jakby tożsame ze zmienną PWM.

No i tak jest. Jeśli się przekazuje argument przez referencje to zmienna X i zmienna Pwm to to samo.

tomson5 napisał(a):
Wychodzi jednak na to że zanim pętla For Next nie skończy się nic z procedury nie wychodzi dopiero po skończeniu pętli

Ta wartość jest na bieżąco zmieniana ale żeby tą zmianę zobaczyć w pętli głównej to program musi być w pętli głównej. A trafi do niej dopiero wtedy jak pętla for się skończy. Gdybyś tą zmienną odczytywał w przerwaniu od Timera np. co 10ms to na bieżąco byś widział jak zmienia się jej wartość.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sty 2014, o 21:39 
Offline
Użytkownik

Dołączył(a): 29 lis 2012
Posty: 1074
Lokalizacja: Sochaczew
Pomógł: 21

Bo pętla for...next do takich rzeczy nie służy. Nie podam przykładu do jakich rzeczy służy więc nie pytaj.

Wysłane z mojego LG-P760 przy użyciu Tapatalka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sty 2014, o 21:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Tak na szybko napisałem taki przykładzik
Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
język basic4gl
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W procedurze Rozjasnic 20 razy wartość zmiennej X jest zwiększana o 5. A efekt na bieżąco jest widoczny w pętli głównej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sty 2014, o 22:07 
Offline
Użytkownik

Dołączył(a): 29 lis 2012
Posty: 1074
Lokalizacja: Sochaczew
Pomógł: 21

Akurat to jest normalne. Nie używasz pętli for...next. W Twoim przypadku nie potrzeba nawet argumentu w nawiasie. To jest typowe liniowe zachowanie bascoma. Po każdym wykonaniu podprogramu wracasz do pętli głównej więc nie ma w tym nic dziwnego że masz wynik działania na bieżąco.

Wysłane z mojego LG-P760 przy użyciu Tapatalka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 sty 2014, o 22:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Ja wiem, że ta procedura z argumentem jest trochę na wyrost i to samo by się osiągnęło używając zmiennej Pwm wewnątrz procedury. Ja to wiem. Ale chciałem pokazać koledze tomson5, że problemem w jego przykładzie była pętla for.

I chciałem tez pokazać jak to jest z tym przekazywaniem parametrów. Bo jeśli przekażemy zmienną do procedury przez wartość to już ta zmiana nie będzie widoczna na zewnątrz.
Składnia: [ Pobierz ] [ Ukryj ]
język basic4gl
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Oczywiście osoba pisząca w Bascomie zapyta zaraz po co jej takie dziwactwa. Skoro bez tego też działa. Ale kolega tomson5 wspomniał, że przymierza się do zakupu Bluebooka i nauki C. A tam takie rzeczy to normalność. Więc dlaczego by nie spróbować zrozumieć tego jak to jest z tymi argumentami przekazywanymi do procedur i funkcji, siedząc jeszcze w Bascomie. Tym bardziej, że przekazywanie argumentów przez referencje jest podobne do przekazywania argumentów poprzez wskaźniki w C. Jak kolega tomson5 teraz to zrozumie to później będzie mu łatwiej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 sty 2014, o 08:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 sty 2014
Posty: 336
Lokalizacja: Grodzisk Mazowiecki
Pomógł: 13

@jacekk232 świetny przykład. Wczoraj musiałem już odpuścić ale dzisiaj jak wrócę z arbajtu to sprawdzę twój pomysł. Już na oko widzę że jest Ok. Dzięki wielkie za pomoc.


Edit:
Sprawdziłem twój pomysł i wyszło mi coś takiego:

Składnia: [ Pobierz ] [ Ukryj ]
język basic4gl
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


(Pwm Jest zwiększane w stu krokach. Zmieniłem wcześniej było w dwudziestu)
Pojawiła się wymyślona przeze mnie procedura Przerwa
Zastąpiłem w ten sposób znienawidzone przez wszystkich polecenie Wait

Procedura Przerwa wygląda tak:
Składnia: [ Pobierz ] [ Ukryj ]
język basic4gl
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



W przerwaniu od Timera jest zwiększana zmienna Licznik3
Procek kręci się w pętli do chwili gdy warunek if Licznik3 = 100 zostanie spełniony

Teraz myślę jakby tu można regulować sobie tą "przerwę"
Pisząc polecenie w ten sposób:
Przerwa 100 lub coś w tym stylu.


Edit2:

Wymyśliłem Przerwę w ten sposób:

Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
język basic4gl
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Ktoś ma inny pomysł na tą Przerwę ??

_________________
"Nie programuj w święta - bug się rodzi"



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 18 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO