Re: Co tu jest le?

Autor: Leszek KUBRAK (info_at_infokub.com.pl)
Data: Sun 27 May 2001 - 14:58:47 MET DST


On Sun, 27 May 2001 12:26:09 +0200 (MET DST), Tomasz Szcze niak wrote:

>> Pokaż większy fragment programu, a w szczególności deklaracje zmiennych.
>> Ta linijka jest na 100 % poprawna, sprawdziłem pod Borlandem i Watcomem.
>
>To są definicje zmiennych z tej funkcji:
>
>FILE *data, *index, *desc;
>char *buffer, *temp_data;
>unsigned char type;
>char number;
>int td_index = 0;
>unsigned char counter, counter1;
>char field_n, field_t, field_d[101];
>
>
>pętla w które to działa wygląda tak (zmienna counter zawiera ilość
>linii)
>
>while (--counter) {
> counter1 = fscanf (desc, "%c %3hd %[^\n]\r", &type, &number, buffer);
> printf ("test: %d; %d; %s; %d\n", type, number, buffer, counter1);
>//Ta linia tylko d testów
>}
>

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.

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.

==================================================
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