Jaką pętle zastosować?

Jaką pętle zastosować?
DJ
  • Rejestracja:około 8 lat
  • Ostatnio:prawie 7 lat
  • Postów:34
0

Chciałbym, aby dany blok instrukcji nie był wykonany, aż do spełnienia 2 warunków jednocześnie.
Jaką pętle zastosować, tak żeby się powtarzała i sprawdzała warunki? Nie wiem kiedy zostaną spełnione warunki.

edytowany 1x, ostatnio: djpady
NO
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 2 lata
  • Postów:430
0

while(a > 0 && b > 0)

fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
2

albo mozna to zrobic troszke inaczej, jezeli te warunki sa polaczone ze soba jakas logika (biznesowa, albo po prostu w kodzie jeden mocno zalezy od drugiego) to wtedy mozna polaczyc to w klase i sprawdzac

Kopiuj
while(nameOfValidator.IsValid()){}

gdzies w petli wywolujesz Validate() przez co moga zostac zmienione te parametry na ktorych Ci zalezy

Dlaczego tak zrobic?

Bo mozesz latwo wyciagnac zaleznosc i latwiej takie cos testowac

fasadin
@djpady wolam, bo moze juz nie sprawdzasz tego watku
NO
Jeśli ktoś pyta o to jaką pętle zastosować może nie zrozumieć tego co napisałeś :p
fasadin
mozna kazda petle wykorzystac. Nawet na sile mozna foreacha uzyc, ale to bylaby sztuka dla sztuki juz bardziej. Ale tak, odpowiedz moja jest troszke mniej trafiona niz Twoja. Jednak rozwiazanie moje na dluzsza mete jest lepsze ;) Dlatego dla czytajacych ten watek chcialem wyjasnic
bartk
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Lokalizacja:UK
  • Postów:25
0

Mozesz uzyc kazdej petli (nawet for, bo tam tez jest warunek logiczny), ale najbardziej sensowny wydaje sie wybor sporod: while lub do-while. Jezeli nie wiesz kiedy warunki zostana spelnione musisz jednak wziac pod uwage jak uniknac dzialania petli w nieskonczonosc.


Zobacz pozostałe 2 komentarze
fasadin
bo napisales ze moze uzyc kazdej petli :D
bartk
utworz sztuczny iterator i co kazdy przebieg resetuj jego wskaznik - teoretycznie masz petle nieskonczona tylko w sumie nawet z nozem przy gardle bym tego nie zrobil :)
somekind
foreach to nie pętla.
bartk
A co to jest, Kononowicz Driven Development?
DJ
  • Rejestracja:około 8 lat
  • Ostatnio:prawie 7 lat
  • Postów:34
0

Problem polega na tym, że chce przyjąć byte z serial portu. Program za szybko się wykonuje. Wiec pomyślałem sobie, że warto by było zrobić pętle, która się wykonuje i jak przyjdą dane SerialPort.IsOpen > 0 i wartość tego byte co przyjdzie będzie równa 0. Wykona się kod. Problem polega na tym, że jak zrobię przeciwieństwo czyli (SerialPort.IsOpen !=0 i wartość byte != 1) program nie reaguje. Reasumując chce, żeby pętla przechodziła tyle razy aż przyjdą dane na serial port i te dane będą równe 1 wykona się blok instrukcji.

fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0
bartk
Autor nie sprecyzowal technologii, ale masz racje. Chociaz wewnatrz tego wrappera i tak na pewno chodzi petla, ktora "czeka".
fasadin
to jest proste rozwiazane bazujace na zdarzenia. Oczywiscie ze wewnatrz jest petla ;) Nie ma sensu wymyslac kola na nowo
0

@bartk: Nie ma tam żadnej pętli, jak coś się łączy na porcie szeregowym to wyzwala przerwanie sprzętowe, które uaktywania eventy.

fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0

ale zeby byl wysluchany event to musisz miec petle ktora nasluchuje i sprawdza co jakis czas czy cos przyszlo. Wiec wewnetrznie jestem prawie pewien (bo nie widzialem kodu wiec nie jestem 100% pewny) jest petla ktora wyczekuje na eventy

DJ
Chodzi właśnie o to, żeby nie tworzyć dodatkowych event-ów. Bo wiem, że właśnie po danej instrukcji przyjdzie kolejny sygnał, która ma wykonać blok instrukcji jak przyjdzie. Chodzi o to, że wiem co się stanie. Ale nie wiem za ile sekund.
fasadin
przeciez nie tworzysz dodatkowych eventow. Obslugujesz juz te ktore sa zaimplementowane. Nie idz droga "odbieram i obsluguje wszystko na raz" bo uwierz mi, ze zmiana czegokolwiek w takim kodzie to katorga
DJ
  • Rejestracja:około 8 lat
  • Ostatnio:prawie 7 lat
  • Postów:34
0

No dobra w takim razie jak mam już taki MyDataReceivedHandler jak w poście fasadina, to jak mam się odwołać w głównym programie do tego? Czyli powiedzmy, że chce jeżeli przyjdzie byte o zmiennej 1, wykona się blok instrukcji ?

AG
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:77
0

Pytanie trochę z innej strony, komunikujesz się za pomocą ASCII, czy binarnie? SerialDataReceivedEventHandler nie koniecznie dobrze sobie radzi z komunikacją binarną, potrafi wyskoczyć po 1 bajcie, albo po kilku.

DJ
Przesyłane są Bytes w jedną i drugą stronę.
AG
Masz jakieś timeouty? Transmisja master-slave, czy asynchroniczna?
DJ
Żadne, timeouty nie zostały predefiniowane. Jak to wpływa na działanie ?
AG
timeout wyrzuci wyjątek jak będziesz czekał na dane, dzięki czemu program nie utknie w jednym miejscu. (Rozwiązanie mało eleganckie ale działa)
AG
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:77
0

Czy otwierasz w ogóle port:

Kopiuj
sp = new SerialPort("COM3");
                sp.Open();
                sp.DataReceived += Sp_DataReceived;

otwarcie portu nie jest asynchroniczne, czeka aż się otworzy nie ma potrzeby za bardzo sprwdzać isOpen.

DJ
  • Rejestracja:około 8 lat
  • Ostatnio:prawie 7 lat
  • Postów:34
0

Może inaczej. W Klasie KlasaObslugiUSB mam umieszczonego SerialDataReceivedEventHandler. Teraz chce stworzyć metodę w programie głównym, w której jeżeli program odbierze byte, to sprawdzi jaka jest jego wartość i wykona odpowiedni blok instrukcji. Największym problem jest to, że Program za szybko działa i po odebraniu wyskakuje błąd "System.NullReferenceException: 'Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.'" Chodzi o to, że program dalej sie wykonuje, zamiast wykonywać się po sprawdzeniu warunków. Czyli w tym przypadku Odebrania bytes i sprawdzenia jego wartości.

public partial class MainWindow : Window
{



    public MainWindow()
    {
        InitializeComponent();
        KlasaObslugiUSB.Instancja.Open();

    }

    private void Start_Click(object sender, RoutedEventArgs e)
    {

        KlasaObslugiUSB.Instancja.StartGry(); //wysłanie sygnału StartGry
        //Thread.Sleep(250);
        ZapalLampki();


    }

    private void ZapalLampki()
    {
        
        while (KlasaObslugiUSB.Instancja.Wynik[0] != 1)
        {
            Ellipse01.Fill = Brushes.Blue;
            Ellipse02.Fill = Brushes.Blue;
            Ellipse03.Fill = Brushes.Blue;
            Ellipse04.Fill = Brushes.Blue;
            Ellipse05.Fill = Brushes.Blue;
            Ellipse06.Fill = Brushes.Blue;
            Ellipse07.Fill = Brushes.Blue;
            Ellipse08.Fill = Brushes.Blue;
            Ellipse09.Fill = Brushes.Blue;
            Ellipse10.Fill = Brushes.Blue;
        }
        
    }
    
        
    

    private void Zeruj_Click(object sender, RoutedEventArgs e)
    {
        Ellipse01.Fill = Brushes.Blue;
        Ellipse02.Fill = Brushes.Blue;
        Ellipse03.Fill = Brushes.Blue;
        Ellipse04.Fill = Brushes.Blue;
        Ellipse05.Fill = Brushes.Blue;
        Ellipse06.Fill = Brushes.Blue;
        Ellipse07.Fill = Brushes.Blue;
        Ellipse08.Fill = Brushes.Blue;
        Ellipse09.Fill = Brushes.Blue;
        Ellipse10.Fill = Brushes.Blue;
    }
}
AG
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:77
1

Idąc tym tokiem działania, (kod ogólnie nie powinien tak wyglądać, trzeba by dużo pozmieniać, no ale idąc tym tokiem)
zamiast

Kopiuj
while (KlasaObslugiUSB.Instancja.Wynik[0] != 1)

daj

Kopiuj
while (KlasaObslugiUSB.Instancja.IsValid())

a w klasie KlasaObslugiUSB dodaj metodę
IsValid() {
return = (wynik!=null&&wynik.length>0);
}
I dodaj

Kopiuj
private void Sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //tu przypisywanie wartości do wynik
        }

i

Kopiuj
sp.DataReceived += Sp_DataReceived; //zaraz po sp.Open();
edytowany 1x, ostatnio: Andrzej Guziec
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)