Re: Co tu jest le?

Autor: Leszek KUBRAK (info_at_infokub.com.pl)
Data: Mon 28 May 2001 - 07:27:11 MET DST


On Sun, 27 May 2001 21:40:06 +0200 (MET DST), Tomasz Szcze niak wrote:

>> Boli cię zmienna number !!! Zdefiniowałeś ją jako char, a %3hd wymaga wskaźnika do
>> zmiennej typu int. I w momencie wczytania zawartości number (druga wartość w linii
>> czytanej z pliku) starszy bajt wartości typu int przykrywa to co znalazło się
>> wcześniej w zmiennej type.
>
>liteka 'h' oznacza, że int jest typu short, a więc (AFAIR) 1 bajt. Fakt,
>że zamiana deklaracji zmiennej number na typ int pomoła, dzięki :)

A jakiego kompilatora używasz ? Jeżeli 32-bitowy, to short jest 2-bajtowy.

>
>> A tak na przyszłość pozwolę sobie dać małą radę. Używaj typów zgodnych z przeznaczeniem
>> zmiennej. Wbrew pozorom zastosowanie typu char do zmiennej number (a z nazwy sądząc
>> jest to zmienna numeryczna) będzie cię kosztowało więcej niż zaoszczędzony bajt
>> (lub 3 bajty w zależności od kompilatora) pamięci. Ciągła konwersja do typu int
>> to są koszty i to duże.
>
>Używam, ale jak muszę odczytać wartość z zakresu 0 - 255 to czemu mam
>nie używać chara?
>A wychowałem się na ZX Spectrum, gdzie każdy bit był na wagę złota :)
>W każdym razie mam nauczkę - pilnować typów, swoją drogą, jak typy się
>nie zgadzają to kompilator powinien warningiem rzucić.

W funkcji scanf nie bardzo może, ponieważ string formatujący tak samo dobrze
możesz generować w trakcie przebiegu programu, a w kodzie źródłowym
mieć w wywołaniu użytą zmienną wskaźnikową lub tablicę. Poza tym kompilator daje
ostrzeżenia, ale w drugą stronę, czyli np. konwersja int na char, ponieważ możliwa
jest utrata wartości - 2 lub 4 bajty konwertowane na 1.

>W każdym razie dziękuję bardzo, na razie działa.

==================================================
Leszek KUBRAK <info_at_infokub.com.pl>

P.U.I. "InfoKub" tel.0-602-673124
ul.Mogiłki 3A tel.(0-12)650-03-20
30-898 KRAKÓW fax.(0-12)650-03-21



To archiwum zostało wygenerowane przez hypermail 2.1.7 : Tue 18 May 2004 - 15:32:03 MET DST