Базовый операнд ‘->’ имеет тип без указателя ‘cv::Mat’ sourceAux->data.fl[(fila-1)*numColumnas columna-1] = matA->getValueData(fila,columna);

#c #opencv

#c #opencv

Вопрос:

Здравствуйте, я компилирую пакет, во время компиляции я столкнулся с некоторой проблемой из-за преобразования типов данных. После поиска я обнаружил несколько похожих проблем, но это мне не помогло. Я не очень силен в программировании на C . Ваша помощь будет высоко оценена. Код составляет более 3 сотен строк, но я опубликую только ту часть, в которой произошла ошибка. Ошибка:

     aerostack_stack/stack/libraries/lib_cvgutils/src/source/matrixLib.cpp: In member function ‘int CVG::Matrix::pseudoinverse(CVG::Matrix*)’:
/home/ibrrahim/catkin_workspaces/aerostack_catkin_ws/src/aerostack_stack/stack/libraries/lib_cvgutils/src/source/matrixLib.cpp:279:13: error: base operand of ‘->’ has non-pointer type ‘cv::Mat’
    sourceAux->data.fl[(fila-1)*numColumnas columna-1] = matA->getValueData(fila,columna);
             ^~
/home/ibrrahim/catkin_workspaces/aerostack_catkin_ws/src/aerostack_stack/stack/libraries/lib_cvgutils/src/source/matrixLib.cpp:283:32: error: ‘CV_SVD’ was not declared in this scope
     cvInvert(sourceAux,pinvAux,CV_SVD); //CV_SVD
                                ^~~~~~
/home/ibrrahim/catkin_workspaces/aerostack_catkin_ws/src/aerostack_stack/stack/libraries/lib_cvgutils/src/source/matrixLib.cpp:283:32: note: suggested alternative: ‘CV_SSE’
     cvInvert(sourceAux,pinvAux,CV_SVD); //CV_SVD
                                ^~~~~~
                                CV_SSE
/home/ibrrahim/catkin_workspaces/aerostack_catkin_ws/src/aerostack_stack/stack/libraries/lib_cvgutils/src/source/matrixLib.cpp:283:5: error: ‘cvInvert’ was not declared in this scope
     cvInvert(sourceAux,pinvAux,CV_SVD); //CV_SVD
     ^~~~~~~~
/home/ibrrahim/catkin_workspaces/aerostack_catkin_ws/src/aerostack_stack/stack/libraries/lib_cvgutils/src/source/matrixLib.cpp:288:32: error: base operand of ‘->’ has non-pointer type ‘cv::Mat’
    Matrix::setValueData(pinvAux->data.fl[(fila-1)*numColumnas columna-1],fila,columna);
                                ^~
aerostack_stack/stack/libraries/lib_cvgutils/CMakeFiles/lib_cvgutils.dir/build.make:62: recipe for target 'aerostack_stack/stack/libraries/lib_cvgutils/CMakeFiles/lib_cvgutils.dir/src/source/matrixLib.cpp.o' failed
 

Часть кода, в которой это произошло, такова:

 int Matrix::pseudoinverse(Matrix* matA)
{
    //Comprobaciones previas
    //To do
    //Pinv calulation
    cv::Mat pinvAux=cv::Mat(Matrix::numFilas,Matrix::numColumnas,CV_32FC1);
    cv::Mat sourceAux=cv::Mat(Matrix::numFilas,Matrix::numColumnas,CV_32FC1);
    for(int fila=1;fila<=numFilas;fila  )
    {
        for(int columna=1;columna<=numColumnas;columna  )
        {
            //printf("%fn",sourceAux->data.fl[1]);
            sourceAux->data.fl[(fila-1)*numColumnas columna-1] = matA->getValueData(fila,columna);
            //printf("%fn",sourceAux->data.fl[(fila-1)*numColumnas columna-1]);
        }
    }
    cvInvert(sourceAux,pinvAux,CV_SVD); //CV_SVD
    for(int fila=1;fila<=numFilas;fila  )
    {
        for(int columna=1;columna<=numColumnas;columna  )
        {
            Matrix::setValueData(pinvAux->data.fl[(fila-1)*numColumnas columna-1],fila,columna);
        }
    }

    //End
    return 1;
}
 

Не могли бы вы дать мне несколько советов, как справиться с этой проблемой преобразования типов данных, потому что тип sourceAux данных is cv::Mat while data является указателем float* .

Комментарии:

1. sourceAux.data[… -> вероятно, должно быть sourceAux.data[… потому что cv::Mat не является типом указателя (где cv::Mat * вместо этого будет типом указателя).

Ответ №1:

У вас есть оператор-член ( . ) и оператор-член-указатель ( -> ) в неправильном порядке. Итак, вместо:

     sourceAux->data.fl[(fila-1)*numColumnas columna-1] = matA->getValueData(fila,columna);
 

вы должны использовать:

     sourceAux.data->fl[(fila-1)*numColumnas columna-1] = matA->getValueData(fila,columna);
 

Потому sourceAux что это объект (а не указатель), и, как вы уже сказали, его data элемент является указателем. Вы также должны внести аналогичное изменение в setValueData вызов, несколькими строками ниже.