Wpis z mikrobloga

via Wykop Mobilny (Android)
  • 0
Czy mogę w programie w #cpp w podfunkcji w case użyć main( ) żeby program w tym przypadku wrócił do początku maina?
Coś mi kompilator nie przepuszcza tego a z własną funkcją to działa, tylko chciałem to zmienić na maina bo trochę głupio żeby main był tylko aby wywołać jedną prawdziwie główną funkcje XD
#programowanie
  • 25
  • Odpowiedz
walnij se goto i po sprawie. *chyba że to kod na zadanie z uczelni to lepiej nie

no właśnie kod na uczelnię i w wymaganiach jest bezwzględny zakaz goto XD


@Whiskeyjack29: @Kedamik: proszę nie (,) słusznie macie zakaz stosowania goto.

@Kedamik: użycie rekurencji to bardzo zły pomysł. lepiej użyj pętli.
  • Odpowiedz
@ly000: samo w sobie goto jest bardzo demonizowane bo kiedyś Dijkstra tak napisał ale nikt sobie nie zadaje trudu sprawdzić czemu tak napisał. Napisał tak dlatego że używanie goto uniemożliwia często matematyczne uzasadnienie warunków stopu i prawności danego algorytmu, ale w dzisiejszym programowaniu rzadko udawadnia się złożone programy matematycznie. W kernelu linuxa sporo goto. Chociaż zgadzam się że do tego co chce zrobić kolega to nie najlepsze rozwiązanie ( ͡°
  • Odpowiedz
@Whiskeyjack29: jest słusznie demonizowane, bo powoduje, że kod staje się mało czytelny. jak widzisz for, while, if lub switch już to wiesz dużo co będzie robił dany kawałek kodu, zanim zaczniesz analizować dalszy fragment kodu. natomiast jak widzisz goto to nie masz pojęcia czy to goto będzie powodowało zapętlanie i nie masz jasnego warunku przerwania pętli (jak np. w while(...)) - musisz znacznie więcej czasu poświęcić na analizę kodu.
  • Odpowiedz
@Whiskeyjack29: podobnie działają design patterns i uniwersalne nazewnictwo. programista widzi, że coś zostało nazwane tak a nie inaczej i już się spodziewa co to będzie robiło, bez analizowania kodu. kod staje się bardziej abstrakcyjny i mniej kontekstowy. programista może się skupić na większych rzeczach, zamiast dłubać coś na niskim poziome abstrakcji.
  • Odpowiedz
W kernelu linuxa sporo goto.


@Whiskeyjack29: nie wiem z czego to wynika. natomiast ja mogę powiedzieć, że trochę grzebałem w kodzie linuxa na studiach i zdecydowanie to nie był wzór dobrze napisanego kodu. miejscami jest wręcz amatorski.
  • Odpowiedz
@ly000: "The goto statement comes in handy when a function exits from multiple locations and some common work such as cleanup has to be done. If there is no cleanup needed then just return directly." Z coding standards jądra linuxa, ja nie napisałem że goto ma zastąpić for czy if, ale w niektórych językach ma zastosowania warte rozważenia
  • Odpowiedz
The goto statement comes in handy when a function exits from multiple locations and some common work such as cleanup has to be done. If there is no cleanup needed then just return directly."


@Whiskeyjack29: jak się pisze jakieś funkcje na 250 linijek to może potem trzeba pisać goto, żeby przeskoczyć z linijki 120 do 248. naturalnym rozwiązaniem tego problemu jest podzielenie funkcji na mniejsze funkcje i wtedy nie ma prawa
  • Odpowiedz
Napisał tak dlatego że używanie goto uniemożliwia często matematyczne uzasadnienie warunków stopu i prawności danego algorytmu, ale w dzisiejszym programowaniu rzadko udawadnia się złożone programy matematycznie.


@Whiskeyjack29: Zdziwiłbyś się. Rośnie trend weryfikacji oprogramowania i nie dotyczy to tylko embedded czy automotive. Mamy zweryfikowane kernele, pracuje się nad zweryfikowanymi

Weryfikacja oprogramowania stała się dużo bardziej automatyczna i zaawansowana.

W kernelu linuxa sporo goto.


@Whiskeyjack29: goto, podobnie jak longjmp/setjmp mają swoje zastosowania.
  • Odpowiedz
"The goto statement comes in handy when a function exits from multiple locations and some common work such as cleanup has to be done. If there is no cleanup needed then just return directly."


@Whiskeyjack29: To zdanie z automata sugeruje, że wiele z tych funkcji jest zwyczajnie zbyt złożonych.

Goto przede wszystkim zaciemna całkowicie przepływ kontroli, a nawet dla kompilatora takie losowe skoki utrudniają analizę CFG, gdyż takie skoki z "powrotami"
  • Odpowiedz
Czy mogę w programie w #cpp w podfunkcji w case użyć main( ) żeby program w tym przypadku wrócił do początku maina?


@Kedamik: Masz źle zaprojektowany logiką w programie. Jeśli w jakimś przypadku musisz rozpocząć działanie programu od początku, to tak naprawdę cały program jest pętlą która wykonuje się aż zostanie spełniony pewien warunek. Implementując to jako pętlę typu while(true) napiszesz kod, który będzie odpowiadać faktycznej semantyce twojego programu.
  • Odpowiedz
@wolodia: @ly000 To jak wg was w ładny sposób zrobic w C malloc potem if(warunek1) wykonaj a if(warunek2) wykonaj b if(warunek3) wykonaj c, zakładając że a,b,c operują na zaalokowanym zasobie. Czy mam na wypadek błędu zwalniać zasobów w a i b i c zamiast zwrócić flagę że operacja się nie udała o pod koniec funkcji wywołującej w label error: zrobić free()? Właśnie taki jest sens użycia w kernelu linuxa. Przypominam że
  • Odpowiedz
@Whiskeyjack29: bool success = true;

W każdym warunku: success &= run_a() == 0; (każda metoda powinna zwracać kod błędu, zwłaszcza w POSIX)

Na końcu:
if(!success) {
free();
ptr = NULL;
}
return ptr;
  • Odpowiedz