Как преобразовать int в const int в ардуино?

library cpp

Для конкретного проекта мне нужно преобразовать 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, чтобы продолжить свой проект?

какая-нибудь помощь, пожалуйста? спасибо за вашу добрую поддержку.

, 👍0

Обсуждение

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


2 ответа


Лучший ответ:

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


0

Если вам нужна переменная длина массива, то вы можете использовать malloc. С тем же conext, если вы хотите инициировать массив с определенной длиной значения, вы должны использовать malloc.

,