Skocz do zawartości

Nietypowe deklaracje zmiennych


Pomocna odpowiedź

Napisano

Witam wszystkich;

Na dniach postanowiłem przygotować pakiet algorytmów które umożliwią mi łatwiejsze poruszanie się pomiędzy pętlami w programie. 

Dla przykładu jako pierwszy z nich przygotowałem sobie "one shota" typu HiB (high bit). Algorytm generuje jednorazowe przejście wartości binarnej 010 po pojawieniu się na wejściu cl_hib wartości 1. algorytm nie reaguje na wartość 0. 

W czym rzecz? Otóż algorytm działa prawidłowo, ale nie wiem jak zamknąć w tej samej linijce jego składni tych samych nazw powtarzających się zmiennych, tak aby kiedy się powtórzą w kolejnych HiB nie wpływały na siebie.

bool d1 = 1;
bool d2 = 0;
bool cl_hib_1 = 0; // HighBit wejście clok one shot
bool hib_1 = 0; //HighBit wyjście one shot

void setup() {}

void loop() {

if(cl_hib_1 & d2){hib_1=0; d1=0;} else{d1=1; d2=0;} if(cl_hib_1 & d1){hib_1=1; d2=1;}

}

Czyli jak zrobić, aby wywalić d1 i d2 z samej góry, oraz zadeklarować jedynie w samej linijce algorytmu HiB? Rozchodzi się o to, aby w przypadku ponownego wklejenia linijki nie wprowadzać do układu kolejnych wartości zmiennych np. d3 i d4, tylko dalej to samo d1 i d2. Chcę zmieniać jedynie nazwy zmiennej wejściowej cl_hib, oraz wyjściowej hib zadeklarowanych w ustawieniach. Da się to jakoś w prosty sposób zrobić? Bo w PLC jest o tyle prościej, że dla zmiennych które się powtarzają w algorytmach, po prostu nie deklarujesz nazw i tyle. 

Kurs Arduino. Koniec. To nie jest PLC. Nie rozumiesz w ogóle tego co robisz. Nie wiesz co to jest zmienna.  Jeszcze raz. To nie jest PLC. Wszystko jest w kursie. Koniec.

  • Lubię! 1
Gość

Dla przykładu w pętli for można deklarować nowe zmienne które działają tylko w tej pętli, ale w tym przypadku widzę, że jeżeli tego będzie więcej, to kila stron kodu, to będzie zajmowała deklaracja samych zmiennych które się powtarzają do tego samego. No nic dzisiaj znajdę trochę czasu to przygotuję resztę niezbędnych algorytmów. Trzeba tylko pamiętać aby w miejsce zmiennych d wstawiać rosnące liczby tak aby te zmienne się nie powtarzały. (żeby kompilator nie sypał błędów)

6 godzin temu, ethanak napisał:

To nie jest PLC.

Wiem o tym, ale tak właśnie było w pierwszych PLC. Masakra. Co funkcja, to nowe numery, albo całe nazwy powtarzających się zmiennych. Później to uprościli. 

Gość
3 godziny temu, ethanak napisał:

ja mam za słaby wzrok żeby Twoje jednolinijkowce analizować

To już sam nie wiem jak to powinno wyglądać. Mam wpychać w linijce ile się da pętli i działań, czy pisać jedno pod drugim?

3 godziny temu, ethanak napisał:

A niby dlaczego? Podaj przykład

Podam jak już zrobię jakiś dłuższy program, tylko żeby później nie okazało się, że jest to mało czytelne i do przepisania. Bo wymyślanie egzotycznej nazwy dla każdej jednej zmiennej trochę mnie przerasta. Jeżeli już, to nazwy dla zmiennych wejściowych i wyjściowych w danym algorytmie. Resztę nazw zmiennych w warunkach i do obliczeń będę stosował tj. do tej pory.

17 minut temu, rafal220 napisał:

To już sam nie wiem jak to powinno wyglądać.

Schludnie i czytelnie. Używasz Arduino IDE? To wciśnij Ctrl-T

 

  • Lubię! 1
Gość
36 minut temu, ethanak napisał:

Używasz Arduino IDE? To wciśnij Ctrl-T

czyli z 2 linijek;

if (sw1 & 0) {d1=1;} else if (sw1 & 0) {d1=0;}

if(cl_hib_1 & d2){hib_1=0; d1=0;} else{d1=1; d2=0;} if(cl_hib_1 & d1){hib_1=1; d2=1;}

robi się;

if (sw1 & 0) {
    d1 = 1;
  } else if (sw1 & 0) {
    d1 = 0;
  }

  if (cl_hib_1 & d2) {
    hib_1 = 0;
    d1 = 0;
  } else {
    d1 = 1;
    d2 = 0;
  } if (cl_hib_1 & d1) {
    hib_1 = 1;
    d2 = 1;
  }

15 linijek kodu.

Właśnie w taki sposób napisałem pierwszy program po pierwszych kursach Arduino. Ale z czasem kiedy analizowałem programy innych użytkowników na YT, zacząłem pisać to ściślej. Nie no rozumiem, że można enter dawać po funkcji, ale po każdym działaniu? Toć to tasiemiec wychodzi. Z 1000 linijek kodu zrobi Ci się paręnaście tysięcy. Docelowy kod można tak pisać, ale nie wiem czy jest sens tak rozpisywać funkcje typu hib, lob, lhb itp. W PLC mam to w jednym maleńkim bloczku, a tutaj chciałbym mieć to w jednej linijce. To tak jakbyś w kodzie rozpakował bibliotekę. No szkoda że tu w Arduino nie ma możliwości zawijania tekstu do mini funkcji. Takich maleńkich bibliotek w które później nie wnikasz jak działają, tylko pamiętasz to co one robią. To tak jak funkcja map(). Też nie wnikasz jakie wykonuje w środku działania, tylko wiesz jak działa, oraz gdzie podstawić zmienne. W PLC też miałem spakowane funkcje map() grad (gradient wartości) i nie tylko. Po co rozmyślać nad działaniem kodu z którego tak naprawdę interesuje Ciebie to co  on realizuje, a nie to co dokładnie w środku liczy? 

Poza tym istnieją pewne normy formatowania kodu C/C++i przynajmmniej jednej z nich warto się trzymać. Co ciekawsze - żadna nie przewiduje więcej niż jednej instrukcji w wierszu.

A poza tym ciesz się że w Pythonie nie piszesz, bo tam formatowanie jest częścią języka.

  • Lubię! 1
Gość
13 minut temu, ethanak napisał:

żadna nie przewiduje więcej niż jednej instrukcji w wierszu.

I wszystko byłoby dużo proste, gdyby kod można skrótem klawiszowym zwijać do funkcji. Cos na styl prostych funkcji typu map() 

Weź jakiś porządny edytor (ostatnio się tu pisało o Geany). Poza tym po kiego grzyba trzymać takie funkcje w tym samym pliku co główny kod? Chyba tylko po to żeby zobaczyc co robi funkcja IW_pzd...

Gość
1 godzinę temu, ethanak napisał:

Poza tym po kiego grzyba trzymać takie funkcje w tym samym pliku co główny kod? Chyba tylko po to żeby zobaczyc co robi funkcja IW_pzd...

To nie tak. Chcę aby zbędny kod nie plątał się w oczach kiedy funkcja zostanie użyta n razy. Czy jak używasz prostej funkcji map(), to czy widzisz w jej kod? Oczywiście, że nie bo interesuje Ciebie tylko tyle co ta funkcja realizuje. To samo jest w mojej sytuacji. Kod takich prostych funkcji jak map() chciałbym pozawijać i spakować. A jak się nie da, to walnąć w jednej linijce z dopiskiem 

/*
funkcja
*/ 

Abyś w trakcie analizy kodu nie wnikał w to co się znajduje w kodzie funkcji tylko kierował się tym co ta funkcja realizuje. 

Spójrz na moje programy (kilka razy tu pokazywałem). Takim dobrym przykładem byłaby ostatnia wersja "arduino w modelarstwie kolejowym". Nie musisz czytać całości bo jest długa i nudna, ale zwróć uwagę na plik .ino. Oczywiście - mogłem go skrócić tak aby się mieścił na jednym ekranie tylko już mi się nie chciało...

To jest dokładnie to czego potrzebujesz.

Coś wspominałem o parasolu w rzyci?

13 minut temu, rafal220 napisał:

To nie tak. Chcę aby zbędny kod nie plątał się w oczach kiedy funkcja zostanie użyta n razy. Czy jak używasz prostej funkcji map(), to czy widzisz w jej kod? Oczywiście, że nie bo interesuje Ciebie tylko tyle co ta funkcja realizuje. To samo jest w mojej sytuacji. Kod takich prostych funkcji jak map() chciałbym pozawijać i spakować. A jak się nie da, to walnąć w jednej linijce z dopiskiem 

/*
funkcja
*/ 

Abyś w trakcie analizy kodu nie wnikał w to co się znajduje w kodzie funkcji tylko kierował się tym co ta funkcja realizuje. 

Kod powinien być czytelny. Bez wyjątku, i to tyle w temacie. 

  • Lubię! 1

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...