Programowanie w języku C

Podobne dokumenty
Programowanie. Ćwiczenie Język C. Środowisko programowania Visual Studio

Ćwiczenie Obsługa klawiatury i myszy

#line #endif #ifndef #pragma

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Języki i metodyka programowania. Wprowadzenie do języka C

2 Przygotował: mgr inż. Maciej Lasota

1 Podstawy c++ w pigułce.

Funkcja (podprogram) void

Zmienne, stałe i operatory

Wstęp do Programowania, laboratorium 02

Część 4 życie programu

Wykład II Tablice (wstęp) Przykłady algorytmów Wstęp do języka C/C++

I - Microsoft Visual Studio C++

1 Podstawy c++ w pigułce.

Programowanie strukturalne i obiektowe

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Wykład 1

Co nie powinno być umieszczane w plikach nagłówkowych:

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Język C część 1. Sformułuj problem Zanalizuj go znajdź metodę rozwiązania (pomocny może byd algorytm) Napisz program Uruchom i przetestuj czy działa

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

PROGRAMOWANIE w C prolog

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Język C - podstawowe informacje

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 3. Karol Tarnowski A-1 p.

Ćwiczenia laboratoryjne. Oprogramowanie i badanie prostych metod sortowania w tablicach

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Programowanie strukturalne język C - wprowadzenie

Podstawy programowania skrót z wykładów:

Pliki. Informacje ogólne. Obsługa plików w języku C

Metodyki i Techniki Programowania MECHANIZM POWSTAWANIA PROGRAMU W JĘZYKU C PODSTAWOWE POJĘCIA

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Podstawy programowania C. dr. Krystyna Łapin

Laboratorium 3: Preprocesor i funkcje ze zmienną liczbą argumentów. mgr inż. Arkadiusz Chrobot

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Język ludzki kod maszynowy

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Biblioteka standardowa - operacje wejścia/wyjścia

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Argumenty wywołania programu, operacje na plikach

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

Programowanie Proceduralne

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

Wykład I. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Spis treści WSTĘP CZĘŚĆ I. PASCAL WPROWADZENIE DO PROGRAMOWANIA STRUKTURALNEGO. Rozdział 1. Wybór i instalacja kompilatora języka Pascal

PRYWATNA WYŻSZA SZKOŁA BUSINESSU, ADMINISTRACJI I TECHNIK KOMPUTEROWYCH S Y L A B U S

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Wykład 2 Składnia języka C# (cz. 1)

Podstawy programowania - 1

PMiK Programowanie Mikrokontrolera 8051

Funkcje zawarte w bibliotece < io.h >

Programowanie strukturalne i obiektowe : podręcznik do nauki zawodu technik informatyk / Adam Majczak. Gliwice, cop

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

OPERACJE WEJŚCIA / WYJŚCIA. wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout)

Informatyka, Ćwiczenie Uruchomienie Microsoft Visual C++ Politechnika Rzeszowska, Wojciech Szydełko. I. ZałoŜenie nowego projektu

Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Funkcje zawarte w bibliotece < io.h >

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Podstawy programowania komputerów

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Microsoft IT Academy kurs programowania

1. Wprowadzanie danych z klawiatury funkcja scanf

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Laboratorium Systemów Operacyjnych. Ćwiczenie 4. Operacje na plikach

Funkcje. czyli jak programować proceduralne. Programowanie Proceduralne 1

Kompilator języka C na procesor 8051 RC51 implementacja

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

Podstawy programowania. Wykład: 12. Struktury, unie, pola bitowe. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

Wstęp do Programowania 2

Wstęp do programowania. Wykład 1

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Wstęp do programowania

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

Typ użyty w deklaracji zmiennej decyduje o rodzaju informacji, a nazwa zmiennej symbolicznie opisuje wartość.

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Podstawy programowania w języku C++

Pliki. Informacje ogólne. Obsługa plików w języku C

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 9 - sem.iii. Dr inż. M. Czyżak

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Wskaźniki. Informatyka

Spis treści PLIKI BINARNE W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF23

1. Brian W. Kernighan, Dennis M. Ritchie, Język ANSI C, WNT, Warszawa 1998.

Spis treści PLIKI BINARNE W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF23

Programowanie w językach wysokiego poziomu

Język C zajęcia nr 11. Funkcje

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Proste typy zmiennych języka C++ *) Zapis 3.4 e-38 jest równoważny zapisowi 3,

Transkrypt:

Wprowadzenie do języka programowania C. Programowanie w języku C Język C to imperatywny, strukturalny język programowania stworzony na początku lat siedemdziesiątych (1972 rok) przez Denis M. Ritchie. Nazwa języka związana z językiem ALGOL-60. Pierwsza wersja nowego języka miała nazwę "A", następna wersja - "B", i na końcu - "C". Język C opisali Brian W. Kernighan i Denis M. Ritchie w 1988 roku. Język jest standaryzowany od 1989 roku: standard ISO/IEC 9899:1989, w skrócie "C89", późnej powstał standard ISO/IEC 9899:1990, w skrócie "C90". Ostatni standard ISO/IEC 9899:1999 był opublikowany 1999-12-01 i jest nazywany standardem "C99". Trwają prace nad rozwinięciem standardu C99. Instytut ANSI nie udostępnia standardy bezpłatnie. Cena udostępnienia C99 349$. Każdy ze standardów opisuje język, preprocesor i bibliotekę funkcji. Struktury danych, stałe i prototypy funkcji bibliotecznych są zdefiniowane w plikach nagłówkowych.

W standardzie języka C jest podana zawartość plików nagłówkowych przedstawionych w tab. 1. Tabela 1. Standardowe pliki nagłówkowe w ANSI C Plik nagłówkowy assert.h ctype.h errno.h float.h limits.h locale.h math.h setjmp.h signal.h stdarg.h stddef.h stdio.h stdlib.h string.h time.h Przeznaczenie Definiuje makro assert używane do diagnostyki programu Deklaruje funkcje do klasyfikacji i konwersji znaków Definiuje makro dla warunków błędu, EDOM i ERANGE, oraz zmienną całkowitą errno, poprzez którą funkcje biblioteczne zwracają kod błędu Definiuje zakres wartości, które mogą być zapamiętywane w typach zmiennoprzecinkowych Definiuje wartości ograniczające dla wszystkich danych typu całkowitego Deklaruje strukturę lconv i funkcje niezbędne do przystosowania programu w C do poszczególnych środowisk lokalnych Deklaruje funkcje matematyczne oraz makro HUGE_VAL Definiuje funkcje setjmp oraz longjmp, które mogą przekazywać kontrolę z jednej funkcji do drugiej bez opierania się na wywołaniach i powrotach z funkcji. Definiuje również typ danych jmp_buf używany przez setjmp i longjmp. Definiuje symbole i procedury niezbędne dla obsługi wyjątków. Definiuje makra, które umożliwiają dostęp do nienazwanych argumentów w funkcji, która akceptuje zmienną liczbę argumentów Definiuje standardowe typy danych ptrdi_t, size_t, wchar_t, symbol NULL oraz makro offsetof Deklaruje funkcje i typy danych niezbędne do obsługi operacji we/wy. Definiuje makro takie jak BUFSIZ, EOF, NULL, SEEK_CUR, SEEK_END i SEEK_SET Deklaruje wiele funkcji, w tym procedury konwersji łańcuchów, generator liczb losowych, procedury alokacji pamięci i procedury kontroli procesów (takie, jak abort, exit i system) Deklaruje funkcje do manipulowania łańcuchami takie, jak strcmp i strcpy Deklaruje typy danych i definiuje funkcje do manipulowania czasem. Definiuje typy clock_t i time_t oraz strukturę danych tm

Język C wywarł wielki wpływ na inne języki programowania. Język C jest bazą najpopularniejszego języka programowania C++. Istnieją liczne kompilatory dla programów napisanych w języku C. Popularne kompilatory to bc.exe i bcc32.exe firmy Borland, kompilator ml.exe firmy Microsoft, kompilator OpenWatcom C/C++ Compiler firmy Watcom, kompilator Bloodshed Dev-C++ Compiler. Istnieją liczne kompilatory dla języka C skierowane na mikrokontrolery i mikroprocesory. W języku C zwykle są tworzone aplikacje działające w trybie konsolowym. W trybie konsolowym aplikacja przyjmuje z klawiatury kody znaków, a monitor wyświetla tylko znaki (działa w tzw. "trybie tekstowym"). W języku C można programować też aplikacje działające w trybie graficznym. Powstanie środowisk graficznych dla języka C++ spowodowało, że programy dla trybu graficznego stosunkowo rzadko powstają w języku C.

Struktura programu w języku C Pliki z programami w języku C mają standardowe rozszerzenie ".c". W języku C deklaracje i definicje globalnych zmiennych powinny być na poczatku pliku, a deklaracje i definicje lokalnych zmiennych - na początku podprogramu. Program w języku C musi zawierać obowiązkowo podprogram z nazwą "main" mający typ int. Funkcja (podprogram, procedura) "main" ma trzy argumenty: int main(int argc, char* argv[], char* envp[]) { /*** instrukcje ***/ } Gdzie: "argc" jest ilością elementów argumentu - tablicy "argv", "argv" jest tablicą wskaźników na wierszy z wiersza poleceń, "envp" jest tablicą wskaźników na wierszy z przestrzeni środowiska. Elementy tablicy "argv" wskazują na pojedyncze wierszy wiersza poleceń zastosowanego przy wywołaniu aplikacji. Na przykład, niech aplikacja "aplik" jest wywołana następująco: aplik.exe eksperim.txt 10 Elementy tablicy "argv" w tym przypadku: argv[0] = wskaźnik na wiersz "aplik.exe", który jest nazwą aplikacji (w środowisku Visual C++ nie jest to gwarantowane), argv[1] = wskaźnik na wiersz "eksperim.txt" (pierwszy parametr wywołania), argv[2] = wskaźnik na wiersz "10" (drugi parametr wywołania). Elementy tablicy "envp" wskazują na pojedyncze wierszy przestrzeni środowiska, co daje możliwość wykorzystania ustawień systemowych. Na koniec tablicy wskazuje zerowy element, tj. element z wartością NULL. Funkcja "main" musi być zakończona przez instrukcję "return N", gdzie N - wartość, która jest zwracana do środowiska operacyjnego. Często N jest ustawiane na 0: return 0; W środowisku Visual C++ funkcja (podprogram, procedura) "main" może być bez argumentów: int main(void) { /*** instrukcje ***/ return 0; }

Kompilator Visual C++ przyjmuje też amorficzną wersje funkcji "main": void main(void) { /*** instrukcje ***/ return; } która nie zwraca wartości i dlatego może nie być zakończona przez instrukcję "return": void main(void) { /*** instrukcje ***/ } Oprócz funkcji "main" program może zawierać: instrukcje preprocesora, podprogramy podprogramu "main".

Dyrektywy preprocesora Polecenia programu przeznaczone dla kompilatora nazywamy dyrektywami przeprocesora. Preprocesor jest funkcjonalną częścią kompilatora. Preprocesor przygotowuje tekst programu do kompilacji. Dyrektywa include wskazuje na wstawiane innego pliku. Przykłady: #include <stdio.h> #include ".\\include\\kolo.h" Jeśli wstawiany plik należy do plików systemu programowania, to stosują się nawiasy "<", ">", w innym przypadku mają zastosowanie cudzysłowy. Dyrektywa #define służy do definicji identyfikatorów i makrodefinicji, a dyrektywa #undef - do rezygnacji z definicji. Dyrektywy #if, #ifdef, #ifndef, #else, #elif, #endif są grupą dyrektyw warunkowych. Uogólniona struktura, która stosuje się dla tej grupy: #if <warunek> lub #ifdef <identyfikator> lub #ifndef <identyfikator> <grupa_instrukcji_lub_dyrektyw> #elif <warunek> <grupa_instrukcji_lub_dyrektyw> #else <grupa_instrukcji_lub_dyrektyw> #endif

Dyrektywy #ifdef, #ifndef są stosowane do sprawdzania, czy identyfikator był zdefiniowany, czy nie. Przykład: #define NULL 0 #define max(a,b) ((a>b)? a: b) #define STDIO_H... #ifndef STDIO_H #define STDIO_H #endif Wewnątrz dyrektyw warunkowych działa operator defined, który zwraca wartość 1, gdy identyfikator jest zdefiniowany, lub wartość 0, gdy nie jest. Przykład: //--- plik stdio.h --- #if!defined( STDIO_H)) #define STDIO_H #endif Pliki nagłówkowe często zawierają dyrektywy, które mają na celu wyeliminować powtórną kompilację pliku. Na przykład: //--- plik stdio.h --- #ifndef STDIO_H #define STDIO_H... <instrukcje_lub_dyrektywy>... #endif Dyrektywa #line jest stosowana do przełączenia kompilatora na inny wiersz i opcjonalne na inny plik. Składnia dyrektywy: #line <numer_wierszu> [<nazwa_pliku>] Przykład: #line 177 "nowy.c"

Dyrektywa #error wprowadza komunikat, który będzie wyświetlony w chwili kompilacji. Składnia dyrektywy: #error "tekst_komunikatu" Przykład: #ifndef STDIO_H #error "Brak pliku \"stdio.h\"." #endif Dyrektywy #pragma są stosowane często. Dyrektywa #pragma ma strukture: #pragma token-string parametry (opcje) Dyrektywy pragma zastosowane w Visual C++ dla języka C Token-string alloc_text auto_inline bss_seg check_stack code_seg comment component const_seg data_seg deprecated fenv_access float_control fp_contract function hdrstop include_alias inline_depth inline_recursion intrinsic make_public managed Zastosowanie Łączenie funkcji i sekcji, w której ona może być stosowana Zezwolenie/zakaz trybu automatycznego wstawiania dla funkcji Zaznacza segment z danymi, które nie potrzebują inicjalizacji Powoduje sprawdzanie stosu na przepełnienie Zaznacza segment z programem Umieszcza komentarz w kodzie obiektowym Włącza/wyłącza akumulację danych dla wykrywacza błędów Zaznacza segment z danymi, które są stałe Zaznacza segment z danymi, które potrzebują inicjalizacji Zaznacza element, który już nie jest stosowany Włącza/wyłącza optymalizację Steruje dokładnością obliczeń liczb rzeczywistych Steruje redukcją liczb rzeczywistych Zakazuje wstawianie funkcji Od miejsca zaznaczonego przez hdrstop wynik kompilacji nie jest przechowywany Wprowadza alias (skrót) dla długiej nazwy pliku Wprowadza "głębokość" dla funkcji wstawianych Steruje rekurencją dla funkcji wstawianych Zakazuje wstawianie Wskazuje typ z dostępem publicznym Steruje typem "managed/unmanaged"

message once optimize pack pop_macro push_macro region, endregion runtime_checks section setlocale unmanaged warning Zatrzymuje kompilację i wprowadza komunikat Zakaz powtórnej kompilacji Włącza/wyłącza optymalizację Ustawia krok rozmieszczenia elementów struktury, unii lub klasy Zdejmuje ze stosu wartość makrodefinicji Odkłada na stos wartość makrodefinicji Zaznacza granice fragmentu tekstu wyświetlanego przez edytor Visual Studio Ustawia sprawdzanie stosu w czasie wykonania aplikacji Zaznacza początek sekcji Ustawia opcje regionalne i językowe Steruje typem "managed/unmanaged" Steruje blokowaniem ostrzeżeń Makra predefiniowane: DATE - aktualna data; FILE - aktualny plik; LINE - aktualny wiersz; STDC stała równa 1; STDC_HOSTED - stała 1, gdy aplikacja jest główną, lub 0, gdy nie; STDC_VERSION - stała 199901L; TIME - czas kompilacji. Typy standardowe Liczbowe typy danych języka C są przedstawione w niżej położonej tabeli. Rodzaj danych i zakres wartości Typ Rozmiar w bajtach Liczba całkowita od -128 do +127 signed char 1 Liczba całkowita bez znaku od 0 do 255 unsigned char (lub char) 1 Liczba całkowita od -32768 do +32767 short int (lub short) 2 Liczba całkowita bez znaku od 0 do 65535 unsigned short int (lub unsigned short) 2 Liczba całkowita od -2147483648 do +2147483647 long int(lub long, lub int) 4 Liczba całkowita od 0 do +4294967295 unsigned long int 4 (lub unsigned long) (lub unsigned int) Liczba całkowita od -9223372036854775808 long long int 8 do +9223372036854775807 (lub long long) Liczba całkowita bez znaku od 0 unsigned long long int 8 do 18446744073709551615 (lub unsigned long long) Liczba rzeczywista ze znakiem, float 4 dokładność 7 cyfr Liczba rzeczywista ze znakiem, double 8 dokładność 15 cyfr Liczba rzeczywista ze znakiem, dokładność 18 cyfr long double 10

Znakowe typy danych języka C są przedstawione w niżej położonej tabeli. Rodzaj danych i zakres wartości Typ Rozmiar w bajtach Znak w kodzie rozszerzonego ASCII signed char, unsigned char 1 Znak w kodzie UNICODE UTF-16 short int, unsigned short int 2 Znak w kodzie UNICODE UTF-32 long int, unsigned long int, float 4 W języku C nie ma typu logicznego. Dla deklaracji zmiennych z dwoma wartościami fałsz i prawda stosuje się typ "int" oraz wartości 0 i nie 0. Funkcje standardowe Funkcja printf wyprowadza dane do strumienia wyjściowego stdout, tj. na ekran monitora w trybie tekstowym. Zaznaczając słowo "printf" i naciskając F1 można otrzymać pełną informację o tej funkcji, a w tym o nazwie pliku nagłówkowego stdio.h zawierającego deklarację funkcji. Aby wprowadzić nazwie pliku nagłówkowego, należy na początku programu dodać instrukcję preprocesora, na przykład: #include <stdio.h> Funkcja getch czeka na wprowadzenie znaku z klawiatury. System operacyjny Windows też "czeka", i okno nie znika. Funkcja getch zwraca kod znaku. Opis funkcji getch znajduje się w pliku conio.h. Należy na początku pliku dodawać instrukcję dla preprocesora: #include <conio.h>

Programowanie z zastosowaniem funkcji API Win32 W programowaniu aplikacji Windows są używane funkcje API (Application Programming Interface). Wewnątrz systemu Windows funkcja API wykorzystuje funkcje przerwań MS-DOS, ale programista nie widzi tego i pracuje jakby o jeden poziom wyżej. Ponieważ ilość funkcji API przekracza 2000, programowanie aplikacji Windows nie jest możliwe bez dokumentacji Microsoft Win32 Programmer s Reference. Aplikacje Windows można rozdzielić na następujące grupy 1 : o aplikacja bezokienkowa, o aplikacja klasyczna korzystająca z jednego głównego okna, o aplikacja dialogowa, w której główne okno jest oknem dialogowym, o aplikacja konsolowa, w której główne okno jest oknem konsoli, o usługa specjalizowana aplikacja lub biblioteka dynamiczna, o sterownik - aplikacja lub biblioteka dynamiczna sterująca urządzeniem peryferyjnym. Funkcje API (Application Programming Interface) Win32 Na początku programu z funkcjami API Win32 należy dodawać instrukcję dla preproceso- #include <windows.h> ra: Funkcje API Win32 przyjmują parametry tylko przez stos; nie stosuje się przekazywania parametrów przez rejestry. Nazwa bibliotecznej funkcji API może być trochę inna niż nazwa pokazana przez system na ekranie pomocy. Na przykład w bibliotekach import32.lib i user32.lib znajduje się funkcja WriteConsoleA, a na ekranie widzimy informacje o funkcji WriteConsole. Dodatkowa litera A w nazwie funkcji WriteConsoleA i podobnych funkcji odpowiada rodzaju tej funkcji dla wierszy w kodzie ANSI. Jeśli na końcu nazwy funkcji jest litera W, to funkcja współdziała z wierszami UNICODE. Na zakończenie swojej pracy funkcja API przez rejestr EAX zwraca wartość, która świadczy o wyniku procedury. Często wartość 0 lub wartość dodatnia odpowiadają pomyślnemu zakończeniu działań, a wartość -1 wskazuje na niepowodzenie. W przypadku niepowodzenia funkcja API wywołuje funkcję SetLastError, do której przekazuje podwójne słowo z kodem niepowodzenia. Ten kod można przeczytać wywołując funkcje GetLastError bezpośrednio po wywołaniu funkcji API. W dwóch starszych bitach (31 i 30) słowa z kodem zwróconym funkcją GetLastError może być: 00 wywołana wcześniej funkcja jest zakończona z powodzeniem, 01 kod jest numerem komunikatu informującego, 10 kod jest numerem ostrzeżenia, 11 kod jest numerem błędu. Kody niepowodzenia funkcji API Win32 mają 0 w bicie 29. Programista może wprowadzić w swoim programie kody niepowodzeń z 1 w bicie 29 i tym samym uniknąć konfliktów z systemem operacyjnym. Część funkcji API wywołuje funkcję SetLastError w przypadku normalnego zakończenia, aby przez funkcję GetLastError przekazać informację o wyniku działania. 1 Pirogov V., Asembler. Podręcznik programisty, Wydawnictwo HELION, 2005, ISBN 83-7361-797-3

Aby komunikaty były wyświetlane na ekranie z poprawnymi polskimi literami, należy stosować funkcję AnsiToOem z zestawu "Platform SDK (Software Development Kit)", tj. funkcji API (Application Programming Interface) Win32. Funkcja AnsiToOem pobiera tekst z pierwszego argumentu - tablicy tekstowej, przekoduje i zapisuje do drugiego argumentu - tablicy tekstowej. Aby zastosować funkcję AnsiToOem należy przenieść teksty do tablic tekstowych i zdefiniować bufor tekstowy, na przykład: char tekst1[]="program w C. Autor Ąćęł Ńóśżź \r\n\r\n"; char buf[256]; AnsiToOem(tekst1,buf); printf(buf); Funkcje API Win32 związane z konsolą BOOL AllocConsole(void); Alokacja konsoli. BOOL FreeConsole(void); Zamykanie wszystkich konsoli. HANDLE GetStdHandle(DWORD nstdhandle) Pobranie deskryptora buforu konsoli: wejściowego przy nstdhandle = STD_INPUT_NANDLE, wyjściowego przy nstdhandle = STD_OUTPUT_NANDLE. BOOL SetConsoleTitleA(LPCTSTR lpconsoletitle); Wypisywanie nagłówka okna konsolowego. Argument: lpconsoletitle adres wiersza - nagłówka. BOOL SetConsoleTextAttribute(HANDLE hconsoleoutput, WORD wattributes); Ustawienie atrybutów tekstowych. Argumenty: hconsoleoutput deskryptor buforu wyjściowego konsoli, wattributes kolor. COORD GetLargestConsoleWindowSize(HANDLE hconsoleoutput); Zwraca maksymalny rozmiar okna konsoli. Argument: hconsoleoutput deskryptor buforu wyjściowego konsoli. Struktura typu COORD: typedef struct _COORD { SHORT X; //współrzędna X SHORT Y; //współrzędna Y } COORD, *PCOORD; BOOL FillConsoleOutputAttribute(HANDLE hconsoleoutput,word wattribute, DWORD nlength,coord dwwritecoord,lpdword lpnumberofattrswritten); Wpisuje do buforu wyjściowego (ekranu) atrybuty znakowe. Argumenty: hconsoleoutput deskryptor buforu wyjściowego konsoli, wattribute kolor, nlength ilość pozycji, dwwritecoord współrzędne X, Y pierwszej pozycji w oknie konsoli, lpnumberofattrswritten adres zmiennej, do której będzie zapisana faktyczna ilość pozycji.

BOOL SetConsoleCursorPosition(HANDLE hconsoleoutput,coord dwcursorposition); Ustawienie pozycji kursora. Argumenty: hconsoleoutput deskryptor buforu wyjściowego konsoli, dwcursorposition współrzędne X, Y (typ COORD) pozycji w oknie konsoli. BOOL WriteConsoleOutputCharacter(HANDLE hconsoleoutput, LPCTSTR lpcharacter,dword nlength,coord dwwritecoord, LPDWORD lpnumberofcharswritten); Wyprowadzenie znaków od pozycji kursora. Argumenty: hconsoleoutput deskryptor buforu wyjściowego konsoli, lpcharacter adres bufora z tekstem, nlength ilość znaków, dwwritecoord współrzędne X, Y pierwszej pozycji w oknie konsoli, lpnumberofcharswritten adres zmiennej, do której będzie zapisana faktyczna ilość wyprowadzonych znaków. BOOL WriteConsole(HANDLE hconsoleoutput,const VOID* lpbuffer, DWORD nnumberofcharstowrite,lpdword lpnumberofcharswritten, LPVOID lpreserved); Wyprowadzenie znaków do buforu konsoli Argumenty: hconsoleoutput deskryptor buforu wyjściowego konsoli, lpbuffer adres bufora z tekstem, nnumberofcharstowrite ilość znaków, lpnumberofcharswritten adres zmiennej, do której będzie zapisana faktyczna ilość wyprowadzonych znaków,. lpreserved rezerwa (musi być 0). Tworzenie okna konsolowego Konsolową nazywamy aplikację, w której stosuje się tylko tekstowy tryb monitora. Aplikacja konsolowa przyjmuje polecenia użytkownika z klawiatury lub od myszy oraz wyświetla wyniki pracy w postaci tekstu. Aplikacja konsolowa może być otwarta w osobnym oknie lub aplikacja może korzystać z okna, które Windows otwiera spod punktu menu Start/ Programy/ Akcesoria/ Wiersz poleceń. Do zalet aplikacji konsolową należy szybkość jej napisania, co wynika z prostego faktu, że nie trzeba opracowywać graficzną część aplikacji. System Windows tworzy okno konsoli jako okno najprostszego rodzaju i kieruje do okna minimalną ilość komunikatów. Do komunikacji z oknem konsoli Windows tworzy trzy bufory: wejściowy, przez który konsola przyjmuje symboli z klawiatury, wyjściowy, zawartość którego jest wyświetlana przez konsolę, komunikatów o błędach. Każdy z buforów posiada deskryptor. Do pobrania deskryptora buforu służy funkcja API GetStdHandle. Na rodzaj deskryptora wskazuje stała STD_INPUT_HANDLE lub STD_OUTPUT_HANDLE. W aplikacjach konsolowych często jest stosowana funkcja CharToOem, która zamienia kody znaków tekstu na kody OEM (Original Equipment Manufacturer), aby konsol wyświetlała polskie znaki.

Przez stos funkcja otrzymuje dwa argumenty: wskaźnik na wiersz źródłowy i wskaźnik na bufor dla tekstu przekształconego. Sterowanie kolorem W trybie konsolowym jest możliwe zastosowanie 16 kolorów tła i 16 kolorów znaku. W buforze wyjściowym każdej pozycji na ekranie odpowiada 2 bajta, w których są przechowane kod i kolor znaku. Cztery starszych bitów bajta koloru znaku to kolor tła, cztery młodszych bitów to kolor znaku. W każdej czwórce przeznaczenie bitów w kolejności od starszego do młodszego jest następujące: Intensywność, Kolor czerwony, Kolor zielony, Kolor niebieski

W pliku "wincon.h" znajdują się stałe pokazane w niżej przytoczonej tabeli (skopiowanej z pomocy Visual Studio). Attribute FOREGROUND_BLUE FOREGROUND_GREEN FOREGROUND_RED FOREGROUND_INTENSITY BACKGROUND_BLUE BACKGROUND_GREEN BACKGROUND_RED BACKGROUND_INTENSITY Meaning Text color contains blue. Text color contains green. Text color contains red. Text color is intensified. Background color contains blue. Background color contains green. Background color contains red. Background color is intensified. Aby wskazać kolor należy połączyć stałe za pomocą operatora sumy bitowej lub "zwykłej". Funkcja SetConsoleTextAttribute ustawia atrybut koloru w buforze ekranu: BOOL SetConsoleTextAttribute( HANDLE hconsoleoutput, //deskryptor ekranu WORD wattributes //atrybut koloru ); Funkcja FillConsoleOutputAttribute przypisuje do komórek bufora zadany atrybut koloru. Opis funkcji FillConsoleOutputAttribute: BOOL FillConsoleOutputAttribute( HANDLE hconsoleoutput, //deskryptor ekranu WORD wattribute, //atrybut koloru DWORD nlength, //ilość pozycji COORD dwwritecoord, //współrzędne pierwszej pozycji LPDWORD lpnumberofattrswritten /* adres zmiennej, do której będzie zapisana ilość pozycji zapełnionych */ ); Sterowanie kursorem Do ustawienia kursora służy funkcja SetConsoleCursorPosition: BOOL SetConsoleCursorPosition( HANDLE hconsoleoutput, //deskryptor ekranu COORD dwcursorposition //współrzędne pozycji );

Aplikacja z tworzeniem okna konsoli Rozpatrzmy programowanie aplikacji konsolową, w której jest tworzone okno konsoli. Program musi zawierać alokacje konsoli za pomocą funkcji AllocConsole i zamykanie konsoli przez wywołanie funkcji FreeConsole. Funkcja FreeConsole musi być wywołana też na początku programu, aby zamknąć inne konsoli tego procesu. Niżej w przykładzie jest przedstawiony program, który tworzy okno konsolowe białego koloru. Fragmenty programu //Aplikacja z tworzeniem okna konsoli #include <stdio.h> #include <stdlib.h> #include <math.h> #include <conio.h> #include <windows.h> #pragma warning (disable:4996)... char tytul[]="..."; char tekst1[]="..."; HANDLE hinp,hout; COORD pole; int rbuf,rfakt,rout,lengbuf; //--- Kolory ---- unsigned short kolor1 = 0xFC; // Kolory: BG_I,R,G,B,FG I,R,G,B unsigned short kolor2 = 0xF9; // Kolory: BG_I,R,G,B,FG I,R,G,B int main(void) { //--- tworzenie konsoli --- FreeConsole(); AllocConsole(); //--- AnsiToOem(tytul,tytul); SetConsoleTitleA(tytul); //--- hout=getstdhandle(std_output_handle);//deskryptor buforu wyjściowego hinp=getstdhandle(std_input_handle); // deskryptor buforu wejściowego //--- obliczenie rozmiaru buforu ekranu pole=getlargestconsolewindowsize(hout); rbuf=pole.x * pole.y; //--- napełnienie komórek jednakowym atrybutem --- pole.x=0; pole.y=0; FillConsoleOutputAttribute(hout,kolor2,rbuf,pole,&rfakt); //--- ustawienie kursora --- pole.x=0; pole.y=20; SetConsoleCursorPosition(hout,pole); //ustawienie pozycji kursora //--- wyprowadzenie komunikatu informacyjnego --- SetConsoleTextAttribute(hout,kolor1); CharToOemA(tekst1,buf); //konwersja polskich znaków lengbuf=(int)strlen(buf); WriteConsoleA(hout,buf,lengbuf,&rfakt,NULL); //--- getch(); //--- zamknięcie konsoli FreeConsole();

} return 0; Nowo otwarte okno konsoli posiada nagłówek, który przekazuje do okna konsoli funkcja SetConsoleTitleA. Przykład ilustruje też sterowanie kolorem tekstu. W trybie konsolowym jest możliwe zastosowanie 16 kolorów tła i 16 kolorów znaku. Funkcja FillConsoleOutputAttribute przypisuje do każdej komórki bufora zadany atrybut koloru (w tym przykładzie niebieski znak na tle białym).