jak zamienić zmienne między sobą ?

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

jak zamienić zmienne między sobą ?

Post autor: matrix » 25 lis 2009, 11:47

czytałem gdzieś w polskim pliku pomocy do bascoma że można zamienić ze sobą miejscami dwie zmienne, ale teraz nie mogę tego znaleźć, więc pytam.

powiedzmy że mam dwie zmienne typu word zapisane w pamięci ram procesora attiny2313 w konfiguracji:

Kod: Zaznacz cały

dim x as eram word at &h02
dim y as eram word at &h04
jak zamienić wartości tych zmiennych miejscami?
chciałbym żeby to wyglądało tak:

Kod: Zaznacz cały

if przycisk = 0 then    'jeśli nacisnę przycisk to
 
tu chcę zamienić zmienne x i y miejscami

end if
no i oczywiście żeby zapisały się one w pamięci ram procka.

polecenie SWAP nie podmienia mi zmiennych typu word.

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 25 lis 2009, 12:05

Action

Exchange two variables of the same type.


Syntax

SWAP var1, var2

var1 - A variable of type bit, byte, integer, word, long or string.

var2 - A variable of the same type as var1.


After the swap, var1 will hold the value of var2 and var2 will hold the value of var1.
Z tego wynika że zamienia, tylko chyba nigdzie nie mówią że to zamienia zmienne w pamięci. Więc pewnie musisz na początku odczytać te dwie zmienne, zrobić swap i wpisać ponownie.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 25 lis 2009, 12:09

snow pisze:Więc pewnie musisz na początku odczytać te dwie zmienne, zrobić swap i wpisać ponownie.
tyle że juz przy próbie zamiany ze sobą tych dwóch zmiennych bascom wyrzuca mi błąd:

Kod: Zaznacz cały

wrong datatype [56:getclassname]

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 25 lis 2009, 12:18

Być może trzeba zastosować zmienne pośrednie, może muszą być zmienne zwykłe word a nie eram word.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 25 lis 2009, 12:19

snow pisze: być zmienne zwykłe word a nie eram word.
no właśnie na to wychodzi, bo przy próbie zamiany zwykłych zmiennych word żadnego błędu bascom nie wyrzuca. więc jak mam zamianić zmienne typu word zadeklarowane jako eram word?

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 25 lis 2009, 12:22

zadeklaruj sobie pomocnicze zmienne np. x1 i y1 i zrób:

x1=x
y1=y

i dopiero swap, chociaż w sumie wtedy swap jest niepotrzebny bo robisz:

x1=y
y1=x

i zapisujesz x1 pod adres x a y1 pod y.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 25 lis 2009, 13:05

snow pisze:zadeklaruj sobie pomocnicze zmienne np. x1 i y1 i zrób:

x1=x
y1=y
no i też nie mogę. zadeklarowałem sobie zmienne w ten sposób:

Kod: Zaznacz cały

Dim dlugimpdol As Eram Word At &H02
Dim dlugimpgora As Eram Word At &H04
dim nowadlugimpdol as eram word at &h06
dim nowadlugimpgora as eram word at &h08
podczas zapisu danych do tych zmiennych mam tak:

Kod: Zaznacz cały

pulsein dlugimp , Pinb , 7 , 1       
       dlugimpgora = dlugimp 
       nowadlugimpdol = dlugimp

pulsein dlugimp , Pinb , 7 , 1       
       dlugimpdol = dlugimp 
       nowadlugimpgoral = dlugimp
a chcąc je podmienić napisałem tak:

Kod: Zaznacz cały

if przycisk = 0 then
gosub zamiana
end if

zamiana:
waitms 100
dlugimpgora = nowadlugimpdol
dlugimpdol = nowadlugimpgora
waitms 100
return
i bascom wyrzuca mi błąd:
source variable does not match to target variable

co z tłumaczenia na goole translator pokazało mi:
Zmienna źródła nie pasuje do docelowej zmiennej
Ostatnio zmieniony 25 lis 2009, 13:07 przez matrix, łącznie zmieniany 1 raz.

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 25 lis 2009, 13:07

Przecież ci pisałem żeby były word a nie eram word. Możesz też zrobić rzutowanie typów ale nie wiem czy takie coś w Bascomie występuje

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 25 lis 2009, 13:33

snow pisze:Przecież ci pisałem żeby były word a nie eram word.
ale ja musze mieć eram, bo one muszą na stałe być wpisane w program.
zaraz wypróbuję przypisanie zmiennych eram do zwykłych word i spowrotem przypisanie ich do eram.

EDIT:
teoretycznie po przypisaniu zmiennych z pamięci ram do zwykłych zmiennych word, a następnie zamianie tych zmiennych i ponownym wpisaniu tych zmiennyc do eram jakos to działa, ale... niestety nie mogę sobie na to pozwolic, ponieważ juz w tej chwili program zajmuje 97% pamięci procka, więc dodanie dwóch zmiennych typu word nie wchodzi w grę. takze chyba zostałem na niczym.

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 25 lis 2009, 13:41

Może pora zmienić język na jakiś wydajniejszy ;) lub procesor na większy.

ODPOWIEDZ