Настройка системных настроек с помощью 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

Обсуждение

Определите "не удалось работать". Если препроцессор увидит "#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


1 ответ


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