Uwagi o programowaniu w C
Uwaga, to na razie tylko szkielet strony
Spis treści
Środowiska i kompilatory
Programowanie
Początek strony
Nowości
- 25.05.04 Uruchomienie strony.
- 3/4.06.04 Punkt o (un)signed char.
Początek strony
Środowiska
- gcc (Linux)
- Anjuta (Linux)
- Dev-cpp (Windows)
- lcc-win32 (Windows)
- Visual Studio 2003 (Windows)
- Turbo C (DOS)
Początek strony
Uwagi o programowaniu w C
- Ostrożnie!!!
- -Wall !!!!
- C != C++ (.c ok, .cpp nie, .C NIE, .cc nie)
- assert !
- uwaga na sizeof (to sie liczy podczas kompilacji TYLKO)
- niebezpieczny realloc
- czemu (czasami) działa while((c=getc()!=EOF))?
- czemu może nie dzialac tab[c]?
przy dekalracjach
char c;
int tab[256];
instrukcja
tab[c] = 0;
może być bardzo niebezpieczna. Wszystko zależy od tego, jak będzie
interpretowany typ char: jako typ ze znakiem (signed char), czy jako typ bez znaku
(unsigned char). Interpretacja zależy od implementacji, zwykle można ją zadać
przez parametry kompilatora.
W języku C wyrażenia typu char są zawsze niejawnie konwertowane do typu int. Jeśli
char jest typem bez znaku, to tab[c] zadziała poprawnie. Jeśli jednak char jest typem
ze znakiem, to dla c > 127 wyrażenie tab[c] będzie bardzo powaznym błędem: spowoduje
wyzerowanie kilku bajtów znajdujacych się przypadkowo o c liczb całkowitych przed
(uwzględniając ujemny znak c, należałoby powiedzieć: po) początku tablicy tab!
Rozwiązanie polega na użyciu do indeksowania typu int lub unsigned char (zastosowanie
opcji kompilatroa do zmiany domyślnego znaczenia char nie ma sensu, program
nie będzie przenosny, a i sami przy kolejnej kompilacji możemy zapomnieć o tej opcji.
Uwaga: przy włączeniu generowania przez kompilator wszystkich ostrzeżeń (np. -Wall
dla gcc), co koniecznie trzeba zrobić programując w C, kompilator wygeneruje
dla tej instrukcji ostrzeżenie.
- gdzie tu jest typ int: char* c = strdup(s)?
- == i =
- #define MAX 30; czemu to nie jest poprawne, choć często działa?
- jak policzyć liczbę elementów inicjalizowanej tablicy czasu kompilacji (sizeof(tab)/sizeof(tab[0])
- jak ustawić kursor, wczytać znak bez echa, wczytać znak bez czekania na Enter (zależy: (n)curses, conio, ...)
Początek strony
Tu możesz wysłać uwagi do autora strony