Ошибка: invalid application of 'sizeof' to incomplete type 'int []' при попытке вычислить размер массива в библиотеке
Я создал библиотеку, содержащую массив. Это файл .h:
class Lib {
public:
static int arr[];
};
А это файл .cpp:
#include "Lib.h"
int Lib::arr[] = {0, 1, 2, 3};
При попытке вычислить размер этого массива из библиотеки все работает нормально. При попытке сделать это из скетча я получаю указанную в заголовке ошибку. Это скетч, который я использую:
#include <Lib.h>
void setup() {
sizeof(Lib::arr);
}
void loop() {}
В чем здесь проблема?
@LukasFun, 👍1
Обсуждение1 ответ
Лучший ответ:
Причина в том, что в свой скетч вы импортируете только заголовочный файл (что хорошо). Однако там это массив (int[]
), а не инициализированный массив.
Для этого вам нужно будет включить cpp, но это плохая практика (если вообще возможно).
Вместо этого создайте новую (постоянную) переменную и назначьте ее.
(более или менее псевдокод из-за отсутствия компилятора):
Библиотека.h:
class Lib {
public:
static int arr[];
static int arr_length;
};
Библиотека.cpp:
#include "Lib.h"
int Lib::arr[] = {0, 1, 2, 3};
int Lib::arr_length = sizeof(Lib::arr);
Скетч:
#include <Lib.h>
void setup() {
Lib::arr_length;
}
void loop() {}
См. также комментарий LukasFun ниже. Также можно задать размер массива в заголовочном файле.
Я бы посоветовал хранить все назначения в файле реализации (cpp). Заголовочный файл предназначен для определения элементов, файл реализации для инициализации/назначения. Но это также работает для инициализации элементов в заголовочном файле.
Я только что попытался установить размер массива непосредственно в файле .h. Если я это сделаю, скетч компилируется без ошибок. Может быть, вы могли бы добавить это к своему ответу., @LukasFun
@LukasFun Правда, я добавил комментарий, однако все же лучше выполнять инициализацию в файле реализации., @Michel Keijzers
- Создание массива с длиной, полученной из библиотеки
- Ошибка: "'lcd' does not name a type" при использовании библиотеки LiquidCrystal.
- Как масштабировать растровое изображение (массив uint8_t) в Arduino?
- Глобальные переменные занимают много места в динамической памяти.
- Включить Guards vs #pragma один раз
- Объявление и использование массива структур в Arduino
- Ошибка: function was not declared in this scope when using a library without classes
- Поддерживает ли Arduino C++ динамические массивы объектов ?
Возможно, вы можете попытаться добавить постоянное целое число в свою библиотеку, содержащее размер массива, и использовать это целое число в своем скетче., @Michel Keijzers
@LukasFin Я добавил ответ., @Michel Keijzers
Кажется, что статический инициализатор не был выполнен при запуске скетча. Мне это кажется странным. Вы пытались получить доступ к первому элементу массива (например) из скетча? Я бы также использовал некоторые необычные значения для инициализации массива, например,
53, 33, 4, 12
, чтобы быть уверенным, что вы не получите доступ к 0 инициализированной памяти вLib:arr[0]
. Если вы найдете правильное значение, то хотя бы инициализация работает. Но тогда у меня нет лучшего объяснения. Кстати: правильная инициализация C++ статических переменных:int Lib::arr[4] = {0, 1, 2, 3};
. Возможно, это имеет значение., @Peter Paul KieferИзвините, мой предыдущий комментарий - ерунда. Поскольку это ошибка компилятора, а sizeof — функция компилятора, которая работает с объявленными типами, причина ошибки объяснима. В заголовочном файле массив не инициализирован и его размер не указан. Заголовочный файл — это единственное, что известно компилятору при компиляции скетча. Файл cpp компилируется в объектный файл на другом этапе. Объектный файл компонуется после запуска компиляции. Таким образом, все, что происходит в файле cpp, неизвестно компилятору, когда он компилирует скетч. Если вы объявите массив с размером, он будет работать. Я так ..., @Peter Paul Kiefer