Ostatnio nawał pracy, więc nie miałem czasu odpowiedzieć, ale chyba jeszcze coś bym musiał wyjaśnić, pomimo tego, że autor wątku już zastosował się do mojej porady.
Adam12 napisał(a):
andrews napisał(a):
Ja bym zaczął od przeniesienia definicji funkcji rgb(), kolor_plus() i kolor_minus() poza funkcję main().
Wewnątrz funkcji main() powinny być tylko wywołania tych funkcji.
Też bym od tego zaczął, chociaż o dziwo to działa. Ale umieszczanie funkcji w ciele innej funkcji nie jest chyba zgodne ze standardem C ?
Ja nie napisałem, że to nie będzie działać, ani że to jest przyczyna problemów. To, że działa, w sumie też wcale nie jest dziwne. GCC akurat udostępnia taką funkcjonalność (i może jeszcze inne kompilatory, ale raczej nie wszystkie), jednak jest to rozszerzenie, bo standard C nie dopuszcza takiej sytuacji.
Jeśli już zagnieżdżanie funkcji jest wspierane przez kompilator, funkcje zdefiniowane wewnątrz innej funkcji będą miały zasięg lokalny, czyli będą mogły być tylko wewnątrz tej funkcji wywołane. Gdyby została napisana dodatkowa funkcja, poza funkcją
main(), która chciałaby z tych funkcji korzystać, to kompilacja zakończy się błędem
undefined reference, nawet jeśli będzie wywołana z funkcji
main().
Gdybyśmy przykładowo stworzyli poza funkcją
main() taką funkcję
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i próbowali ją wywołać z funkcji
main(), to podczas kompilacji otrzymamy błąd
undefined reference to rgb.
Stosowanie zagnieżdżania jest więc moim zdaniem uzasadnione tylko wtedy, kiedy chcemy "ukryć" jakąś funkcję i ograniczyć jej używanie tylko wewnątrz innej funkcji, ale taki sam efekt można uzyskać np. poprzez stosowanie budowy modułowej programu i definiowaniu funkcji jako
static, co jest (IMHO) bardziej eleganckim rozwiązaniem i w dodatku zgodnym ze standardem.
W tym przypadku zagnieżdżanie jest moim zdaniem nieuzasadnione i nie przynosi żadnej korzyści, za to zmniejsza czytelność kodu oraz utrudnia analizę. Poza tym kompilator i tak najprawdopodobniej przekształci to na funkcje
inline, czyli umieści kod tych funkcji w miejscu wywołania, więc równie dobrze możemy to zrobić sami. Dlatego zasygnalizowałem, że dobrze byłoby zdefiniować funkcje w standardowy sposób.
Ogólnie osobiście nie polecam takiego stylu pisania programu, nawet jeśli "o dziwo działa"
![Puszcza oko ;)](https://forum.atnel.pl/images/smilies/icon_e_wink.gif)
, szczególnie, jeśli ktoś chce zająć się programowaniem bardziej "na poważnie".