Dyskusja:C/Pierwszy program

Najnowszy komentarz napisał 16 lat temu Derbeth w wątku Błąd w wersji PDF

W main() nie używa się return

edytuj

Czy moglby powiedziec czemu to w "prawdziwym programowaniu" nie powinno sie zwracac wartosci w funkcji main. Przeciez to jest bardzo przydatne chociazby przy wykonywaniu skryptow ktore moga wykonywac konkretne operacje w przypadku poprzwnego wykonania danego programu. Z tego co pamietac ktorys kompilator nawet domagal sie ze funkcja main powinna zwracac "int" Pawlosck 15:09, 13 kwi 2006 (UTC)

Może zacytuję:

W "prawdziwym" programowaniu w funkcji main() nie należy używać return 0.

Autor nic nie mówi, żeby nie zwracać wartości. Może ma na myśli, żeby pisać return EXIT_SUCCESS;? (ja w sumie zawsze daję zero, ale jeszcze w "prawdziwym" programowaniu zbytnio nie uczestniczyłem.) --Piotr K. 15:49, 13 kwi 2006 (UTC)

Hmm, jestem autorem tego podręcznika i szczerze powiedziawszy sam się zastanawiam skąd wziął się ten fragment. Zgodnie z wszelkimi wytycznymi funkcja main w momencie prawidłowego zakończenia programu powinna zwrócić 0 do systemu (to właśnie na podstawiej tej wartości system operacyjny stwierdza, czy program zakończył się poprawnie). Kj 17:34, 13 kwi 2006 (UTC)
W obecnej wersji modułu kwestia ta już została wyjaśniona, ale tak dla ciekawskich mogę dodać, że w systemach VMS jedynka (a konkretnie to chyba każda nieparzysta liczba, choć tego nie jestem pewny) oznacza poprawne zakończenie programu, a zero zakończenie niepoprawne. --Mina86
Aha, ten fragment dopisał ktoś, edytujący z numeru IP: 194.29.147.102. Kj 17:36, 13 kwi 2006 (UTC)
Z tego co pamiętam uczono mnie, jak również sami autorzy jezyka zalecali zwracać 0 no końcu programu i tak najprawdopodobniej powstała ta "tradycjia". ;] MonteChristof DMC 17:39, 14 sty 2007 (CET)Odpowiedz
Autorzy C pisali programy pod swój system, czyli Unix. W większości tego typu systemów 0 oznacza poprawne zakończenie programu. --Kj 21:04, 14 sty 2007 (CET)Odpowiedz
Nie wiem czy czasem zwrócenie wartości 0 nie należy do standardu języka C.--Migol 02:24, 12 lut 2007 (CET)Odpowiedz

Hmm... faktycznie w C99 jest to jednoznacznie określone: ISO/IEC 9899:1999 (fragmenty, wyróżnienie moje):

5.1.2.2.3 Program termination
1 If the return type of the main function is a type compatible with int, a return from the initial call to the main function is equivalent to calling the exit function with the value returned by the main function as its argument;reaching the } that terminates the main function returns a value of 0. If the return type is not compatible with int, the termination status returned to the host environment is unspecified.
7.20.4.3 The exit function
2 The exit function causes normal program termination to occur. If more than one call to the exit function is executed by a program, the behavior is undefined.
5 Finally, control is returned to the host environment. If the value of status is zero or EXIT_SUCCESS, an implementation-defined form of the status successful termination is returned. If the value of status is EXIT_FAILURE, an implementation-defined form of the status unsuccessful termination is returned. Otherwise the status returned is implementation-defined.

Przejrzę jeszcze K&Rv2, choć przydałby się ktoś z ISO/IEC 9899:1990 lub ANSI X3.159-1989, żeby to dokładnie sprawdzić jak to było w pierwotnym standardzie określone. -- mina86 (talk) 15:40, 12 lut 2007 (CET)Odpowiedz

W Brian W. Kernighan, Dennis M. Ritchie. Języku ANSI C. Warszawa 2003 w rozdziale 1.7. Funkcje znalazłem następujący fragment (wyrożnienie moje): "Ponieważ main jest taką samą funkcją jak inne, również ona może przekazywać wartość do miejsca swojego wywołania, którm w rzeczywistości jest otoczenie, w jakim wykonuje się program. Zwykle wartość powrotna równa zero oznacza normalne zakończenie działania; wartości rózne od zera sygnalizują niezwykłe lub błędne okoloczności tego zakończenia." Zatem zwykle zero oznacza poprawne zakończenie, więc z tego fragmentu nie można wnioskować, że standard to warantuje. Spróbuje jeszcze poszukać czegoś na comp.lang.c. -- mina86 (talk) 15:56, 12 lut 2007 (CET)Odpowiedz

Zadałem pytanie na comp.lang.c i dzięki uzyskanej odpowiedzi już wiem, iż faktycznie - zwrócenie zera oznacza prawidłowe zakończenie programu. Konkretnie, z drafu C89 sekcja 4.10.4.3 The exit function mamy: "Finally, control is returned to the host environment. If the value of status is zero or EXIT_SUCCESS , an implementation-defined form of the status successful termination is returned.". Zaraz dokonam wszelkich koniecznych modyfikacji. -- mina86 (talk) 16:27, 13 lut 2007 (CET)Odpowiedz

jest też druga strona medalu z tego co ja kojarze ale mogę się mylić niech ktoś to potwierdzi lub zaprzeczy: return 0 używał każdy bo tak jest w standardzie ale czasy się zmieniają i teraz większość ludzi uczy i poleca korzystania z funkcji exit dlaczego ? dlatego że bezpieczniej jest skorzystać z funkcji exit która też zwraca wartość (pomyślnego lub nie, zakończenia programu) a także zabezpiecza program przed dostaniem się do jego pamięci zewnętrznego procesu tzn. czyści pamięć z której korzystał program po jego zakończeniu. Co uniemożliwia korzystanie z używanej przez niego pamięci przez inny program. Jest to o wiele bezpieczniejsze niż korzystanie z funkcji return która tego nie robi. Czyż nie ? POzdrawiam mtfk
Wyjaśniam możliwie krótko:
1. Reguły komunikacji z zewnętrznym otoczeniem funkcji napisanej w C określa programista definiując listę parametrów (argumentów) funkcji oraz typ wartości przenoszonej przez nazwę funkcji. Wyjątkiem od tej zasady jest funkcja main ().
2. Funkcja main() jest wołana przez system operacyjny, który tym samym jest "zewnętrznym otoczeniem" tejże funkcji. Programista w tym przypadku musi znać ustalone raz na zawsze reguły wymiany informacji pomiędzy funkcją main() i systemem operacyjnym. Może je co najwyżej ignorować.
3. Język C nie ma oddzielnego typu "logicznego". Wartość logiczną PRAWDA reprezentuje dowolna wartość różna od zera, podczas, gdy FAŁSZ reprezentuje wartość numeryczna "zero".
4. Język poleceń każdego systemu operacyjnego ma polecenie/instrukcję warunkową pozwalającą badać wartość zwracaną przez uruchomiony program (w przypadku programu C jest to wartość zwracana przez instrukcją return funkcji main lub argument funkcji exit(), która wywolana gdziekolwiek w programie kończy go i podstawia pod symbol main wartość argumentu wywołania. Instrukcja, o której mowa w przypadku systemów operacyjnych Microsoftu ma postać: if errorlevel 1 goto etykieta. To właśnie postać tej instrukcji odpowiada na pytanie, dlaczego poprawne zakończenie programu powinno dostarczać do systemu wartość zero reprezentującą FAŁSZ. Zwrot errorlevel 0 da się zinterpretować tak , że twierdzenie iż wystąpił błąd w programie (errorlevel) jest fałszywe zgodnie z tym co powiedziano wyżej o wartościach "logicznych" w C. Jest to oczywiście umowne i dlatego u Kernighana jest passus "zwykle...". Twardy fakt, to to, że instrukcja warunkowa języka poleceń systemu operacyjnego if errorlevel pozwala zbadać JAKĄ ( niekoniecznie zerową) wartość zwrócił ostatnio wykonany program i na tej podstawie zróżnicować dalszy przebieg algorytmu przetwarzania realizowanego przez pisany przez nas skrypt systemowy (na gruncie terminologii Microsoftu skrypty systemowe to ... pliki wsadowe ;) ).
5. Zwracam uwagę na fakt, że dużo bardzie rygorystycznie programista musi traktować dane przesyłane do main() przez system operacyjny, które są dostępne za pośrednictwem argumentów funkcji main(). Jeśli chce skorzystać z przekazywanej informacji musi posłużyć się parametrami formalnymi funkcji main().Parametrów tych musi być ściśle określona ilość i muszą być ściśle określonego typu. Ale to już inna historia ( zainteresowani zaglądną do odpowiedniego rozdziału podręcznika C). Nota bene, puste nawiasy okrągłe w definicji main() ( lub słowo void)oznaczają, że programista będzie ignorował dane dostarczane do programu przez system operacyjny.


pozdrawiam wszystkich "dociekliwców"!

getch()

edytuj

Ten kod źródłowy do getch() w tym module - "pierwszy program" - jest chyba trochę przesadzony ;) może lepiej dać go na źródłach i link do niego?

Miałem ochotę trochę postraszyć nowicjuszy i wyleczyć ich z nawyku używania niestandardowych funkcji :P --Kj 21:14, 15 mar 2008 (CET)Odpowiedz

Błąd w wersji PDF

edytuj

W wersji PDF na stronie 14 jest błąd: "Kod funkcji umieszcza się w nawiasach klamrowych \ i \". Powinno być oczywiście "{ i }". Na stronie 18 jest taki sam błąd. -- mad5ci

Dzięki! Wszystko to przez problemy z automatyczną konwersją do LaTeX-a. Już poprawiam, przy okazji dołącze może też najnowsze zmiany. --Derbeth talk 22:06, 1 wrz 2008 (CEST)Odpowiedz
Powrót do strony „C/Pierwszy program”.