Środowisko programisty/Wprowadzenie do C: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Linia 145: Linia 145:
== Podstawy wejścia/wyjścia ==
== Podstawy wejścia/wyjścia ==


== Proste instrukcje ==
== Instrukcje ==
 
=== if ===
 
=== while, do ===
 
=== for ===
 
=== switch ===
 
=== break, continue ===
 
=== goto ===

Wersja z 12:11, 21 cze 2006

Skąd wziąć kompilator języka C

Do pisania programów w C potrzebne są:

  1. Edytor tekstów. Może być dowolny, chociaż niekoniecznie najmądrzejszym posunięciem będzie pisanie w Wordzie.
  2. Kompilator C.

Można zakupić jeden z wielu komercyjnych kompilatorów języka C np:

albo użyć jednego z darmowych kompilatorów. Podczas tego kursu będziemy używać gcc, którego windowsową wersją jest DJGPP.

Linux

Instalacja gcc pod linuksem nie nastręcza zazwyczaj trudności, wystarczy: uruchomić menedżer pakietów, odnaleźć w nim gcc i zaznaczyć go do instalacji.

Windows

Pod Windows należy:

  1. Wejść do repozytorium pakietów, którego adres znajduje się na stronie DJGPP.
  2. Ściągnąć co najmniej pliki: djdev???.zip, bnu?????.zip i gcc????.zip. (???? oznaczają numer wersji, który się od czasu do czasu zmienia).
  3. Utworzyć katalog w którym ma zostać zainstalowane DJGPP (np. c:\djgpp).
  4. Rozpakować wszystkie pliki *.zip.
  5. Ustawić zmienną środowiskową DJGPP (np. w autoexec.bat), na nazwę pliku konfiguracyjnego (zazwyczaj C:/DJGPP/DJGPP.ENV), należy pamiętać aby w wartości zmiennej używać znaków / zamiast \.
  6. Do zmiennej środowiskowej PATH dodać katalog zawierający pliki wykonywalne (zazwyczaj C:\DJGPP\BIN)

Pomocny w instalacji DJGPP może być internetowy instalator

Kompilacja i uruchamianie programów

Przykładowy program

Aby uruchomić program w C trzeba go najpierw napisać. Programy w C piszemy w dowolnym edytorze tekstu i zapisujemy w pliku o zwyczajowo przyjętym rozszerzeniu .c. Przyjrzyjmy się następującemu programowi:

#include <stdio.h>
int main()
{
  printf("Raz\n");
  return 0;
}

Program ten wypisuje na ekran napis Raz po czym kończy swoje działanie.

Kompilacja

Spróbujmy skompilować nasz program. Załóżmy, że nazwaliśmy go (to typowe) test.c. Uruchamiamy w shellu polecenie gcc i co się dzieje:

krzysiek@krzysiek-desktop:~/Tmp$ gcc test.c
krzysiek@krzysiek-desktop:~/Tmp$

Wbrew pozorom, to że system nic nie wypisał na ekran, nie oznacza niczego złego. Po prostu program się poprawnie skompilował, ale nie wiemy jak go uruchomić. Sprawdźmy, za pomocą polecenia ls, jakie inne pliki powstały w katalogu:

krzysiek@krzysiek-desktop:~/Tmp$ ls
a.out  test.c
krzysiek@krzysiek-desktop:~/Tmp$

Kompilator gcc domyślnie tworzy plik wykonywalny o nazwie a.out, a dla nas wygodniej by było gdyby nazywał się on jakoś inaczej, co uzyskujemy za pomocą opcji -o kompilatora. Czyli:

krzysiek@krzysiek-desktop:~/Tmp$ rm a.out
krzysiek@krzysiek-desktop:~/Tmp$ gcc test.c -o test
krzysiek@krzysiek-desktop:~/Tmp$ ls
test  test.c
krzysiek@krzysiek-desktop:~/Tmp$

No to teraz uruchamiamy nasz program:

krzysiek@krzysiek-desktop:~/Tmp$ test
krzysiek@krzysiek-desktop:~/Tmp$

Hmm... nic się nie stało. Dlaczego? Ano dlatego, że test jest wbudowanym poleceniem shella i aby uruchomić nasz program, potrzebujemy poprzedzić jego nazwę ścieżką:

krzysiek@krzysiek-desktop:~/Tmp$ ./test
Raz
krzysiek@krzysiek-desktop:~/Tmp$

W ten sposób napisaliśmy i uruchomiliśmy nasz pierwszy preogram w C

Błędy kompilacji

Co by się stało, gdyby nasz program miał jakieś błędy? Sprawdzmy.

Najpierw błąd, który jest niegroźny. W naszym programie używamy funkcji printf, a po to by jej użyć dołączamy plik nagłówkowy stdio.h, w którym ta funkcja jest opisana. Co się stanie, jeśli nie dołączymy tego pliku?

int main()
{
  printf("Raz\n");
  return 0;
}

Spróbujmy skompilować i uruchomić ten program:

krzysiek@krzysiek-desktop:~/Tmp$ rm test
krzysiek@krzysiek-desktop:~/Tmp$ gcc test.c -o test
test.c: In function ‘main’:
test.c:3: warning: incompatible implicit declaration of built-in function ‘printf’
krzysiek@krzysiek-desktop:~/Tmp$ ./test
Raz
krzysiek@krzysiek-desktop:~/Tmp$

Kompilator ostrzegł nas (warning), że w linii trzeciej pliku test.c jest problem polegający na użyciu "nieznanej" funkcji printf, ale plik został skompilowany i program można uruchomić.

Weźmy teraz następujący przykład:

#include <stdio.h>
int main()
{
  printf("Raz\n");
}

Brak w nim instrukcji return, która powinna kończyć działanie funkcji main. Skompilujmy ten program:

krzysiek@krzysiek-desktop:~/Tmp$ gcc test.c -o test
krzysiek@krzysiek-desktop:~/Tmp$

Kompilator nie zgłosił żadnych błędów ani ostrzeżeń, ale program ma wadę. Dzieje się tak dlatego, że ostrzeżenia zostały podzielone na kilka kategorii, z których domyślnie zgłaszane są jedynie najważniejsze. Aby wyświetlić wszystkie ostrzeżenia należy użyć opcji -Wall.

krzysiek@krzysiek-desktop:~/Tmp$ gcc -Wall test.c -o test
test.c: In function ‘main’:
test.c:5: warning: control reaches end of non-void function
krzysiek@krzysiek-desktop:~/Tmp$

Na koniec program z błędem:

#include <stdio.h>
int main()
{
  printf("Raz\n);
  return 0;
}

brakuje w nim znaku " po \n

krzysiek@krzysiek-desktop:~/Tmp$ gcc test.c -o test
test.c: In function ‘main’:
test.c:4: error: missing terminating " character
test.c:5: error: syntax error before ‘return’
krzysiek@krzysiek-desktop:~/Tmp$

W tym przypadku program nie został skompilowany, więc nie można go uruchomić, a kompilator zgłosił błąd w czwartej linii (missing terminating " character).


Podstawy wejścia/wyjścia

Instrukcje

if

while, do

for

switch

break, continue

goto