Хранение массива пустых указателей - PullRequest
0 голосов
/ 14 февраля 2019

Я работаю над общей библиотекой для Arduino.В моих вложениях прерываний мне нужно объявить подпрограмму обработки прерываний с типом void(*)().

. Я передаю массив функций void, которые затем перебираю, чтобы заполнить свойство объекта следующим образом:

MainUnit.h

class MainUnit {
public:
    MainUnit(const String type,
             const int revisionNumber,
             const int totalInputs,
             uint8_t avrPinNumbers[],
             uint8_t spdtPinNumbers[],
             void* isrs[]);

private:
    void* InterruptServiceRoutines[];
};

MainUnit.cpp

MainUnit::MainUnit(const String type,
                   const int revisionNumber,
                   const int totalInputs,
                   uint8_t avrPinNumbers[],
                   uint8_t spdtPinNumbers[],
                   void* isrs[] )
{
    // copy spdt pins and isrs over
    for (uint8_t input = 0; input < totalInputs; input++) {
        this->InterruptServiceRoutines[input] = isrs[input];
    }
}

Есть ли способ использовать это вместо void(*)().Я получаю сообщение об ошибке «Невозможно преобразовать lvalue типа void* в тип параметра void(*)()», когда я пытаюсь что-то вроде этого:

attachInterrupt(digitalPinToInterrupt(8), this->InterruptServiceRoutines[0], CHANGE)

Я думаю, больший вопрос, который у меня есть, в чем разница междуvoid* и void(*)()?Я пытался найти и не нашел ответов на этот вопрос.Я предполагаю, что void(*)() - это указатель на функцию void, а void* - это указатель на тип void?Если так, есть ли правильный способ инициализировать массив указателей на функцию void?

1 Ответ

0 голосов
/ 14 февраля 2019

Нет способа использовать ваш код вместо void (*)().Вам нужно использовать массив void (*)().

Разница между пустотой * и пустотой (*) () - это разница между указанием на число

int number = 3;

и указанием наmy_die

int rando() {
    return random() % 4;
}

Вот почему люди говорят, что это действительно большое дело.

Следующая важная проблема заключается в том, что вы объявляете член массива переменной длины, не назначая его, и я неЯ думаю, что это работает.Я думаю, вам нужно, чтобы это был указатель на набор void_fptrs, который вам нужно будет выделить перед тем, как вы начнете их устанавливать.

Комментарий super должен быть полезен для получения правильного типа.Тем не менее, они предложили массив указателей на функции фиксированной длины, который не согласуется с вашим использованием totalInputs.Я предполагаю, что вы действительно хотите иметь динамический массив вместо этого, основываясь на том факте, что ваш код позволяет вводить переменное число из них. Синтаксис массива переменной длины работает, только если вы присваиваете значение в объявлении,либо с помощью аргумента функции, либо с помощью присваивания при объявлении, и вы не делаете ни одного из них здесь.Вы должны иметь возможность использовать new для выделения динамического массива void_fptr.

...