Объявить unsigned char[] с Q_DECLARE_METATYPE

Я пытаюсь настроить некоторые модульные тесты с помощью QtTest, и я хотел бы использовать QFETCH.

Я тестирую следующую функцию:

static std::vector<bool> FrameHandler::getBitsFromFrame(unsigned char* data, unsigned char length);

Он просто преобразует массив символов в вектор битов.

Итак, я настроил свой тестовый класс следующим образом:

#include <QtTest/QtTest>
#include <vector>
#include "FrameHandler.h"

class BusTester : public QObject {
    Q_OBJECT

private slots:

    void bytesToVector_data() {
        QTest::addColumn<unsigned char[]>("Tested");
        QTest::addColumn<unsigned char>("Length");
        QTest::addColumn< std::vector<bool> >("Reference");

        // Test for one byte
        std::vector<bool> oneByte(8, false);
        oneByte[0] = true;
        oneByte[1] = true;
        oneByte[3] = true;
        oneByte[4] = true;

        unsigned char oneByteInput[1]{
            0b11011000
        };

        QTest::newRow("One byte") << oneByteInput << 1 << oneByte;
    }

    void bytesToVector() {
        QFETCH(unsigned char[], tested);
        QFETCH(unsigned char, length);
        QFETCH(std::vector<bool>, reference);

        QCOMPARE(FrameHandler::getBitsFromFrame(tested, length), reference);
    }
};

QTEST_MAIN(BusTester)
#include "bustester.moc"

Когда я это делаю, компилятор говорит:

expected unqualified-id before ‘[’ token
         QFETCH(unsigned char[], tested);

А также :

On line `QTest::addColumn<unsigned char[]>("Tested");`, Type is not registered, please use the Q_DECLARE_METATYPE macro to make it known to Qt's meta-object system

Я думал, что две ошибки связаны между собой, поэтому я добавил Q_DECLARE_METATYPE(unsigned char[]); перед объявлением класса, но потом получаю следующее:

В qmetatype.h ожидается '>' перед токеном '*' (строка 1695)

Можно ли объявить unsigned char[] в системе QMetaType Qt? Спасибо


person Xatyrian    schedule 11.08.2017    source источник


Ответы (1)


Q_DECLARE_METATYPE(T) Тип T должен быть конструируемым, копируемым и разрушаемым. Массив не соответствует этим правилам, но вы можете создать обертку.

struct Arr
{
    unsigned char arr[SIZE];
};
Q_DECLARE_METATYPE( Arr );

or

typedef std::array<unsigned char, SIZE> TArr;
Q_DECLARE_METATYPE( TArr );

Но есть одна сложность - РАЗМЕР, Вы должны его задекларировать

person arturx64    schedule 11.08.2017
comment
Или просто используйте unsigned char * - person dtech; 11.08.2017
comment
Да. Но в этом случае Вам придется держать куда-то указанный предмет, чтобы избежать нарушения прав доступа. Это тестовые данные, поэтому для этого можно использовать статические константы. - person arturx64; 11.08.2017
comment
Предположительно, ОП знает, что он делает, и теперь, чтобы избежать доступа за пределы границ. - person dtech; 11.08.2017
comment
@arturx64 ваш ответ выглядит разумным, я попробую как можно скорее! - person Xatyrian; 11.08.2017