• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Zajętość pamięci typy danych. Nieznajomość podstaw
#1
Nie wiem czy dobrze to napisze. Zauważyłem że sporo projektów opiera się często na np.

int SW = 15;

A w setup:

 pinMode(SW, INPUT);


No i takie pytanie mnie nachodzi dlaczego zmienna "SW" to np. typ "int" skoro ta zmienna zajmuje 4 bity pamięci  nie lepiej by było ta zmienna na "char" ?? a jeszcze lepiej "unsigned char" zajmuje 1 bajt pamięci...

No i jeszcze jedno pytanie ze zmienną widzę że czasem zmienna jest "float" a odczytane dane z czujników to max jest 5 liczbowy nie lepiej by była zmienna "int" ? choć int a float zajmują tyle samo miejsca w pamięci. 
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#2
Są fajne książki do do C, darmowe, na Wikibook jest po polsku do C, kilka linków widziałem w PDF tu na forum. Zmienna int zajmuje bajty nie bity, 2 nie 4 (no chyba że w ESP8266 czy innym 32 bitowym procesorze), dlatego najlepiej stosować typy do liczb uint8_t/int8_t, tak samo 16,32,64 i wtedy nieważne czy kompilujesz na atmega328 czy ARM czy ESP zrobi zmienną dokładnie taką jak chcesz. Może być char i unsigned char do pinów, można zdefiniować piny #define led 13 i też to trochę ułatwia. Dróg do celu jest wiele. Wartości z pomiarów pewnie są 5 cyfrowe nie 5-liczbowe i np. z DS18B20 mieszczą się właśnie w int bez problemu z dokładnością do 2 miejsc "po przecinku" x100. Zajmuje więc mniej niż float i nie ma problemu z gubieniem dokładności w obliczeniach i szybkością obliczeń, problemów przy porównaniach.
A pomijając te drobne różnice odpowiedź na oba pytania brzmi TAK. To co widzisz w przykładach to dema, zrobione na szybko i prosto idące do celu, są liczby o przesadzonym zakresie, są delay, które nie powinny być użyte w rzeczywistym programie, są floaty, które zwykle nie są potrzebne i zamulają procesor. Używanie samego Arduino jest takim dużym uproszczeniem, bo choć C++ ułatwia tworzenie ogromnych aplikacji to nie zrobisz takiej w systemie z 32kb dysku twardego (flash) i z 2kb Ramu. Ale można ten sam kod co na UNO uruchomić często również na DUE i ESP, a wtedy nie ma to już takiego dużego znaczenia. Bawiąc się tylko z AVR i C wszystko trzeba ładnie optymalizować, nie używasz zmiennej do współrzędnych ekranu typu INT gdy ekran jest 128x64, ale klasy w Arduino są tak pisane, że zadziałają z tym ekranem i takim FHD, nie muszą być przepisywane na nowo bo ktoś sobie wziął ekran 400x320. Ale taka uniwersalność zabije możliwość użycia na małym procku bo ram się szybko kończy. Zawsze można użyć bardziej zoptymalizowanej biblioteki choć mniej uniwersalnej, można napisać swoją.
 
Odpowiedź
#3
A powiedz mi czy mając esp8266, potrzebuje zmienna int*0.000977*18.54 no i mnie to męczy czy dać na float czy kombinować inaczej ?? bo później float i tak muszę zmienić na int jako liczbę całkowita przesuwając przecinek o jedno miejsce 1/10 i wynik tylko przed przecinkiem mnie interesuje. Podobno przy tym procesorze 32 float to bułka z masłem ale opinii czytałem sporo.
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#4
Float wszędzie jest gorszy od liczb całkowitych, nawet jeśli ESP radzi sobie z float 1000x lepiej od AVR to i tak jest to pewne przybliżenie rzeczywistej wartości, im więcej obliczeń tym więcej kumuluje w sobie błędu, nie ważne czy to atmega, ESP, czy I7 8core na PC. Jak nie musisz to nie używaj. W ESP i na PC masz jeszcze typu double, coś jak float tylko dużo więcej niż 7 cyfr znaczących. Z drugiej strony jak miałbyś przerabiać całą bibliotekę np. do DS18B20 na int/long to trochę upierdliwe, jedna linijka z float nie zawali programu nawet gdyby była na AVR, zaoszczędzisz 2us zamieniając float na int po czym wstawisz delay 100... To może mieć znaczenie jak się walczy o cykle zegara.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości