Настройка системных настроек с помощью defines?
Я написал библиотеку, которая содержит статически выделенный буфер (например, struct taskList proc[TBL_SIZE];
)
TBL_SIZE-это макрос, определенный в файле my .h.
Я слышал, что есть способ установить или сбросить инструкцию define внутри файла .ino, чтобы настроить этот параметр для некоторых библиотек, но я сам не знаю, как это сделать, и к тому времени, когда я понял, что это проблема, я забыл, какая библиотека разрешила этот параметр.
Это было бы чрезвычайно полезно, так как в настоящее время мне приходится редактировать свою библиотеку каждый раз, когда я строю новый проект (или, что еще хуже, работаю сразу над несколькими с разными настройками).
Моя догадка была вариантом включения охранника, как это
#ifndef TBL_SIZE
#define TBL_SIZE 16 /*(или что угодно)*/
#endif
блок, но это не сработало. Я попробовал это во время заключительного проекта, поэтому моя память нечеткая от недостатка сна (и времени, сейчас), но я почти уверен, что получил "неопределенную" ошибку.
Я не знаю, как это называется, чтобы искать его иначе, поэтому я надеюсь, что кто-то может помочь.
Вот больше информации о моей конкретной проблеме:
В my .h (вверху, после регулярного включения охраны):
#ifndef TBL_SIZE
#define TBL_SIZE 16
#endif
(Обратите внимание, что все работает, если я просто установлю это непосредственно без определений)
Дальше по .h, внутри моего класса:
struct task processes[TBL_SIZE];
В основной файл .ino перед библиотекой входит:
#define TBL_SIZE 6
#include <CoRTOS.h>
Отладочный вывод сборки (я знаю по опыту, что она была построена с 16 вместо 6 записей в этой таблице из объема памяти. Предупреждение о низкой памяти-еще одна большая подсказка.)
Linking everything together...
"C:\\Users\\rdrag\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-gcc" -w -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections -mmcu=atmega328p -o "C:\\Users\\rdrag\\AppData\\Local\\Temp\\arduino_build_258761/ECE554_ASP.ino.elf" "C:\\Users\\rdrag\\AppData\\Local\\Temp\\arduino_build_258761\\sketch\\ECE554_ASP.ino.cpp.o" "C:\\Users\\rdrag\\AppData\\Local\\Temp\\arduino_build_258761\\libraries\\CoRTOS\\CoRTOS.cpp.o" "C:\\Users\\rdrag\\AppData\\Local\\Temp\\arduino_build_258761\\libraries\\Adafruit_GFX_Library\\glcdfont.c.o" "C:\\Users\\rdrag\\AppData\\Local\\Temp\\arduino_build_258761\\libraries\\Adafruit_GFX_Library\\Adafruit_GFX.cpp.o" "C:\\Users\\rdrag\\AppData\\Local\\Temp\\arduino_build_258761\\libraries\\Adafruit_GFX_Library\\Adafruit_GrayOLED.cpp.o" "C:\\Users\\rdrag\\AppData\\Local\\Temp\\arduino_build_258761\\libraries\\Adafruit_GFX_Library\\Adafruit_SPITFT.cpp.o" "C:\\Users\\rdrag\\AppData\\Local\\Temp\\arduino_build_258761\\libraries\\Adafruit_BusIO\\Adafruit_BusIO_Register.cpp.o" "C:\\Users\\rdrag\\AppData\\Local\\Temp\\arduino_build_258761\\libraries\\Adafruit_BusIO\\Adafruit_I2CDevice.cpp.o" "C:\\Users\\rdrag\\AppData\\Local\\Temp\\arduino_build_258761\\libraries\\Adafruit_BusIO\\Adafruit_SPIDevice.cpp.o" "C:\\Users\\rdrag\\AppData\\Local\\Temp\\arduino_build_258761\\libraries\\Wire\\Wire.cpp.o" "C:\\Users\\rdrag\\AppData\\Local\\Temp\\arduino_build_258761\\libraries\\Wire\\utility\\twi.c.o" "C:\\Users\\rdrag\\AppData\\Local\\Temp\\arduino_build_258761\\libraries\\Adafruit_SSD1306\\Adafruit_SSD1306.cpp.o" "C:\\Users\\rdrag\\AppData\\Local\\Temp\\arduino_build_258761\\libraries\\SPI\\SPI.cpp.o" "C:\\Users\\rdrag\\AppData\\Local\\Temp\\arduino_build_258761\\libraries\\SparkFun_BME280_Arduino_Library-master\\SparkFunBME280.cpp.o" "C:\\Users\\rdrag\\AppData\\Local\\Temp\\arduino_build_258761/core\\core.a" "-LC:\\Users\\rdrag\\AppData\\Local\\Temp\\arduino_build_258761" -lm
C:\Users\rdrag\Documents\Arduino\libraries\CoRTOS\src/CoRTOS.h:38:7: note: array types have different bounds
class cortos_class {
^
"C:\\Users\\rdrag\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-objcopy" -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 "C:\\Users\\rdrag\\AppData\\Local\\Temp\\arduino_build_258761/ECE554_ASP.ino.elf" "C:\\Users\\rdrag\\AppData\\Local\\Temp\\arduino_build_258761/ECE554_ASP.ino.eep"
"C:\\Users\\rdrag\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-objcopy" -O ihex -R .eeprom "C:\\Users\\rdrag\\AppData\\Local\\Temp\\arduino_build_258761/ECE554_ASP.ino.elf" "C:\\Users\\rdrag\\AppData\\Local\\Temp\\arduino_build_258761/ECE554_ASP.ino.hex"
Multiple libraries were found for "Adafruit_GFX.h"
Used: C:\Users\rdrag\Documents\Arduino\libraries\Adafruit_GFX_Library
Not used: C:\Users\rdrag\Documents\Arduino\libraries\Adafruit-GFX-Library-master
Multiple libraries were found for "Adafruit_I2CDevice.h"
Used: C:\Users\rdrag\Documents\Arduino\libraries\Adafruit_BusIO
Not used: C:\Users\rdrag\Documents\Arduino\libraries\Adafruit_BusIO-master
Multiple libraries were found for "Adafruit_SSD1306.h"
Used: C:\Users\rdrag\Documents\Arduino\libraries\Adafruit_SSD1306
Not used: C:\Users\rdrag\Documents\Arduino\libraries\Adafruit_SSD1306-master
Using library CoRTOS at version 0.2.0 in folder: C:\Users\rdrag\Documents\Arduino\libraries\CoRTOS
Using library Adafruit_GFX_Library at version 1.10.7 in folder: C:\Users\rdrag\Documents\Arduino\libraries\Adafruit_GFX_Library
Using library Adafruit_BusIO at version 1.7.3 in folder: C:\Users\rdrag\Documents\Arduino\libraries\Adafruit_BusIO
Using library Wire at version 1.0 in folder: C:\Users\rdrag\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire
Using library Adafruit_SSD1306 at version 2.4.5 in folder: C:\Users\rdrag\Documents\Arduino\libraries\Adafruit_SSD1306
Using library SPI at version 1.0 in folder: C:\Users\rdrag\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\SPI
Using library SparkFun_BME280_Arduino_Library-master at version 2.0.9 in folder: C:\Users\rdrag\Documents\Arduino\libraries\SparkFun_BME280_Arduino_Library-master
"C:\\Users\\rdrag\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-size" -A "C:\\Users\\rdrag\\AppData\\Local\\Temp\\arduino_build_258761/ECE554_ASP.ino.elf"
Sketch uses 28172 bytes (91%) of program storage space. Maximum is 30720 bytes.
Global variables use 1609 bytes (78%) of dynamic memory, leaving 439 bytes for local variables. Maximum is 2048 bytes.
Low memory available, stability problems may occur.
@, 👍0
Обсуждение1 ответ
Я слышал, что есть способ установить или сбросить инструкцию define внутри файла .ino, чтобы настроить этот параметр для некоторых библиотек, но я не знаю, как это сделать сам
Есть много способов добиться того, чего вы хотите, вам может даже не понадобиться макрос #ifndef, используйте свою конструкцию библиотечного класса, чтобы позволить пользователю передать размер списка в качестве аргумента, но установите для аргумента значение по умолчанию.
YourLibrary.h
class YourLibrary
{
private:
size_t _userSize;
public:
YourLibrary::YourLibrary(size_t listSize = 16) {
size_t _userSize = listSize;
}
...
}
Скетч пользователя .
#include <YourLibrary.h>
#define LIST_SIZE 32;
YourLibrary instance(LIST_SIZE); // instance() would set the _listSize to 16
setup() {
}
loop() {
}
Однако разве это не требует выделения элемента в куче? Это установка размера массива., @RDragonrydr
Нет, это не так. Если только вы не используете строковый объект., @hcheung
Кстати, я прочитал ваш обновленный пост. Как вы упомянули, в отношении "#ifndef " ошибки нет, так в чем же именно проблема и ваш вопрос?, @hcheung
Проблема, указанная в моем посте, заключается в том, что добавление #define в файл root .ino фактически не влияет на размер массива в библиотеке. Повторите свой ответ, как установка переменной внутри класса, как в вашем примере, создает необходимый мне массив? Я действительно пытаюсь не динамически распределять эту таблицу, так это то, что вы имели в виду, или мне здесь не хватает какой-то магии?, @RDragonrydr
- Как получить исходные файлы для библиотек Arduino?
- Ошибка: "недопустимое использование нестатической функции-члена" при вызове функции из моего собственного класса-метода
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Существуют ли библиотеки сглаживания сигналов для Arduino?
- Wire.h не найден!
- Библиотека FastLED: Как настроить яркость одного пикселя в абсолютном масштабе?
- Как эта строка кода определяет, подключен ли последовательный интерфейс?
- Ошибка Specified folder/zip file does not contain a valid library
Определите "не удалось работать". Если препроцессор увидит "#define LISTSIZE "до того, как ваш файл будет включен, он пропустит ваш "#define", потому что он был определен., @Dave Newton
Такова была его цель. Я бы хотел, чтобы более ранний вариант (из файла .ino) переопределил тот, что находится в файле., @RDragonrydr
Я добавил информацию. "Не работает" означает, что он не будет настраивать размер массива. Я неправильно запомнил предупреждение/ошибку. Какая-то жалоба на несоответствие массива, но на самом деле в этой строке нет ничего, связанного с массивом..., @RDragonrydr
#define in ino будет применяться только для .h, включенного в ino, а не для того же .h, включенного в другой файл. директива #include делает все содержимое файла .h копируемым в файл вместе с директивой, @Juraj
У меня сложилось впечатление, что #define в файле .ino переопределит запись define по умолчанию в файле .h для всех элементов, которые его включали, поскольку это было первое его использование или что-то в этом роде. Это не работает?, @RDragonrydr
Не могли бы вы добавить более подробную информацию о том, как объявляется и определяется массив? Судя по вашему описанию, это звучит так, как будто он определен в файле .h. Судя по выходным данным сборки, он был объявлен в файле .h и определен в файле .cpp. Или, может быть, файл .h был включен в несколько исходных файлов., @Edgar Bonet
.h включен в два исходных файла для этого проекта IIRC -. ino и .cpp библиотеки. Массив является членом класса, который объявлен в .h и заполнен функцией-членом, определенной в .cpp. Я полагаю, что сам класс определен в файле .cpp с использованием extern., @RDragonrydr