Mam tutaj kilka problemów z bólem głowy.Kiedy int nie jest int (intX_t)
Zasadniczo staram się, aby biblioteka była kompatybilna z różnymi systemami Arduino (a nie z Arduino).
Mam sytuację, w której typy już nie pasują, tak jak w przypadku int
nie jest już równoznaczny z identycznym typem stałej szerokości. W ograniczonym środowisku (bez stdlib i innych) napisałem własne klasy cech dla potrzebnych mi funkcji.
Wszystko działa poprawnie, używając GCC 4.8.1 (avr) & Extensa-1x106-GCC (ESP8266), ale nie w GCC 4.8.3 (SAM, SAMD rdzenie).
Zasadniczo mam knuckled dół mojego kodu, aby pokazać ten problem w ten kod bardzo podstawowego (int
potwierdza mieć 4 bajty na uszkodzonej kompilatorów platformy 32-bitowy):
template < typename T, typename U > struct is_same{ enum { value = false }; };
template < typename T > struct is_same< T, T > { enum { value = true }; };
void setup() {
static_assert(is_same<int,int32_t>::value, "Not integer");
}
void loop(){}
można wyświetlić " normalna implementacja C++ tutaj (powyżej to podstawowa implementacja do użycia w Arduino IDE): http://cpp.sh/377e
Nawiasem mówiąc, aser statyczny nie uruchamia się również w kompilatorze cpp.sh.
Czy 4.8.1 niepoprawny, czyli int
i int32_t
należy traktować jako różne typy. Lub jest 4.8.3 niepoprawne i powinny być równoważne, jeśli mają równe rozmiary określone przez implementację.
Użyłem poniższego kodu do wykrycia dowolnego typu liczby całkowitej, w której początkowo znajdowałem błąd.
template< typename T >
struct is_integer{
enum{
V8 = is_same< T, uint8_t >::value || is_same< T, int8_t >::value,
V16 = is_same< T, uint16_t >::value || is_same< T, int16_t >::value,
V32 = is_same< T, uint32_t >::value || is_same< T, int32_t >::value,
V64 = is_same< T, uint64_t >::value || is_same< T, int64_t >::value,
value = V8 || V16 || V32 || V64
};
};
I oczywiście może się zmienić, aby sprawdzić char
, int
, long
, etc .. ale nadal będzie ona wymagać sprawdzania wszystkich stałych wariantach szerokości i najprawdopodobniej int_fastX_t
i int_leastX_t
rodzajów, które wydaje się super nadmiarowa metoda zapewniająca maksymalną użyteczność.
Wszelkie pomysły?
Pozdrawiam, doceniam wszelkie dane wejściowe!
Czy dany toolchain jest dostępny gdzieś? – melak47
możesz użyć [boost] (http://www.boost.org/doc/libs/1_59_0/libs/integer/doc/html/boost_integer/traits.html) w swoim środowisku osadzonym? –
@ melak47 Tak, możesz pobrać [Arduino IDE] (https://www.arduino.cc/en/Main/Software) i z menu Narzędzia-> Zarząd-> Zarządca wybierz i zainstaluj SAM, lub Rdzeń SAMD dla jednej z niedziałających sieci (wykona resztę), następnie wybierz Zero (SAMD) lub Due (SAM) z listy Narzędzia-> Tablica. (To jest ból, ale przeznaczony dla początkujących). Rdzeń AVR 4.8.1 jest dostarczany domyślnie. –