Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[AVR][C] Typy zmiennych - int, long int

iksu016 20 Cze 2012 20:42 2784 8
  • #1 20 Cze 2012 20:42
    iksu016
    Poziom 8  

    Witam, mam dziwny problem ze zmiennymi podczas programowania Atmega8-ki. Problem polega na tym, że gdy tworzę zmienną typu np. int, long int, unsigned int, to wszystkie te zmienne posiadają zakres short int (-32768 - 32767). Zmienna float również dziwnie się zachowuje zaokrąglając wynik gdy jest dość długi (pamiętałem o zaznaczeniu "floating point" w makefile). Dodam, że korzystam z pakietu WinAVR- programy piszę w Notepadzie. Poniżej przedstawiam przykładowy programik w którym widoczny jest problem:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    No i na wyświetlaczu pojawia się -32768, co świadczy o przekroczeniu zakresu dla liczb dodatnich ;/. Nie mam pojęcia czego to może być wina.
    Z góry dzięki i pozdrawiam.

    0 8
  • #2 20 Cze 2012 20:45
    gaskoin
    Poziom 38  

    Źle sformatowałeś stringa, ale po co czytać warningi :)

    Zamiast %d daj %lld

    0
  • #3 20 Cze 2012 21:07
    iksu016
    Poziom 8  

    gaskoin napisał:
    Źle sformatowałeś stringa, ale po co czytać warningi :)

    Zamiast %d daj %lld


    No właśnie próbowałem tak, czytałem o tym jak różne typy się definiuje (o ile można to tak nazwać) w sprintf, ale gdy zmieniam na %lld, to po prostu nie wyświetla się nic.

    0
  • #4 20 Cze 2012 21:23
    gaskoin
    Poziom 38  

    Bez precyzji też nie działa ?

    Możesz też spróbować z itoa z stdlib.

    0
  • #5 20 Cze 2012 22:09
    iksu016
    Poziom 8  

    Tak z itoa też próbowałem, ale itoa działa mi tylko dla typu int, dla typu long int, long long int, też nic nie wyświetla. Wyświetla natomiast dla typu unsigned int, ale zakres jest jak dla zwykłego int. :|

    Tutaj drugi przykład:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    W tym programie natomiast wyświetla mi liczbę 1234567.100, czyli zaokrągla wynik do liczby 8 cyfrowej, np. dla liczby 12345689.123 wyświetla 1234567890.000. Jestem oczywiście początkującym i nie wiem, może tak powinno być, ale wydawało mi się, że zmienna typu float może trochę tych cyferek pomieścić i chciałem sprawdzić to w praktyce :D .

    0
  • #6 21 Cze 2012 00:12
    krru
    Poziom 32  

    iksu016 napisał:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #7 21 Cze 2012 16:12
    iksu016
    Poziom 8  

    Próbowałem z tą końcówką LL (nawet o tym nie wiedziałem), no ale niestety nie pomaga :|. Próbowałem to zastosować w itoa i w sprintf- próbowałem dla %lld i %d z precyzją i bez, ale tak jakby kompilator w ogóle na to nie zwracał uwagi i wyświetla dalej tak samo jak bez końcówki LL.
    Bardzo mi to przeszkadza, ponieważ odkąd bawie się wyświetlaczem i chcę wyświetlać jakiś wynik w programie lub np. przedstawić jakąś zmienną po jakiś prostych operacjach matematycznych (dodawanie mnożenie dzielenie), to nie idzie tego wykonać, bo zakres -32768- 32767 to trochę za mało. Zmienna typu float to czasami marnotrawstwo, zresztą ona też się dziwnie zachowuje :|. No nic będę jeszcze próbował, ale dziękuję za każdą pomoc :D.

    0
  • #8 21 Cze 2012 18:04
    tmf
    Moderator Mikrokontrolery Projektowanie

    Jeśli jest jakiś problem z sprintf to zazwyczaj na AVR odpowiada za to okrojona domyślnie wersja tej funkcji. Dołącz libprintf (poprawnie to konfigurując i powiedz czy problem zniknął.

    0
  • #9 22 Cze 2012 17:41
    iksu016
    Poziom 8  

    tmf napisał:
    Jeśli jest jakiś problem z sprintf to zazwyczaj na AVR odpowiada za to okrojona domyślnie wersja tej funkcji. Dołącz libprintf (poprawnie to konfigurując i powiedz czy problem zniknął.


    Szczerze powiedziawszy, to nie wiem jak mam dołączyć to libprintf. Widzę, że dwa takie pliki są w C:\WinAVR-2010010\abr\lib, a konkretnie to libprintf_min.a i libprintf_fit.a, ale czy to o to chodzi to nie wiem, a jeżeli nawet to nie wiem co mam z tym zrobić :?: .

    Dodano po 3 [godziny] 55 [minuty]:

    Coś tam działa. Posprawdzałem wszystko jeszcze raz od początku wszystkie typy zmiennych i zauważyłem, że typ long int unsigned int , unsigned long int,- działają dobrze (tylko w sprintf w itoa niestety nie).

    Nie działa jednak typ long long int oraz unsigned long long int. No i dalej nie wiem jak zrobić, żeby zmienna typu float nie zaokrąglała po 8 cyfrach :|.

    Wykorzystywałem już inttypes.h, próbowałem zamiast %lld, %lli (podobno "d" i "i" jest zamienne) i niestety dalej nic. :cry:

    0