Я создал в своё время проект на 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] ). Вот некоторые его методы:
Во всех этих случаях переменные result, fg, F_v, F_var, g, RM являются переменными типа T3DMatrix, определённые ранее. А правые части этих выражений возвращают переменную типа T3DMatrix.
В чём причина этих появляющихся ошибок при компиляции программы? Мне нужно что-то изменить в классе T3DMatrix?
Или же это "наведённые" ошибки--когда в классе T3DMatrix всё правильно, а настоящие ошибки надо искать в других местах моей программы?
Не в тему.
Есть уже готовые библиотеки для векторно-матричных операций. Например, Eigen.
Там есть классы Eigen::Matrix3d и Egen::Vector3d.
Проще, наверное, было бы взять уже что-то готовое и рабочее.
Ее даже собирать не надо. Достаточно скачать и подключить в проекте в заголовках ссылку на папку.
В Qt есть тоже векторы и матрицы. Но основные классы QMatrix4x4 и QVector3D базируются на типе float.
Есть шаблонная матрица template <int N, int M, typename T> class QGenericMatrix, но ее функционал довольно беден.
Почти все ошибки компиляции устранены, но осталась одна.
Вот код:
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 ?
Здравствуйте, 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" в командную строку компилятора, как и написано в тексте ошибки.)
Это поставит крест на возможной портируемости программы на другие платформы/процессоры/компиляторы.
Это преобразование от Satellite* к int писал не я, просто этот int будет использоваться в моей программе.
C>4) наплевать, на предупреждение, (отключить режим "предупреждения==ошибки" для данного предупреждения, добавив "-fpermissive" в командную строку компилятора, как и написано в тексте ошибки.)
А как добавить -fpermissive в командную строку компилятора (у меня Qt Creator 4.12.2) ?
Здравствуйте, RussianFellow, Вы писали:
RF>В чём причина этих появляющихся ошибок при компиляции программы? Мне нужно что-то изменить в классе T3DMatrix? RF>Или же это "наведённые" ошибки--когда в классе T3DMatrix всё правильно, а настоящие ошибки надо искать в других местах моей программы?
Слушай, есть же бесплатные курсы и лекции по С++, почему бы не потратить хотя бы немного времени на самообразование? Это же окупится
Так у тебя программа то небось 64 бит. Положим ты приведешь этот указатель к 32 битному int. А если он потом снова где-то будет преобразован в указатель, то это уже будет не тот указатель. И программа не будет работать как ожидалось.
Ты бы выяснил, для чего это преобразование делается.
Если указатель нужен как ключ. Ну можешь привести его к 64 битному целому и взять оттуда последние 32 бита.
Или изменить тип возвращаемый функцией на 64 битный.
Здравствуйте, Nuzhny, Вы писали:
N>Здравствуйте, RussianFellow, Вы писали:
RF>>В чём причина этих появляющихся ошибок при компиляции программы? Мне нужно что-то изменить в классе T3DMatrix? RF>>Или же это "наведённые" ошибки--когда в классе T3DMatrix всё правильно, а настоящие ошибки надо искать в других местах моей программы?
N>Слушай, есть же бесплатные курсы и лекции по С++, почему бы не потратить хотя бы немного времени на самообразование? Это же окупится
Там, как правило, надо читать документацию и учится. Это уже несколько лет предлагается =)
Я изменил int на uintptr_t (для этого пришлось подключить заголовочный файл <stdint.h>) и ошибка, связанная с преобразованием Satellite* в int, исчезла.
Но появилась другая ошибка.
У меня проект называется LunarMissionOrbitsQt. Для его работы нужна библиотека libpd.lib, которая, в свою очередь, использует файлы libeay32.dll и libintl.dll . Все эти три файла находятся в каталоге LunarMissionOrbitsQt. Я подключил библиотеку libpq.lib к моему проекту, в результате чего в файле LunarMissionOrbitsQt.pro есть следующие строки:
И при сборке у меня появляются сообщения об ошибках:
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 ?
skipping incompatible F:\Roman\Roman\LunarMissionOrbitsQt/libpq.lib when searching for -llibpq
архитектуры разные
не надо кидать собранные библиотечки по каталогам, вся цепочка должна собираться разом с одинаковыми параметрами
Здравствуйте, Teolog, Вы писали:
T>skipping incompatible F:\Roman\Roman\LunarMissionOrbitsQt/libpq.lib when searching for -llibpq T>архитектуры разные T>не надо кидать собранные библиотечки по каталогам, вся цепочка должна собираться разом с одинаковыми параметрами
И что же теперь делать? Отключить библиотеку и файлы, связанные с ней?