Не компилируется Qt-проект
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 16.08.22 07:45
Оценка:
Я создал в своё время проект на Visual Studio 2012 с использованием библиотеки MFC. У меня всё нормально компилировалось, запускалось и выполнялось.
Мне нужно стало перевести этот проект с библиотеки MFC на библиотеку Qt. Для этого я создал новый проект в Qt Creator 4.12.2 . Я перебросил туда .h-файлы и .cpp-файлы (не связанные диалогами MFC!) из этой первой программы.

В частности, у меня есть файлы 3dvecmat.h и 3dvecmat.cpp , где описан класс T3DMatrix для работы с матрицами размером 3x3 (поле a представляет собой массив long double[3][3] ). Вот некоторые его методы:

T3DMatrix::T3DMatrix()
{
    a[0][0] = a[0][1] = a[0][2] =
    a[1][0] = a[1][1] = a[1][2] =
    a[2][0] = a[2][1] = a[2][2] = 0.0;
}

T3DMatrix::T3DMatrix(T3DMatrix& m)
{
    a[0][0] = m.a[0][0];  a[0][1] = m.a[0][1];  a[0][2] = m.a[0][2];
    a[1][0] = m.a[1][0];  a[1][1] = m.a[1][1];  a[1][2] = m.a[1][2];
    a[2][0] = m.a[2][0];  a[2][1] = m.a[2][1];  a[2][2] = m.a[2][2];
}

T3DMatrix::T3DMatrix(long double a00, long double a01, long double a02, long double a10, long double a11, long double a 12,
                     long double a20, long double a21, long double a22)
{
    a[0][0] = a00;  a[0][1] = a01;  a[0][2] = a02;
    a[1][0] = a10;  a[1][1] = a11;  a[1][2] = a12;
    a[2][0] = a20;  a[2][1] = a21;  a[2][2] = a22;  
}

T3DMatrix& T3DMatrix::operator=(T3DMatrix m)
{
    a[0][0] = m.a[0][0];  a[0][1] = m.a[0][1];  a[0][2] = m.a[0][2];
    a[1][0] = m.a[1][0];  a[1][1] = m.a[1][1];  a[1][2] = m.a[1][2];
    a[2][0] = m.a[2][0];  a[2][1] = m.a[2][1];  a[2][2] = m.a[2][2];
    return *this;
}

T3DMatrix& T3DMatrix::operator+=(T3DMatrix m)
{
    a[0][0] += m.a[0][0];  a[0][1] += m.a[0][1];  a[0][2] += m.a[0][2];
    a[1][0] += m.a[1][0];  a[1][1] += m.a[1][1];  a[1][2] += m.a[1][2];
    a[2][0] += m.a[2][0];  a[2][1] += m.a[2][1];  a[2][2] += m.a[2][2];
    return *this;
}

T3DMatrix& T3DMatrix::operator-=(T3DMatrix m)
{
    a[0][0] -= m.a[0][0];  a[0][1] -= m.a[0][1];  a[0][2] -= m.a[0][2];
    a[1][0] -= m.a[1][0];  a[1][1] -= m.a[1][1];  a[1][2] -= m.a[1][2];
    a[2][0] -= m.a[2][0];  a[2][1] -= m.a[2][1];  a[2][2] -= m.a[2][2];
    return *this;

}

И при компиляции (сборке) проекта у меня появляются ошибки:

cannot bind non-const lvalue reference of type 'T3DMatrix&' to an rvalue 'T3DMatrix'


no matching constructor for initialization of 'T3DMatrix'


Ошибки эти появляются в следующих местах кода:

result += v->Var_f(jt,tj,r);


fg = m_EarthPerturb_var->Var_f(m_ff->m.JT,m_ff->m.TJ,m_ff->m.RVg);


F_v +=  m_GravMoonPerturb_Var->Var_f(jt,tj,r);


F_var -= m_ff->m_AtmEarth->m_Ro*E;


g = MT*dRT_dr[n]*L;


RM = R*m_M;


F_var += (RMT*dL_dl*RM);


Во всех этих случаях переменные result, fg, F_v, F_var, g, RM являются переменными типа T3DMatrix, определённые ранее. А правые части этих выражений возвращают переменную типа T3DMatrix.

В чём причина этих появляющихся ошибок при компиляции программы? Мне нужно что-то изменить в классе T3DMatrix?
Или же это "наведённые" ошибки--когда в классе T3DMatrix всё правильно, а настоящие ошибки надо искать в других местах моей программы?
1613 г. = 2024 г.
Re: Не компилируется Qt-проект
От: Нomunculus Россия  
Дата: 16.08.22 07:47
Оценка: +2
Здравствуйте, RussianFellow, Вы писали:

Так русским по-белому написано ж:

cannot bind non-const lvalue reference of type 'T3DMatrix&' to an rvalue 'T3DMatrix'
no matching constructor for initialization of 'T3DMatrix'
Re: Не компилируется Qt-проект
От: SаNNy Россия  
Дата: 16.08.22 07:51
Оценка: +1
Здравствуйте, RussianFellow, Вы писали:

T3DMatrix& T3DMatrix::operator=(const T3DMatrix& m)


и так для всех
Re[2]: Не компилируется Qt-проект
От: Igore Россия  
Дата: 16.08.22 08:21
Оценка:
Здравствуйте, SаNNy, Вы писали:

SNN>Здравствуйте, RussianFellow, Вы писали:


https://en.cppreference.com/w/cpp/language/copy_assignment
T3DMatrix& T3DMatrix::operator=(const T3DMatrix & m)

Так заметней будет, но вообще вариант с передачей по значению тоже есть
https://en.cppreference.com/w/cpp/language/copy_constructor
T3DMatrix::T3DMatrix(const T3DMatrix& m)


SNN>и так для всех

T3DMatrix& T3DMatrix::operator+=(const T3DMatrix& m)
T3DMatrix& T3DMatrix::operator-=(const T3DMatrix& m)

P.S.
Какой сейчас компилятор используется? Похоже можно часть кода убрать использую новые возможности языка
Re: Не компилируется Qt-проект
От: anatolym  
Дата: 16.08.22 12:33
Оценка: +2
Здравствуйте, RussianFellow, Вы писали:

Не в тему.
Есть уже готовые библиотеки для векторно-матричных операций. Например, Eigen.
Там есть классы Eigen::Matrix3d и Egen::Vector3d.
Проще, наверное, было бы взять уже что-то готовое и рабочее.
Ее даже собирать не надо. Достаточно скачать и подключить в проекте в заголовках ссылку на папку.

Ссылка на скачивание: https://gitlab.com/libeigen/eigen/-/releases/3.4.0

Примеры использования https://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html

В Qt есть тоже векторы и матрицы. Но основные классы QMatrix4x4 и QVector3D базируются на типе float.
Есть шаблонная матрица template <int N, int M, typename T> class QGenericMatrix, но ее функционал довольно беден.
Re: Не компилируется Qt-проект
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 24.08.22 13:12
Оценка: :))) :)
Почти все ошибки компиляции устранены, но осталась одна.

Вот код:

static Satellite* sat;

int  CreateSatellite(NU_SO *NU_in, BX_co *f)
{
    NewSatInit  nst; // структура, содержащая данные для инициализации класса Satellite

    // инициализация полей структуры sat;
    sat = new Satellite(nst); // инициализация объекта класса Satellite*
    NewSatellite(sat); действия над sat*
    return (int)sat; // так и задумывалось - преобразовать Satellite* в int, то есть указатель - в целое число
}


И вот в последней строчке этого кода компилятор ругается--выдаёт ошибку:

Проблема сборки
cast from Satellite* to int
loses precision [-fpermissive]
return (int)sat;


Как устранить эту ошибку? Как правильно преобразовать Satellite* (то есть указатель на тип Satellite) в тип int ?
1613 г. = 2024 г.
Re[2]: Не компилируется Qt-проект
От: SаNNy Россия  
Дата: 24.08.22 13:27
Оценка: +2
Здравствуйте, RussianFellow, Вы писали:


RF>Как устранить эту ошибку? Как правильно преобразовать Satellite* (то есть указатель на тип Satellite) в тип int ?


Зачем указатель преобразовывать в int и какое это отношение имеет к Qt?
Re[2]: Не компилируется Qt-проект
От: Chorkov Россия  
Дата: 24.08.22 13:57
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Как устранить эту ошибку? Как правильно преобразовать Satellite* (то есть указатель на тип Satellite) в тип int ?


Ответ зависит от того, для каких целей потребовалось такое преобразование.

В зависимости от настроек компилятора, тип int может иметь недостаточный размер, чтобы хранить указатель (64-x битный?), или, наоборот, слишком большой для обратного преобразования, или из-за прогулок целочисленного значения по переменным других целочисленных типов (другого размера и знаковости) значение будет потеряно.
Вообще, это плохая практика, закладываться на преобразование число<->указатель, подводных камней больше чем кажется. Если можно ее избежать — избегайте.

Возможные решения:

0) поменять алгоритм, так чтобы это преобразование было ненужно.

1) использовать std::ptrdiff_t вместо int, всюду куда может дотянуться это значение.

2) использовать std::size_t

3) Если нужен уникальный ID, и ненужно обратное преобразование, использовать std::size_t и вычисление хеша, вместо каста указателей
return std::hash<void*>{}(sat);



4) наплевать, на предупреждение, (отключить режим "предупреждения==ошибки" для данного предупреждения, добавив "-fpermissive" в командную строку компилятора, как и написано в тексте ошибки.)
Это поставит крест на возможной портируемости программы на другие платформы/процессоры/компиляторы.
Re[3]: Не компилируется Qt-проект
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 24.08.22 14:23
Оценка: :)
Здравствуйте, Chorkov, Вы писали:

Это преобразование от Satellite* к int писал не я, просто этот int будет использоваться в моей программе.

C>4) наплевать, на предупреждение, (отключить режим "предупреждения==ошибки" для данного предупреждения, добавив "-fpermissive" в командную строку компилятора, как и написано в тексте ошибки.)


А как добавить -fpermissive в командную строку компилятора (у меня Qt Creator 4.12.2) ?
1613 г. = 2024 г.
Re: Не компилируется Qt-проект
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 24.08.22 14:24
Оценка: +4
Здравствуйте, RussianFellow, Вы писали:

RF>В чём причина этих появляющихся ошибок при компиляции программы? Мне нужно что-то изменить в классе T3DMatrix?

RF>Или же это "наведённые" ошибки--когда в классе T3DMatrix всё правильно, а настоящие ошибки надо искать в других местах моей программы?

Слушай, есть же бесплатные курсы и лекции по С++, почему бы не потратить хотя бы немного времени на самообразование? Это же окупится
Re[2]: Не компилируется Qt-проект
От: anatolym  
Дата: 24.08.22 14:35
Оценка:
Здравствуйте, RussianFellow, Вы писали:

Так у тебя программа то небось 64 бит. Положим ты приведешь этот указатель к 32 битному int. А если он потом снова где-то будет преобразован в указатель, то это уже будет не тот указатель. И программа не будет работать как ожидалось.
Ты бы выяснил, для чего это преобразование делается.
Если указатель нужен как ключ. Ну можешь привести его к 64 битному целому и взять оттуда последние 32 бита.
Или изменить тип возвращаемый функцией на 64 битный.
Отредактировано 24.08.2022 14:38 anatolym . Предыдущая версия . Еще …
Отредактировано 24.08.2022 14:37 anatolym . Предыдущая версия .
Re[2]: Не компилируется Qt-проект
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 24.08.22 14:57
Оценка: +3
Здравствуйте, RussianFellow, Вы писали:


RF>Как устранить эту ошибку? Как правильно преобразовать Satellite* (то есть указатель на тип Satellite) в тип int ?





Не надо так делать
Маньяк Робокряк колесит по городу
Re[3]: Не компилируется Qt-проект
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 24.08.22 14:57
Оценка:
Здравствуйте, Chorkov, Вы писали:

C>1) использовать std::ptrdiff_t вместо int, всюду куда может дотянуться это значение.


Только uintptr_t
Маньяк Робокряк колесит по городу
Re[2]: Не компилируется Qt-проект
От: SaZ  
Дата: 24.08.22 16:06
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>Здравствуйте, RussianFellow, Вы писали:


RF>>В чём причина этих появляющихся ошибок при компиляции программы? Мне нужно что-то изменить в классе T3DMatrix?

RF>>Или же это "наведённые" ошибки--когда в классе T3DMatrix всё правильно, а настоящие ошибки надо искать в других местах моей программы?

N>Слушай, есть же бесплатные курсы и лекции по С++, почему бы не потратить хотя бы немного времени на самообразование? Это же окупится


Там, как правило, надо читать документацию и учится. Это уже несколько лет предлагается =)
Re[2]: Не компилируется Qt-проект
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 25.08.22 09:08
Оценка:
Я изменил int на uintptr_t (для этого пришлось подключить заголовочный файл <stdint.h>) и эта ошибка исчезла.
1613 г. = 2024 г.
Re: Не компилируется Qt-проект
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 25.08.22 09:25
Оценка: -1
Я изменил int на uintptr_t (для этого пришлось подключить заголовочный файл <stdint.h>) и ошибка, связанная с преобразованием Satellite* в int, исчезла.

Но появилась другая ошибка.
У меня проект называется LunarMissionOrbitsQt. Для его работы нужна библиотека libpd.lib, которая, в свою очередь, использует файлы libeay32.dll и libintl.dll . Все эти три файла находятся в каталоге LunarMissionOrbitsQt. Я подключил библиотеку libpq.lib к моему проекту, в результате чего в файле LunarMissionOrbitsQt.pro есть следующие строки:

#default rules for deployment.

qnx: terget.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/./ -llibpq
else:win32:CONFIG(debug, debug|release): LIBS ++ -L$$PWD/./ -llibpq
else:unix: LIBS += -L$$PWD/./ — llibpq

INCLUDEPATH += $$PWD/.
DEPENDPATH += $$PWD/.


И при сборке у меня появляются сообщения об ошибках:

skipping incompatible F:\Roman\Roman\LunarMissionOrbitsQt/libpq.lib when searching for -llibpq
skipping incompatible F:\Roman\Roman\LunarMissionOrbitsQt/libpq.lib when searching for -llibpq
skipping incompatible F:\Roman\Roman\LunarMissionOrbitsQt\libpq.lib when searching for -llibpq
cannot find -llibpq
collect2.exe: error: ld terurned 1 exit status


Что это означает? Как исправить эту ошибку? Может быть, надо надо подключить в мой проект LunarMissionOrbitsQt также файлы libeay32.dll и libintl.dll ?
1613 г. = 2024 г.
Re[2]: Не компилируется Qt-проект
От: Teolog  
Дата: 25.08.22 13:02
Оценка:
skipping incompatible F:\Roman\Roman\LunarMissionOrbitsQt/libpq.lib when searching for -llibpq
архитектуры разные
не надо кидать собранные библиотечки по каталогам, вся цепочка должна собираться разом с одинаковыми параметрами
Re[3]: Не компилируется Qt-проект
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 25.08.22 16:01
Оценка:
Здравствуйте, Teolog, Вы писали:

T>skipping incompatible F:\Roman\Roman\LunarMissionOrbitsQt/libpq.lib when searching for -llibpq

T>архитектуры разные
T>не надо кидать собранные библиотечки по каталогам, вся цепочка должна собираться разом с одинаковыми параметрами

И что же теперь делать? Отключить библиотеку и файлы, связанные с ней?
1613 г. = 2024 г.
Re[4]: Не компилируется Qt-проект
От: Аноним  
Дата: 25.08.22 21:02
Оценка:
RF>И что же теперь делать? Отключить библиотеку и файлы, связанные с ней?

Если не нужна -выкинуть, Если нужна — пересобрать под свою архитектуру-os-версию компилятора-рантайм.
Это не оно https://github.com/libpd/libpd?
Re[5]: Не компилируется Qt-проект
От: SаNNy Россия  
Дата: 26.08.22 06:13
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Это не оно https://github.com/libpd/libpd?

Не, libpq — это библиотека PostgreSQL
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.