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