Znowu skoncentruję się na języku C, jeśli chodzi o premierowy artykuł na mojej stronce. Na podstawie wielu spostrzeżeń w Internecie zauważyłem, że wiele razy był poruszany jeden istotny temat kręcący się wokół tekstów, czyli łańcuch znaków w języku C. Tutaj sprawa robi się dużo bardziej mozolna niż przy dzisiejszych abstrakcyjnych rozwiązaniach operujących na łańcuchach. Dowiedzcie się jaki najczęściej popełniany błąd jest przez początkujących w języku C, a na który ja sam również wpadłem kilka razy. Chodzi o literał znakowy.
Na dzisiejszy dzień malutka dawka nowej porcji wiedzy odnośnie języka C. Analizując co już napisałem a czego jeszcze nie, postanowiłem sięgnąć wstecz do dużo prostszych zagadnień i zająć się omawianiem modyfikatora funkcji "printf" i "scanf", który jest mało znany. Modyfikator to coś innego niż specyfikator. Oznacza on możliwość wywierania wpływu na formatowanie danych wyjściowych w miejsce wprowadzonego specyfikatora, który podlega zmianie na odpowiedni parametr. Dzisiaj poruszę wątek co nam daje modyfikator gwiazdki, choć w rzeczywistości to jest "asterysk" (ang. "asterisk"), który jest na tyle wyjątkowy, że oznacza on coś zupełnie innego zarówno dla jednej, jak i dla drugiej funkcji. Zweryfikujcie ponownie swoje twierdzenie czy rzeczywiście znacie już wszystkie modyfikatory.
Czas na sfinalizowanie tablic w języku C! Oto Waszym oczom ukazują się ostatnie akapity odnośnie różnorodności tablic. Sam jestem zaskoczony, że jest tego aż tyle. Okazuje się po tym wszystkim, że tablica w języku C nie kończy się na jednym sposobie budowania. Zaprezentowałem Wam już wiele metod, a teraz czas na tę ostatnią odmianę jaką jest literał złożony w języku C. Co prawda, to nie dotyczy stricte tablic, bo w ten sposób można definiować również struktury, aczkolwiek skoro nadal przy tym jesteśmy, załatwmy to raz-dwa i zamknijmy za sobą drzwi.
Czas wrócić do niedokończonego epizodu na temat tablic w języku C! Zakończmy te dwa artykuły, o których była mowa. Teraźniejszy temat to będzie tablica o zmiennym rozmiarze (ang. "variable length array"), czyli w skrócie "VLA" w języku C, to kolejny dodatek standardu C99 z 1999 roku wprowadzony przez organizację ISO. Patrząc na termin to trochę może być dziwne rozumowanie czym konkretnie jest "zmienny rozmiar". Czyżby język C oferował jakąś prototypową rewolucję w postaci tablicy dynamicznej? A może chodzi o możliwość wprowadzania do funkcji tablic o różnych rozmiarach, nie tylko sztywno ustawionych w kodzie? Rozwiejmy te wątpliwości raz na zawsze.
Na dzisiejszy wieczór mam kolejną małą porcję wiedzy. Pisałem już o tym parę razy w ostatnim czasie, jednak występowało to jedynie w roli "epizodycznej". Teraz chcę to osadzić w roli głównej i opisać dokładnie ze szczegółami. Mianowicie, poświęcę artykuł na wyjaśnienie czym jest dereferencja wskaźnika w języku C, zatem o języku C raz kolejny i na pewno nie ostatni :)!
Słyszeliście o terminie "kompilacja warunkowa"? Kompilacja warunkowa w języku C działa bardzo podobnie jak zwykła instrukcja warunkowa z tą różnicą, że tłumaczy odpowiedni fragment kodu źródłowego w zależności od spełnienia warunku. Wynik warunku jest zależny od stałych preprocesora! W ten sposób staje się możliwe tworzenie o wiele bardziej przenośnych programów na różne platformy bez duplikowania kodów źródłowych! O tym, jak z tego korzystać i jak to wygląda w praktyce piszę w środku :).
Gotowi na ostatnią część wyjątkowo "logicznego" rozdziału? Poprzednie części są tutaj i tutaj. Mogłem co prawda od razu to pokazać, aczkolwiek chciałem iść zgodnie z historią rozwoju tego potężnego języka (bo język C jest potężny nad wyraz) i przedstawić najpierw radzenie sobie bez typu "bool" w C przez 1999 rokiem, a potem pokazać jak wyglądała pierwsza wersja "booleana". W tym momencie chcę zademonstrować kolejny zapis a właściwie bibliotekę, która pozwala pisać tak samo jak w językach wyższej abstrakcji czyli z podziałem na "true" i "false". Biblioteka o której mowa nosi w języku C nazwę "stdbool.h". Dołączacie ją do swojego programu i już o nic nie musicie się martwić w tym zakresie.
Z dużym opóźnieniem po zajęciach mogę wreszcie Wam okazać dalszą część tematu rozpoczętego wczoraj. Mówiliśmy o tym, że w języku C nie było możliwości korzystania z logicznego typu danych. Mam dla Was kolejną wiadomość. Od 1999 roku wraz z wprowadzeniem standardu C99, niemożliwe stało się możliwe! Wartość logiczna w języku C zaczęła istnieć tylko jako..."Bool"! Bez żadnych bibliotek, wspomagaczy zewnętrznych czy haczyków! Przejdźmy do szczegółowego omówienia.
Zanim rozpoczniemy czytankę, chcę powiedzieć o małej zmianie tematów artykułów. Z powodu ponownego wtrącenia się zajęć zdalnych u mnie na uczelni, nie dam rady w chwili obecnej kontynuować materiału o tablicach. Zostały jeszcze dwa wątki, które z przyczyn ode mnie niezależnych (nie wyrobię się po prostu) przesunę na ten weekend. Aby dać sobie nieco odetchnąć, postanowiłem w takim razie rozpocząć kolejny rozdział dotyczący wartości logicznych w języku C. Opowiem Wam jak sobie radzić w niektórych sytuacjach mających związek z wyrażeniami logicznymi, jeśli logiczny typ danych w języku C nie istnieje! To jest część pierwsza, czyli wyjaśnienie jaką wartością i jakim typem danych charakteryzuje się "prawda" i "fałsz" bez typu logicznego.
Zapraszam na kolejną część tłumaczenia notacji wskaźnikowej obowiązującej w języku C. Wczoraj wieczorem była tablica jednowymiarowa, a teraz pokażę jak wygląda notacja wskaźnikowa do tablicy dwuwymiarowej. Wszyscy Ci, co pominęli pierwszą część, zapraszam tutaj. Jeśli myśleliście, że ostatni artykuł przyprawia o zawrót głowy, tutaj dopiero zacznie się wyrywanie włosów z głowy :)!
Ponownie poruszę zagadnienie na temat relacji pomiędzy tablicą, a wskaźnikiem w języku C i C++. Wątek ten jest albo wymagany, albo poboczny w zależności od tego, w jakim języku piszecie (albo chcecie pisać) na co dzień. Zakładając, że przeczytaliście wprowadzenie do wskaźników, mogę Was poprowadzić za rękę dalej i zaprezentować Wam jak wygląda notacja wskaźnikowa w języku C do identyfikowania odpowiedniego elementu w tablicy. Tutaj jedynie Was wprowadzę do tematu, a w kolejnej części zastaniecie zapisy dla tablicy dwuwymiarowej. Tam dopiero się dzieje! Na razie, przeanalizujemy tablicę jednowymiarową. Zapraszam!
Na dzisiaj mam dla Was treść materiału dotyczącą wskaźników w języku C. Ze względu na ostatnie wydarzenia w ciągu tych kilku dni, postanowiłem podzielić się zdobytą wiedzą na ten temat mając szansę utrwalić sobie ten materiał. Na razie takie proste podpunkty. Dowiemy się czym są wskaźniki w języku C, jak je utworzyć w kodzie, co się pod nimi kryje oraz w jaki sposób mogą nam ułatwić pisanie kodu. Do dzieła!
Enumeracja to odrębna gałąź w programowaniu, która też wymaga porządnego wyjaśnienia. Typ wyliczeniowy (identyfikowany jako "enum" w języku C) również znajduje swoją użyteczność na wielu płaszczyznach i każdy porządny programista powinien tę strukturę znać. Co to jest "enumeracja"? Jak ją utworzyć? Jak ją można wykorzystać w praktyce i do jakich celów?
Dziwi Was tytuł artykułu? Zdziwię Was jeszcze bardziej do tego stopnia, że mogę zaburzyć Wasz dotychczasowy punkt widzenia na tablice w języku C. Może nie samą ich strukturę, ale sposób przetwarzania przez komputer. Tak naprawdę to nie są tablice, ale wskaźniki do poszczególnych argumentów! Koniecznie zobaczcie jak wygląda tablica jako wskaźnik, a jeszcze sobie za to podziękujecie.
Mały kąsek informacji dotyczący tworzenia tablic w języku C (gdyby ktoś chciał poznać tablicę gruntownie od teoretycznej strony, zapraszam tutaj). Mimo tego, że przedstawiona tutaj metoda wprowadzania argumentów może jedynie komplikować, to chcę żebyście i tak byli poinformowani o takiej możliwości. Standard języka wprowadzony w 1999 roku przez ISO udostępnia drugi sposób. Po raz kolejny pokażę dwa sposoby celem porównania. Zobaczymy jak wygląda "tradycyjna" tablica w języku C, a potem drugą opcjonalną metodą od standardu C99.
Kolejny rozdział poświęcony językowi C. Przyjrzymy się być może dla niektórych z Was nietypowemu zapisowi w kodzie źródłowym. Chodzi o funkcje. Zarówno w tym języku, jak i w C++, to nie wygląda tak, że wstawimy sobie funkcję gdzie chcemy i mamy z bani. Języki te są bardzo wyczulone na położenie zarówno deklaracji, jak i definicji funkcji. Robi to jakąś różnicę? Jak najbardziej i to DUŻĄ. Bo przy deklaracji wstawiamy prototyp funkcji w języku C, a przy definicji "pełną" jej strukturę. Zapraszam po wyjaśnienia.
Wyobraźcie sobie, że nawet ze zwykłego przekazywania parametrów aktualnych do funkcji można zrobić temat na artykuł. Ja tak zrobiłem, gdyż i tutaj występuje zróżnicowanie w pisaniu. Większość języków programowania przekazuje zwykle do funkcji kopię wartości, co ma uchronić przed utratą wartości pierwotnej znajdującej się na zewnątrz danej funkcji. W języku jaki opisuję jest jeszcze jeden sposób: przekazywanie przez referencję w języku C. Jak to zrobić i jaki to ciągnie za sobą skutek? Czytajcie, a się dowiecie!
Powrócimy znowu do języka C prezentując całkowicie już archaiczną instrukcję skoku, która była wykorzystywana w czasach nałogowego używania języka FORTRAN. Słowa kluczowe "break" i "continue" przyszły później, najpierw było "goto". Tak się składa, że "goto" w języku C również występuje do dnia dzisiejszego. Od razu napiszę, nie przerzucajcie się na to! To już jest mocno przestarzała instrukcja od co najmniej 20 lat. Tak więc potraktujcie ten artykuł jak zapoznanie się z częścią historii programowania w latach .60 i .70.
Ponad dwa tygodnie temu poświęciłem artykuł na temat funkcji "printf". Ze względu na mocno ograniczony czas, pozwólcie że teraz napiszę to samo tylko o funkcji "scanf" w języku C, która również jest częścią standardowej obsługi wejścia-wyjścia. Jeśli jest jakiś problem z określeniem specyfikatora formatu, po prostu zjedźcie na dół i popatrzcie na tabelkę. Być może, że właśnie w niej znajduje się odpowiedź na Wasze pytanie.
Drugi artykuł w dniu dzisiejszym poświęcony będzie znowu językowi C. Zamiast prezentowania kodu, zwrócę uwagę teraz na pewien słowniczek pojęć z nim związanych. Usłyszeliście na lekcji czy wykładzie jakiś termin, który wprawił Was w mocne zdezorientowanie? Mam nadzieję, że jeden z nich będzie przedstawiony tutaj, a Wasze kłopoty zostaną zażegnane. Przed Wami, spora terminologia języka C!
Skonfrontuję dzisiaj dwa rodzaje tworzenia stałych w języku C. Warto wiedzieć, że w tym języku (jak również w C++) można tworzyć stałe korzystając ze sformułowania "#define" lub "const". Jedno dotyczy preprocesora, a drugie kompilatora. Różnic jest o wiele więcej...
Sobota ma być dniem przyjemnym z powodu początku weekendu. Aby odejść trochę od tworzenia gier, napiszę z tej okazji na całkiem odmienny temat, który jest związany z językiem C i jego jedną z podstawowych funkcji dla danych wyjściowych. Mam tu na myśli "printf". "printf" w języku C jest na 99% przypadków pierwszą funkcją, którą poznajecie podczas uczenia się języka C (nie licząc punktu startowego jakim jest "main" ;)).