Chciałbym zrobić trzy tablice o tej samej długości. Zgodnie z dokumentacją tablice muszą być zdefiniowane jako miejsca, int myArray[10];
gdzie 10 można zastąpić znaną długością (inną liczbą całkowitą) lub wypełnić tablicą {2, 3, 5, 6, 7}
.
Jednak, kiedy próbowała zadeklarować wartość int arrSize = 10;
, a następnie w oparciu o tablicę tej wielkości int myArray[arrSize];
, pojawia się następujący: error: array bound is not an integer constant
.
Czy istnieje sposób na zmienne określanie rozmiarów tablic, czy po prostu muszę je na stałe zakodować? (Nauczono mnie, że kodowanie jest złe i należy tego unikać za wszelką cenę).
programming
variables
code-optimization
użytkownik3.1415927
źródło
źródło
Odpowiedzi:
Twoje pytanie składa się z 2 części.
1 / Jak mogę zadeklarować stały rozmiar tablicy poza tablicą?
Możesz albo użyć makra
lub użyj stałej
jeśli zainicjowałeś tablicę i musisz znać jej rozmiar, możesz:
drugi
sizeof
dotyczy typu każdego elementu tablicy, tutajint
.2 / Jak mogę uzyskać tablicę, której rozmiar jest dynamiczny (tj. Nieznany do czasu uruchomienia)?
W tym celu potrzebujesz dynamicznej alokacji, która działa na Arduino, ale generalnie nie jest to zalecane, ponieważ może to spowodować fragmentację „sterty”.
Możesz zrobić (sposób C):
Lub (sposób C ++):
Więcej informacji o problemach z fragmentacją sterty można znaleźć w tym pytaniu .
źródło
ARRAY_SIZE = sizeof myArray / sizeof myArray[0];
, w ten sposób możesz zmienić typ myArray bez wprowadzania błędów. Z tego samego powodumyArray = realloc(myArray, size * sizeof *myArray);
. BTW, rzutowanie wartości zwracanejmalloc()
lubrealloc()
jest również bezużyteczne. 2) SprawdzaniemyArray != 0
w wersji C jest bezużyteczne, corealloc(NULL, sz)
jest równoważne zmalloc(sz)
.Rozmiar tablicy musi być znany w czasie kompilacji. W przeciwnym razie należy dynamicznie przydzielić pamięć za pomocą:
gdzie x (liczba całkowita) może być ustawiona w kodzie aplikacji (możesz załadować go z eeprom, jeśli chcesz, aby było to trwałe, ale konfigurowalne ustawienie).
Jeśli jednak chcesz zadeklarować niektóre tablice tego samego rozmiaru, musisz tylko zadeklarować stałą taką jak ta:
Myślę, że nie zakodowanie na stałe ma sens tylko wtedy, gdy można oczekiwać, że użytkownik zechce w pewnym momencie zmienić ustawienie. Nie wiem czy tak jest.
źródło
Jeśli znasz maksymalną długość tablicy, po prostu zainicjuj tablicę na tę długość i użyj liczby całkowitej, aby powiedzieć programowi, ile tej tablicy ma użyć. Jeśli jest to różnica między 7,10 bajtów, to nie marnujesz tyle alokacji pamięci.
źródło
Wiem, że jestem tu trochę spóźniony, ale teoretycznie nie można utworzyć regularnych tablic przy użyciu zmiennej do zdefiniowania liczby elementów, które będzie mieć tablica, jak w:
Wyświetli się błąd, ponieważ program deklarując tablicę oczekuje, że wartość w nawiasach będzie stała. Istnieje jednak sposób, w jaki można utworzyć tablicę ze zmienną określającą ilość wartości, jakie będą miały te tablice poprzez dynamiczny przydział pamięci dla zestawów wartości (ta metoda została przetestowana tylko z tablicami jednowymiarowymi, nie próbowano wielowymiarowe jeszcze) i idzie mniej więcej tak:
Następnie wystarczy przypisać wartość do każdego elementu utworzonego w instancji myArray (który jest już teraz Array), tak jak w przypadku normalnej tablicy utworzonej jako myArray [arrSize].
źródło