Skocz do zawartości

Pseudolosowe przyporządkowanie wartości zmiennym


Pomocna odpowiedź

K.G. A po resecie uC ci się wyniki nie powtarzały? Dziwne bo używasz tego nieszczęsnego RND i nie zapisujesz nic w EEPROMIE?

A co do mojego kodu ,który niby faworyzuje wartość zmiennej "a" czyli 1 to tak naprawdę wynika z tego tylko tyle ,że na pewno wartość 1 przy pierwszym naciśnięciu przycisku się z permutuje ale potem będą pod zmienną "a" się kryć inne wartości (nie wiadomo jakie).

K.G. A po resecie uC ci się wyniki nie powtarzały? Dziwne bo używasz tego nieszczęsnego RND i nie zapisujesz nic w EEPROMIE?

Program jest tak przygotowany, aby mógł losować różne permutacje, ale po ponownym włączeniu pewnie pojawią się te same dane, co na początku po wcześniejszym włączaniu. Jeśli chcesz, aby po każdym włączeniu były inne permutacje musisz zapisywać pamięć EEPROM. Możesz też wykorzystać jakieś szumy lub coś podobnego, o czym wspominał BlackJack. Jednak liczba tych permutacji jest skończona, więc za którymś razem musi się powtórzyć, któreś dopasowanie (jest 8! możliwych sposobów).

Znalazłem w swoim programie błąd! A ptrzecież proiłem żeby sprawdzić mój program

If Pind < 255 OR Pina < 15 Then 'jeżeli zostanie naciśnięty któryś z przycisków. (Przyciski będą zwierłay
                               'do masy a stan spoczynkowy pinów będzie wynosił Portd = &B11111111 i 
                               'Porta = &Bxxxx1111 - tu gdzie x to i tak nie ważne)
Incr Pomoc                       ' to z wielką częstotliwością będzie zmieniać się wartość zmiennej 
If Pomoc = 7 Then Pomoc = 0      ' pomoc w przedziale od 0 do 6
Blok = 0
Else                             'gdy w końcu przycisk zostanie zwolniony
If Blok = 0 Then                 'tutaj taki bit pomocniczy( gdy już nie będe chciał aby się zmienne
                                'permutowały to ustawie go na 1 i w ten sposób to zablokuje)
Select case pomoc                'w zależności od wartości zmiennej "pomoc" zostają zamienione
case 0:                          ' wartości poszczególnych zmiennych
pomoc =a: a = b : b = pomoc    
Case 1:
pomoc=a : a = c : c = pomoc
Case 2:
pomoc=a : a = d : d = pomoc
Case 3:
pomoc=a : a = e : e = pomoc
Case 4:
pomoc=a : a = f : f = pomoc
Case 5:
pomoc =a: a = g : g = pomoc
Case 6:
pomoc =a : a = h : h = pomoc
Blok = 1
End If
End Select                       'koniec
End If

Otóż proszę zwrócić uwagę na zmienną bitową "Blok". Musi być tak ustawiona aby program mógł tylko 1 raz wykonać permutacje po zwolnieniu przycisku! Co gorsza kompletnie źle napisałem fragmenty bezpośrednio odpowiadające za permutacje! Powinno być pomoc = a (nie a = pomoc!)

[ Dodano: 25-02-2012, 19:58 ]

A teraz jeszcze najważniejsze. Jeśli na prawdę chcecie mi pomóc to proszę sprawdzić mi tylko poniższy kod. Udało mi się zrobić to na zmiennej tablicowej w taki sposób że "losują" się 2 parametry (parametr pomoc1 przez zwykłą ikrementacje a parametr pomoc2 przez zmniejszanie wartości o 2). Parametr pomoc1 służy do odczytania jednej wartości ze zmiennej tablicowej a parametr pomoc2 do odczytania drugiej (służą jako adresy do kolejnych komórek zmiennej tablica) . Następnie ulegają one permutacji i ponownie ładowane są do zmiennej tablica.

Czy w poniższym programie nie mam błędów? Szczególnie proszę zwrócić uwagę na deklaracje zmiennej tablicowej (Dim Tabela(8) As Byte ). Czy dobrze ją zadeklarowałem? Czy dane do zmiennej tablicowej mają być na początku czy na końcu programu?

Oto kod:

Tabela:                                'tutaj wpisuje wartości do zmiennej tablicowej
Data 1,2,3,4,5,6,7,8

'tutaj wszystkie konfiguracje portów itp.

Dim Tabela(8) As Byte                  'tutaj zadeklarowałem zmienną tablicową
'tutaj zadeklarowanie innych zmiennych których uzyłem

Do
If Pind < 255 OR Pina < 15 Then         'jeżeli nacisnę przycisk  
   pomoc1 = pomoc1 + 1                 'to z wielką częstotliwością pomoc1 będzie zwiększał się o 1
   pomoc2 = pomoc2 - 2                 'a pomoc2 bedzie zmniejszać się o 2
   If Pomoc1 = 9 Then Pomoc1 = 1       'tutaj ustalam granicę gdyż wartości tych zmiennych muszą mieścić
   If Pomoc2 = 0 Then Pomoc2 = 8       'się w zbiorze liczb <1;8>
   Blok = 0                            'odblokowuje możliwość permutacji
Else
   If Blok = 0 Then                    'jeżeli możliwość permutacji jest odblokowana
      PomocA = Tabela(pomoc1)          'to pobieram wartość ze zmiennej tablicowej z pod adresu ustalonego 
      PomocB = Tabela(pomoc2)          'przez zmienną pomoc1 i pomoc2 (pomoc1 i pomoc2 mają wartości "losowe")

      pomoc = PomocA                   'zwykła procedura zamiany wartości zmiennych PomocA o PomocB           
      PomocA = PomocB                  
      PomocB = pomoc

      Tabela(pomoc1) = PomocA          'Ponowne wgranie już zpermutowanych wartości do zmiennych
      Tabela(pomoc2) = PomocB          ' tablicowych
      Blok = 1                         'blokada dalszych permutacji (po naciśnięciu ponownym przycisku
    End If                             'permutacja zostanie odblokowana)
End If
Loop
End

Tablica jest dobrze zadeklarowana. Natomiast w dwóch pierwszych liniach stworzyłeś stała tablicę o tej samej nazwie, co zmienna tablicowa i w dodatku ustawiłeś ją w złym miejscu (powinna być po instrukcji End). Domyślam się, że chciałeś zainicjalizować tablicę, ale tego nie robi się w ten sposób tylko podobnie jak ze zmiennymi przykładowo:

Tabela(1) = 1
Tabela(2) = 2
Tabela(3) = 3

Takie stałe tablicowe używa się na przykład do dekodowania kodu BCD lub obsługi multipleksowej matrycy LED.

  • Pomogłeś! 1

 'tutaj wszystkie konfiguracje portów itp.

   Dim Tabela(8) As Byte                  'tutaj zadeklarowałem zmienną tablicową
   'tutaj zadeklarowanie innych zmiennych których uzyłem

   Do
   If Pind < 255 OR Pina < 15 Then         'jeżeli nacisnę przycisk 
       pomoc1 = pomoc1 + 1                 'to z wielką częstotliwością pomoc1 będzie zwiększał się o 1
       pomoc2 = pomoc2 - 2                 'a pomoc2 bedzie zmniejszać się o 2
       If Pomoc1 = 9 Then Pomoc1 = 1       'tutaj ustalam granicę gdyż wartości tych zmiennych muszą mieścić
       If Pomoc2 = 0 Then Pomoc2 = 8       'się w zbiorze liczb <1;8>
       Blok = 0                            'odblokowuje możliwość permutacji
   Else
       If Blok = 0 Then                    'jeżeli możliwość permutacji jest odblokowana
          PomocA = Tabela(pomoc1)          'to pobieram wartość ze zmiennej tablicowej z pod adresu ustalonego
          PomocB = Tabela(pomoc2)          'przez zmienną pomoc1 i pomoc2 (pomoc1 i pomoc2 mają wartości "losowe")

          pomoc = PomocA                   'zwykła procedura zamiany wartości zmiennych PomocA o PomocB           
          PomocA = PomocB                 
          PomocB = pomoc

          Tabela(pomoc1) = PomocA          'Ponowne wgranie już zpermutowanych wartości do zmiennych
          Tabela(pomoc2) = PomocB          ' tablicowych
          Blok = 1                         'blokada dalszych permutacji (po naciśnięciu ponownym przycisku
        End If                             'permutacja zostanie odblokowana)
   End If
   Loop
   End

Tabela(1) = 1
Tabela(2) = 1
Tabela(3) = 1
Tabela(4) = 1
Tabela(5) = 1
Tabela(6) = 1
Tabela(7) = 1
Tabela(8) = 1

Czy teraz jest dobrze, bo nie mam wolnego uC żeby to sprawdzić?

Chyba raczej tak:

   'tutaj wszystkie konfiguracje portów itp.

       Dim Tabela(8) As Byte                  'tutaj zadeklarowałem zmienną tablicową
       'tutaj zadeklarowanie innych zmiennych których uzyłem

   Tabela(1) = 1
   Tabela(2) = 2
   Tabela(3) = 3
   Tabela(4) = 4
   Tabela(5) = 5
   Tabela(6) = 6
   Tabela(7) = 7
   Tabela(8) = 8

       Do
       If Pind < 255 OR Pina < 15 Then         'jeżeli nacisnę przycisk
           pomoc1 = pomoc1 + 1                 'to z wielką częstotliwością pomoc1 będzie zwiększał się o 1
           pomoc2 = pomoc2 - 2                 'a pomoc2 bedzie zmniejszać się o 2
           If Pomoc1 = 9 Then Pomoc1 = 1       'tutaj ustalam granicę gdyż wartości tych zmiennych muszą mieścić
           If Pomoc2 = 0 Then Pomoc2 = 8       'się w zbiorze liczb <1;8>
           Blok = 0                            'odblokowuje możliwość permutacji
       Else
           If Blok = 0 Then                    'jeżeli możliwość permutacji jest odblokowana
              PomocA = Tabela(pomoc1)          'to pobieram wartość ze zmiennej tablicowej z pod adresu ustalonego
              PomocB = Tabela(pomoc2)          'przez zmienną pomoc1 i pomoc2 (pomoc1 i pomoc2 mają wartości "losowe")

              pomoc = PomocA                   'zwykła procedura zamiany wartości zmiennych PomocA o PomocB           
              PomocA = PomocB                 
              PomocB = pomoc

              Tabela(pomoc1) = PomocA          'Ponowne wgranie już zpermutowanych wartości do zmiennych
              Tabela(pomoc2) = PomocB          ' tablicowych
              Blok = 1                         'blokada dalszych permutacji (po naciśnięciu ponownym przycisku
            End If                             'permutacja zostanie odblokowana)
       End If
       Loop
       End
  • Pomogłeś! 1
Natomiast w dwóch pierwszych liniach stworzyłeś stała tablicę o tej samej nazwie, co zmienna tablicowa i w dodatku ustawiłeś ją w złym miejscu (powinna być po instrukcji End).

Powyższy cytat mnie skłonił żeby umieścić te zmienne na końcu.

Ale teraz już chyba rozumiem o co chodzi.

Jeśli mam stałą tablicę w formie:

Tabela:

Data : itp.

to umieszczam ją za poleceniem end.

A jeśli mam zmienną tablicową to wartości zamieszczam na początku w formie

Tabela(1) = tu jakaś wartość

Tabela)2) = jakaś wartość

itp.

Tak. Elementy tablicy wypełniasz jak przypisanie danych do zmiennych.

Data: zza End czytasz instrukcją read. Też się da wypełnić, ale inaczej.

Natomiast w dwóch pierwszych liniach stworzyłeś stała tablicę o tej samej nazwie, co zmienna tablicowa i w dodatku ustawiłeś ją w złym miejscu (powinna być po instrukcji End).

Powyższy cytat mnie skłonił żeby umieścić te zmienne na końcu.

Źle przeczytałeś moją wypowiedz ewidentnie widać, że dotyczyła stałej tablicy, którą zrobiłeś na początku programu 😉 .

Z stałej tablicy możesz odczytywać także dzięki Lookup(indeks , nazwa_tablicy).

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...