eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaprogramowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
Ilość wypowiedzi w tym wątku: 79

  • 11. Data: 2017-10-24 11:58:35
    Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
    Od: Piotr Gałka <p...@c...pl>

    W dniu 2017-10-24 o 11:22, Janusz pisze:

    >> Tak się zastanawiam do czego ona mogła by być przydatna i nie bardzo
    >> potrafię wymyślić jakiś przykład generujący realną taką potrzebę.
    > Znalazłby się, np wyjście z podwójnej pętli, breakiem wyjdziesz tyle że
    > pętlę wyżej gdzie musisz testować warunek dalszego wyjścia, jak widzisz
    > zaciemnia się kod i robi się to mało eleganckie.
    >

    Kiedyś przetestowałem break;break; i OIDP zadziałało dobrze, ale nie
    byłem pewien, czy to przypadek, czy cecha języka więc dołożyłem bool
    który służył tylko do tego aby zewnętrza pętla wiedziała, że wewnętrzna
    każe wyjść. Potem chyba zastąpiłem wewnętrzną przez osobną funkcję
    inline i wydaje mi się to lepszym/czytelniejszym rozwiązaniem niż goto.

    Kilka lat temu kupiłem sobie ostatnią książkę Stroustrupa o C++.
    Nie przebrnąłem przez całą. Utkwiło mi w pamięci, że według niego jak
    funkcja ma więcej jak 7 linijek to znaczy, że program jest źle napisany.
    Jest to wspomniane gdzieś gdzie przykłady są już dla mnie prawie nie
    zrozumiałe. Może kiedyś....
    P.G.


  • 12. Data: 2017-10-24 12:27:20
    Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
    Od: Piotr Gałka <p...@c...pl>

    W dniu 2017-10-24 o 11:39, ajt pisze:
    >>
    >> Tak się zastanawiam do czego ona mogła by być przydatna i nie bardzo
    >> potrafię wymyślić jakiś przykład generujący realną taką potrzebę.
    >
    > Mam podobny staż i też nie używam goto, ale jedyny raz to zrobiłem w
    > pewnym konkretnym przypadku. Musiałem zaimplementować algorytm liczenia
    > pierwiastków zespolonych wielomianu dowolnego stopnia. W jakiejś książce
    > znalazłem gotową procedurę w Fortranie. Kod był strasznie pokręcony i
    > miał powtykane goto w wielu różnych miejscach, np. w ten sposób było
    > zrobione wyjście z pętli, ale i wskoczenie do pętli w inne miejsce po
    > spełnieniu jakiegoś warunku na zewnątrz. Próbowałem to przerobić na
    > jakąś czytelniejszą postać, ale w końcu się poddałem i mechanicznie
    > przepisałem na C, wraz ze wszystkimi goto. Poszło od pierwszego razu,
    > więc nie chciało mi się już później przy tym grzebać :)

    O takiej potrzebie nie pomyślałem :)

    Jakieś gotowe algorytmy (odwracanie macierzy i inne) przepisywałem
    kiedyś dawno z ruskiego "Sprawocznika Algoritmow na jazyku ?" to chyba
    był Algol więc OIDP żadnych goto nie było.
    Przepisałem też kiedyś FFT (nie wiem skąd) do Basica - na Commodore-64
    zrobiłem próbkowanie 3s mowy do RAMu i potem malowanie pseudo 3D wykresu
    zmiany widma w funkcji czasu. Mój profesor miał nadzieję, że zrobię
    komputerowe rozumienie mowy, ale przecenił moje możliwości :)
    Wtedy jeszcze u nas na Politechnice Gdańskiej nie było ani jednego IBM-PC.
    P.G.


  • 13. Data: 2017-10-24 12:30:21
    Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
    Od: Mateusz Viste <m...@w...tell>

    On Tue, 24 Oct 2017 11:58:35 +0200, Piotr Gałka wrote:
    > Kiedyś przetestowałem break;break; i OIDP zadziałało dobrze, ale nie
    > byłem pewien, czy to przypadek, czy cecha języka więc dołożyłem bool
    > który służył tylko do tego aby zewnętrza pętla wiedziała, że wewnętrzna
    > każe wyjść.

    Raczej przypadek... Albo jakieś dziwne zachowanie kompilatora którego
    użyłeś.
    ISO-9899-1990 mówi: "6.6.6.3: A break statement terminates execution of
    the smallest enclosion switch or iteration statement."

    Dlatego więc drugie 'break' w przykładzie który podajesz jest (a
    przynajmniej powinno być) martwym kodem.

    Prosty test:

    int main(void) {
    for (;;) {
    for (;;) {
    break; break;
    }
    }
    return(0);
    }

    Powyższy program (po kompilacji i uruchomieniu) nigdy się nie kończy. A
    mój gcc optymalizuje go to tej postaci :)

    .L2:
    nop
    jmp .L2

    GOTO jest faktycznie dość niepopularne w C, i sam mało kiedy mam potrzebę
    go użyć, jednak nie zgadzam się z fanatykami którzy twierdzą iż goto to
    jakieś największe zło i należy je usunąć z języka.
    Jedyna sytuacja którą pamiętam to gdy potrzebowałem wyjść z switch()
    zagnieżdżonego w jednej lub dwóch pętlach. Jedno 'goto' pozwoliło domknąć
    projekt, zamiast refaktoryzować wszystko kilka dodatkowych dni. Niby
    anegdota, ale fajnie mieć pod ręką takie goto 'w razie czego'.

    > Kilka lat temu kupiłem sobie ostatnią książkę Stroustrupa o C++.
    > Nie przebrnąłem przez całą. Utkwiło mi w pamięci, że według niego jak
    > funkcja ma więcej jak 7 linijek to znaczy, że program jest źle napisany.

    Też czytałem takie opinie, ale chyba z innego źródła, bo Stroustrupa
    przeczytałem tylko wstęp i miałem dość :) Ta reguła siedmiu linijek to
    jakiś wymysł nowego pokolenia... Zdarzało mi się miewać takich wśród
    moich pracowników. Młodym się chyba nudzi i wymyślają sobie różne zabawy.
    A jak trzeba coś konkretnego zrobić to sięgają po zewnętrzne biblioteki
    by rozwiązać nawet relatywnie proste sprawy, "bo po co wymyślać na nowo",
    a potem projekt nie da się skompilować bo wymaga miliona zależności,
    których połowa już nie istnieje lub zmieniła API. Życie.

    Mateusz


  • 14. Data: 2017-10-24 12:58:22
    Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
    Od: "J.F." <j...@p...onet.pl>

    Użytkownik "Piotr Gałka" napisał w wiadomości grup
    dyskusyjnych:osmsrd$mk1$1$P...@n...chmurka.ne
    t...
    >Nigdy nie zdarzyło mi się mieć potrzeby użycia w C instrukcji goto,
    >ba, nawet jakby mnie ktoś poprosił o wymienienie wszystkich
    >instrukcji dostępnych w C to chyba bym sobie o niej nie przypomniał,
    >a używam (sporadycznie i nie do mikrokontrolerów) C gdzieś tak od
    >1986r.

    Nie uzywasz, bo jestes "dobrze nauczony", to nie pamietasz.
    Pomysl lepiej ile razy kombinowales, gdy jedno goto zalatwiloby
    sprawe,

    >Tak się zastanawiam do czego ona mogła by być przydatna i nie bardzo
    >potrafię wymyślić jakiś przykład generujący realną taką potrzebę.
    >A jeśli już w ogóle to chyba tylko wewnątrz jednej funkcji do
    >jakiegoś rozwikłania czegoś co w przeciwnym wypadku wymagało by albo
    >dwukrotnego napisania kilku linijek programu, albo ujęcia ich w
    >kolejną wywoływaną funkcję.

    To tez.

    >Na pewno wybrałbym jedno z tamtych rozwiązań, a nie goto, choćby
    >dlatego, że nie pamiętam o jego istnieniu.

    jak podano - wyjscie z zagniezdzonych petli.
    A nawet szukanie czegos w jednej petli - znalazles lub nie znales.
    Break i sprawdzac po liczniku petli czy dotarles do konca ? Czy flage
    pomocnicza sobie zalozyc ?

    A teraz wpadlem w jakies bazy danych i mozg mi sie czasem lasuje od
    logiki.
    wyszukac rekord. Jak jest - to poprawic. Jak sa dwa to blad zglosic,
    albo co gorsza poprosic o wybranie uzytkownika.
    Jak nie ma - wyszukac po innym kryterium.
    I znow - poprawic lub dopytac.
    A jak nie ma, to w koncu zalozyc.
    A to tylko najprostszy przypadek, bez szykan.

    Inna sprawa, ze jakbym tak zaczal mieszac za pomoca goto, to pewnie
    tez bym sie pogubil :-)

    J.


  • 15. Data: 2017-10-24 13:23:00
    Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
    Od: Piotr Gałka <p...@c...pl>

    W dniu 2017-10-24 o 12:30, Mateusz Viste pisze:

    > Raczej przypadek... Albo jakieś dziwne zachowanie kompilatora którego
    > użyłeś.
    > ISO-9899-1990 mówi: "6.6.6.3: A break statement terminates execution of
    > the smallest enclosion switch or iteration statement."
    >
    > Dlatego więc drugie 'break' w przykładzie który podajesz jest (a
    > przynajmniej powinno być) martwym kodem.
    >
    > Prosty test:
    >
    > int main(void) {
    > for (;;) {
    > for (;;) {
    > break; break;
    > }
    > }
    > return(0);
    > }

    Sprawdziłem.
    U mnie (Builder 5) też się zapętla.
    Pomyślałem, że może ze switch wewnątrz for tak mi się udało wyjść, ale
    też nie.

    Dziwi mnie bo moje OIDP wydawało mi się prawie pewne, a nie używam
    innych kompilatorów niż Builder.

    > Też czytałem takie opinie, ale chyba z innego źródła, bo Stroustrupa
    > przeczytałem tylko wstęp i miałem dość :) Ta reguła siedmiu linijek to
    > jakiś wymysł nowego pokolenia... Zdarzało mi się miewać takich wśród
    > moich pracowników. Młodym się chyba nudzi i wymyślają sobie różne zabawy.
    > A jak trzeba coś konkretnego zrobić to sięgają po zewnętrzne biblioteki
    > by rozwiązać nawet relatywnie proste sprawy, "bo po co wymyślać na nowo",
    > a potem projekt nie da się skompilować bo wymaga miliona zależności,
    > których połowa już nie istnieje lub zmieniła API. Życie.
    >

    Ja bardzo mało czasu programuję - średnio będzie 2..3 tygodnie w roku.
    Nigdy nie próbowałem użyć żadnej zewnętrznej (znaczy nie zintegrowanej
    fabrycznie z Builderem) biblioteki. Szczerze mówiąc nie wiedziałbym jak
    się w ogóle do tego zabrać :)
    Jak z 10 lat temu potrzebowałem DES, AES, SHA, CMAC, HMAC to wziąłem
    dokumenty NIST i sobie je napisałem (przy okazji popełniając błąd, który
    nie został wykryty przez ich wektory testowe :) ).
    P.G.


  • 16. Data: 2017-10-24 13:30:29
    Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
    Od: Włodzimierz Wojtiuk <"WBodzimierz Wojtiuk">

    On 2017-10-24 08:29, Janusz wrote:

    >
    >> PRalki jeszcze nie tknąłem.
    > I dobrze, jeszcze sobie lub dziecku krzywdę zrobisz.
    >

    Jeżeli pralka do zabawy to:
    https://www.youtube.com/watch?v=sZfrl-LQamk&ab_chann
    el=AdamMarkiewicz

    Włodek


  • 17. Data: 2017-10-24 13:42:36
    Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
    Od: Piotr Wyderski <p...@n...mil>

    Piotr Gałka wrote:

    > Tak się zastanawiam do czego ona mogła by być przydatna i nie bardzo
    > potrafię wymyślić jakiś przykład generujący realną taką potrzebę.

    A mnie się zdarza stosunkowo często, choć przypadki użycia są jedynie dwa:

    1. Opuszczanie wielokrotnie zagnieżdżonych pętli.
    2. Przekazywanie sterowania do wspólnego kodu obsługi błędu dla danej
    sytuacji:

    if (dobrze) {

    // to dobrze
    } else {

    lbl_zle:

    // bardzo zle
    }

    if (albo_jednak_zle) {

    goto lbl_zle;
    }

    > A jeśli już w ogóle to chyba tylko wewnątrz jednej funkcji do jakiegoś
    > rozwikłania czegoś co w przeciwnym wypadku wymagało by albo dwukrotnego
    > napisania kilku linijek programu, albo ujęcia ich w kolejną wywoływaną
    > funkcję.

    Dokładnie o to chodzi. Goto potrafi znacznie *podnieść* czytelność,
    tylko trzeba go używać z głową. To przydatna konstrukcja, niepotrzebnie
    obrosła mitami.

    Pozdrawiam, Piotr


  • 18. Data: 2017-10-24 13:42:39
    Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
    Od: Piotr Gałka <p...@c...pl>

    W dniu 2017-10-24 o 12:58, J.F. pisze:

    > Pomysl lepiej ile razy kombinowales, gdy jedno goto zalatwiloby sprawe,

    Czasem kombinowałem, ale na prawdę nie pamiętając w ogóle o istnieniu
    goto nigdy nie miałem myśli "jedno goto załatwiloby sprawę" dlatego nie
    mam pojęcia czy tak było w tych przypadkach gdy kombinowałem.

    > jak podano - wyjscie z zagniezdzonych petli.

    Jak dopada mnie taki przypadek to robię podfunkcję z której w wielu
    miejscach wychodzę przez return - w sumie to podobne do goto i możliwe
    że też jest 'be'.

    > Inna sprawa, ze jakbym tak zaczal mieszac za pomoca goto, to pewnie tez
    > bym sie pogubil :-)
    >

    Jak użyć goto tak jak wyżej opisany return to pewnie na czytelności
    wiele nie traci, ale jak byłoby w funkcji kilka etykiet i gdzieś tam
    skoki do nich - niektóre do przodu, niektóre do tyłu to chyba bym
    zwariował próbując zrozumieć.
    P.G.


  • 19. Data: 2017-10-24 13:49:27
    Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
    Od: Piotr Wyderski <p...@n...mil>

    Piotr Gałka wrote:

    > Kiedyś przetestowałem break;break; i OIDP zadziałało dobrze, ale nie
    > byłem pewien, czy to przypadek

    Przypadek, błąd w kompilatorze najprawdopodobniej. Sterowanie
    nie ma prawa dojść do drugiego goto. Poza tym spróbuj tak opuścić
    switcha zawartego w petli. :-)

    > czy cecha języka więc dołożyłem bool który służył tylko do tego
    > aby zewnętrza pętla wiedziała, że wewnętrzna każe wyjść.

    Czyli klasycznie zacząłeś wbijać gwoździe kombinerkami,
    bo Dijkstra chlapnął, że goto jest złe.

    > Potem chyba zastąpiłem wewnętrzną przez osobną funkcję
    > inline i wydaje mi się to lepszym/czytelniejszym rozwiązaniem niż goto.

    Jeśli możesz poprawić strukturę programu w ten sposób, to zawsze warto,
    nie tylko z powodu goto. Natomiast jeśli nie możesz, to... przyznaj, że
    nie możesz i użyj goto, a nie kombinuj. Ta konstrukcja jest w języku
    *celowo*.

    > Kilka lat temu kupiłem sobie ostatnią książkę Stroustrupa o C++.
    > Nie przebrnąłem przez całą. Utkwiło mi w pamięci, że według niego jak
    > funkcja ma więcej jak 7 linijek to znaczy, że program jest źle
    > napisany.

    Nie pierwsza to i nie ostatnia głupota, a papier w mordę nie da...

    Pozdrawiam, Piotr


  • 20. Data: 2017-10-24 13:52:59
    Temat: Re: programowanie w C - bardzo ogólne pytanie o filozofię. Arduino w roli programatora pralki
    Od: "J.F." <j...@p...onet.pl>

    Użytkownik "Piotr Gałka" napisał w wiadomości grup
    dyskusyjnych:osn8vc$r5s$1$P...@n...chmurka.ne
    t...
    W dniu 2017-10-24 o 12:58, J.F. pisze:
    >> jak podano - wyjscie z zagniezdzonych petli.

    >Jak dopada mnie taki przypadek to robię podfunkcję z której w wielu
    >miejscach wychodzę przez return - w sumie to podobne do goto i
    >możliwe że też jest 'be'.

    >> Inna sprawa, ze jakbym tak zaczal mieszac za pomoca goto, to pewnie
    >> tez bym sie pogubil :-)

    >Jak użyć goto tak jak wyżej opisany return to pewnie na czytelności
    >wiele nie traci, ale jak byłoby w funkcji kilka etykiet i gdzieś tam
    >skoki do nich - niektóre do przodu, niektóre do tyłu to chyba bym
    >zwariował próbując zrozumieć.

    W assemblerze mi sie nie mylilo :-)

    IMO - to sie stad wzielo, i moze troche z numerowania linii jak w
    Basicu i moze kart jak w czasach Fortranu.

    Bardzo poczatkujacy programisci w basicu rozwijajac program bardzo
    szybko tworza takie dzikie struktury z wieloma zupelnie niepotrzebnymi
    skokami, a potem sami sie w tym gubia.
    Wiec Wirth zabronil skokow i mial spokoj (choc w Pascalu goto jak
    najbardziej jest, za to nie ma break i continue).

    Byc moze ma to jeszcze cos wspolnego z dowodzeniem poprawnosci
    programow - w tak "dzikiej" strukturze trudno dowod przeprowadzic.

    J.


strony : 1 . [ 2 ] . 3 ... 8


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: