Как преобразовать int в const int в ардуино?
Для конкретного проекта мне нужно преобразовать int в тип переменной const int.
int i = 10;
boolean ShiftRegister[i] //Выдает ошибку
const int i = 10;
boolean ShiftRegister[i]// Работает Нормально
поскольку я создаю свою собственную пользовательскую библиотеку, где размер boolean может быть определен путем создания объекта пользователем
myLib Library(20); // Определяемый пользователем логический размер
и этот размер сохраняется в такой структуре, как эта, поскольку он не может быть непосредственно преобразован в const int.
Заголовочный файл ...
#ifndef myLib_h
#define myLib_h
#include "Arduino.h"
class myLib{
public:
myLib(int input);
private:
int input;
};
#endif
код на языке С++
#include "myLib.h"
#include "Arduino.h"
struct Data {
int BoolSize;
}Data[0];
myLib::myLib(int input){
Data[0].BoolSize=input
}
const int boolSize = Data[0].BoolSize;
bool DataBoolean[boolSize];
Всякий раз, когда я запускаю эту библиотеку, она выдает ошибку, пока я не определю логический размер в коде cpp, как это..
bool DataBoolean[20];
это означает что в этой строке есть какая то ошибка при преобразовании int в const int
const int boolSize = Data[0].BoolSize;
итак, я хочу сказать, что не хочу заранее определять логический размер в коде cpp. я бы предпочел определить логический размер, создав объект(где код потерпел крах), сохранив размер в структуре, а затем присвоив целое число структуры переменной const int. Мне нужен эффективный способ
включите эту структурную переменную
Data[0].BoolSize;
введите переменную const и назначьте ее вот так без каких либо ошибок
const int boolSize = Data[0].BoolSize;
итак, как я могу преобразовать целое число в const int, чтобы продолжить свой проект?
какая-нибудь помощь, пожалуйста? спасибо за вашу добрую поддержку.
2 ответа
Лучший ответ:
В момент вызова конструктора вашего класса его размер должен быть уже определен, поскольку выделение памяти происходит раньше. Но вы пытаетесь дать его в качестве параметра конструктору. Это не сработает.
У вас есть, по крайней мере, эти альтернативы. (Примечание: Это приглашение отредактировать этот ответ и добавить еще, если вы знаете какое-то серьезное решение.)
1. Используйте шаблон для размера
Пожалуйста, имейте в виду, что каждый разный размер будет генерировать другую реализацию в машинном коде.
template<size_t size>
class myLib {
public:
inline myLib<size>() {}
private:
bool data[size];
};
2. Динамическое выделение запрашиваемой памяти
class myLib {
public:
inline explicit myLib(size_t size) : data(new bool[size]) {}
inline ~myLib() {
delete[] data;
}
private:
bool* data;
};
Примечание: В зависимости от версии C++, которую вы используете, вам нужно рассмотреть Правило трех (до C++11) или Правило пяти (начиная с C++11). Поскольку реализация недостающих методов зависит от конкретных деталей, она оставлена в качестве упражнения для читателя.
Во втором примере есть утечка памяти: вы должны " удалить[] данные` в деструкторе. Но см. также [правило трех](https://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2b_программирование))., @Edgar Bonet
@EdgarBonet Абсолютно прав, спасибо! Мой текущий проект-это встроенная система, которая никогда не разрушает объекты... вводя меня в заблуждение. Поэтому нам не нужны никакие дополнительные методы., @the busybee
Если вам нужна переменная длина массива, то вы можете использовать malloc. С тем же conext, если вы хотите инициировать массив с определенной длиной значения, вы должны использовать malloc.
- Руководство по созданию библиотеки
- Как получить исходные файлы для библиотек Arduino?
- Ошибка: "недопустимое использование нестатической функции-члена" при вызове функции из моего собственного класса-метода
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Существуют ли библиотеки сглаживания сигналов для Arduino?
- Wire.h не найден!
- Библиотека FastLED: Как настроить яркость одного пикселя в абсолютном масштабе?
- Как эта строка кода определяет, подключен ли последовательный интерфейс?
struct Data { int BoolSize; } Data[0];
объявляет массив нулевых элементов. Вам нужно изменить этот 0 на (по крайней мере) 1., @MatДля этого следует посмотреть классы шаблонов., @Majenko
@Mat массив начинается с числа 0, и я не хочу больше памяти для данных, поэтому я дал только длину массива 0 . Я не могу получить доступ к данным в позиции массива 0 ?, @Subha Jeet Sikdar
@Majenko пожалуйста, потратьте для меня немного больше времени и напишите здесь пример кода, который мне будет легче понять, @Subha Jeet Sikdar
Я так и сделаю, но сейчас готовлю завтрак., @Majenko
Да, конечно , я не спешу, но когда вы будете свободны, пожалуйста, сделайте мне это одолжение, @Subha Jeet Sikdar
Если вы объявите
T Data[length]
(гдеT
-тип), допустимые индексы массива будут выполняться от0
доlength-1'. С объявлением
T Data[1]единственным допустимым индексом является 0 (в этом случае использование массива бессмысленно). При
T Data[0]` допустимого индекса вообще нет, так как массив абсолютно ничего не содержит., @Edgar Bonet@Edgar Bonet ХОРОШО..., @Subha Jeet Sikdar