Dyskusja:C/Podstawy

Treść strony nie jest dostępna w innych językach.
Z Wikibooks, biblioteki wolnych podręczników.

Ojej, prawie po roku zauważyłem to moje niedokończone tłumaczenie :( Trzeba to wreszcie dokończyć, bo zatęchnie... CzarnyZajaczek 21:04, 20 wrz 2005 (UTC)

Zrobione :) Wyjątkowo szybko, sam jestem zaskoczony; nie jest to ścisłe tłumaczenie (tym lepiej), dodałem trochę od siebie.

"nazwy stałych piszemy wielkimi literami: SIZE" czy aby na pewno stałe? Szczerze mówiąc pierwszy raz spotkałem się z takim nazewnictwem. Wielkie litery raczej rezerwuje się dla makr a nie stałych. -- Mina86

Odp. Taki jest przyjęty zwyczaj. A makra pisze się w zależności od tego co ma wykonywać i jakie wartości zwraca, ale np. ja najczęściej spotykałem się z małym liternictwem. Stałe, a przedewszystkim stałe globalne definiuje się tradycyjnie z WIELKIEJ litery - np. MAX w f-cji rand itp. MonteChristof DMC 00:14, 5 sty 2007 (CET)[odpowiedz]

Hm, to dość powszechna umowa, stałe pisze się wielkimi literami w C, C++ i podobnych językach (Java). Wystarczy spojrzeć na [1] - tak pisze się w zasadzie wszędzie. --Derbeth talk 00:35, 5 sty 2007 (CET)[odpowiedz]
To są makra a nie stałe. Makra często są pisane wielkimi literami po to, żeby było od razu wiadomo, że to makro bo z nimi nigdy nic nie wiadomo - są rozwijane jeszcze przed kompilacją i mogą z tego wyjść różne czary nie widy. Przegrepowałem sobie poleceniem find /usr/src -name \*.c -exec grep -h '^[[:space:]]*const[[:space:]][^*[]*[A-Z][^*[]*=' -- {} + katalog, w którym mamy źródła różnych programów (konkretnie bitlbee, ed2k_gui, emacs, gkrellmbgchg, kadu, linux, mldonkey, mpdscribble, ocaml, psi i psybnc) i znalazłem tam bardzo niewiele stałych pisanych wielkimi literami. -- Mina86

W tym podręczniku "stałą" nazywamy też makro bez argumentów - gdyż zachowują się tak, jak stałe i mają zupełnie inne zastosowanie niż makra z argumentami. Jest to pewne uproszczenie, ale założeniem przyjętym w tym podręczniku było, by był on raczej przyjazny w odbiorze niż ortodoksyjnie ścisły. --Derbeth talk 15:45, 5 sty 2007 (CET)[odpowiedz]

Oj, ale Ty mówisz o stałych zadeklarowanych następująco:
const int stala = 3;
Dużo programistów traktuje tak zadeklarowaną stałą jako specjalny rodzaj zmiennej (podobnie robi także kompilator), dlatego takie zmienne pisze się małą literą. Natomiast stałe zdefiniowane przez #define prawie zawsze pisze się dużymi literami. --Kj 16:22, 5 sty 2007 (CET)[odpowiedz]
Tak się nie da - stała i makro to zupełnie inne rzeczy i tu nie chodzi o ortodoksyjną ścisłość tylko zwykłe fakty. Nie można pobrać adresu makra natomiast można pobrać adres stałej. Stała może być lokalna, makro już niezbyt. Makro mozna oddefiniować stałej nie za bardzo. Z takiego uproszczenia nic dobrego nie wyniknie. --Mina86
Szczegółowe różnice pomiędzy stałymi, zadeklarowanymi za pomocą const a tymi, zadeklarowanymi przez #define (nazywane przez Ciebie makrami) w pierwszych rozdziałach tego podręcznika na pewno namieszałyby w głowie czytelnikom. Masz rację, że stała definiowana za pomocą #define w zasadzie nie ma adresu. Zauważ jednak, że programista ma za zadanie osiągnąć pewien cel. W większości wypadków użycie #define jak i const daje dokładnie ten sam efekt - obie metody są funkcjonalnie równoważne. Mało tego - często wykorzystanie preprocesora jest dużo bardziej opłacalne (procesor ma mniej odwołań do pamięci - operacje przenoszenia wykonywane są tylko w obrębie rejestrów procesora). Zauważ także, że dużo wygodniejszą metodą jest użycie #define - nie musisz się przejmować typem danych, itp. Zauważ także, że nie ma sensu odwoływać się do adresu stałej - skoro ma ona być stała, to po co odwoływać się do jej adresu? Ponadto słowo const ma szereg innych zastosowań, których #define z pewnością nie zastąpi. Dobry przykładem jest np. poniższa funkcja:
int funkcja (const int *a)
{
/* ... */
}
Aha - i jeszcze jedno. Ten podręcznik jest przede wszystkim dla początkujących programistów, którzy prawdopodobnie pierwszy raz stykają się z tym językiem. Dlatego też musimy przyjmować pewne uproszczenia oraz dostosowywać się do powszechnie panujących zwyczajów aby osoba, która przeczyta ten podręcznik mogła spokojnie analizować kod napisany przez innego człowieka. --Kj 21:48, 5 sty 2007 (CET)[odpowiedz]
Z większością tego co mówisz śmiem się niezgodzić, ale odbiegamy już od tematu. Jedyne o co mi chodzi to zmiana "nazwy stałych piszemy wielkimi literami" na "nazwy makr psizemy wielkimi literami", a to na pewno nie spowoduje mętliku w głowach czytelników. --Mina86
A ja nawet mogę się w pewnych punktach z tobą zgodzić, ale będę obstawał przy tym, że czytelnik w tym miejscu podręcznika nie powinien się przejmować czymś takim jak "makra", bo jeszcze mu się skojarzy to z makrami w Wordzie i będzie niedobrze. Człowiek, który liznął coś np. z Pascala (jak wielu uczniów liceów czy tam gimnazjów), wie, co to stała, ale czym jest makro pewnie nie. "Less is more". Im mniej napiszemy na samym początku, tym lepiej będzie to zrozumiałe (oczywiście, bez popadania w przesadę, coś trzeba wyjaśnić). --Derbeth talk 23:39, 5 sty 2007 (CET)[odpowiedz]
OK, ale stwierdzenie, że istnieje konwencja nazywania stałych wielkimi literami jest nieprawdziwa. Może chociaż w takim razie "nazwy stałych definiowanych przu pomocy #define piszemy wielkimi literami: SIZE"? --Mina86
Widzę że dyskusja na ten temat już prawie zamarła ale muszę zdecydowanie wyrazić sprzeciw porównując #define jako stałe, to nie ma nic wspólnego ze stałymi, #define bez(x) ( ((x) < 0) ? -(x) : (x) ) czy coś takiego można podstawić jako stałą ? nie !! I czy to na początku czy też w późniejszych działach książki należy wyraźnie zaznaczyć że to nie ma nic wspólnego ze stałymi. #define to rodzaj makra lub też jak kto woli określeń aliasów które przed kompilacją zastępuje dany ciąg znaków innym wyrażeniem. I na to radził bym zwrócić uwagę ! >>mtfk
Popieram, najlepiej wyraźnie zaznaczyć, że są to dyrektywy preprocesora, a nie uczyć jakiejś mowy potocznej, a potem być zmuszonym komentować w nawiasach o jakie "stałe" chodzi. Jako pewien wzorzec przyjazności polecam kurs C Piotra Grabowskiego.

Aktualny jest standard ISO 9899:1999 (C99). Proponuję nie zniechęcać do komentowania podwójnym ukośnikiem, a jedynie zaznaczyć, że starsze kompilatory nie znają tego sposobu, więc kompilacja się nie powiedzie.

C to język proceduralny[edytuj]

Jeżeli chodzi o podstawy to wydaje mi się że ważniejszą sprawa np. do schematów blokowych :/ jest to że C to język proceduralny oparty o procedury (funkcje), to jest fundament poznania języka C, tak bynajmniej mi się wydaję. Niestety w całym dziale na temat podstaw nie jest ani razu przetoczone że C to język proceduralny myślę że należało by to zdecydowanie przemyśleć i np. całą tą historię związaną ze schematami blokowymi (jakoś źle mi się to kojarzy) zastąpić właśnie procedurami co to jest dlaczego tak jak to działa i że C jest o ten system zbudowany jest zbudowany z procedur praktycznie wszystko w C jest procedurą.

Pozdrawiam mtfk