Re[6]: Не компилируется Qt-проект
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 26.08.22 07:53
Оценка:
Здравствуйте, SаNNy, Вы писали:

SNN>Здравствуйте, Аноним, Вы писали:


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

SNN>Не, libpq — это библиотека PostgreSQL

Да, совершенно верно — libpq это библиотека PostgreSQL.

Как пересобрать эту библиотеку под мою архитектуру компилятора Qt Creator 4.12.2 операционной системы Windows 10 ?
1613 г. = 2024 г.
Re[7]: Не компилируется Qt-проект
От: SаNNy Россия  
Дата: 26.08.22 08:00
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Да, совершенно верно — libpq это библиотека PostgreSQL.


RF>Как пересобрать эту библиотеку под мою архитектуру компилятора Qt Creator 4.12.2 операционной системы Windows 10 ?

Я посмотрел, это библиотека на C, ее не надо пересобирать.
Отредактировано 26.08.2022 8:01 SаNNy . Предыдущая версия .
Re[8]: Не компилируется Qt-проект
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 26.08.22 09:52
Оценка:
Здравствуйте, SаNNy, Вы писали:

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


RF>>Да, совершенно верно — libpq это библиотека PostgreSQL.


RF>>Как пересобрать эту библиотеку под мою архитектуру компилятора Qt Creator 4.12.2 операционной системы Windows 10 ?

SNN>Я посмотрел, это библиотека на C, ее не надо пересобирать.

Так как же сделать так, чтобы компилятор не ругался на эту библиотеку?
1613 г. = 2024 г.
Re[9]: Не компилируется Qt-проект
От: SаNNy Россия  
Дата: 26.08.22 09:55
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Так как же сделать так, чтобы компилятор не ругался на эту библиотеку?


Линкер не может найти lib файл этой библиотеки. Надо указать правильный путь к ней.
Re[10]: Не компилируется Qt-проект
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 26.08.22 12:25
Оценка:
Здравствуйте, SаNNy, Вы писали:

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


RF>>Так как же сделать так, чтобы компилятор не ругался на эту библиотеку?


SNN>Линкер не может найти lib файл этой библиотеки. Надо указать правильный путь к ней.


А как правильно указать правильный путь к lib-файлу? Я попробовал различные способы--всё никак не получается.
Папка называется LunarMissionOrbits, в ней находится .pro-файл, .ui-файлы, .h-файлы, .cpp-файлы и файл libpq.lib .
В QtCreator я нажал на правую кнопку "мыши" на файле LunarMissionOrbits.pro, выбрал "Добавить библиотеку", попробовал добавить библиотеку разными способами (как внешнюю библиотеку или как системную библиотеку) — всё никак не получается.
1613 г. = 2024 г.
Re[11]: Не компилируется Qt-проект
От: SаNNy Россия  
Дата: 26.08.22 12:33
Оценка:
Здравствуйте, RussianFellow, Вы писали:

Архитектура libpq совпадает с проектом (x86 или x64) ?

А так путь к файлам линковки задается через
QMAKE_LIBDIR += <путь>

в .pro файле
Re[8]: Не компилируется Qt-проект
От: qaz77  
Дата: 26.08.22 13:14
Оценка:
Здравствуйте, SаNNy, Вы писали:
SNN>Я посмотрел, это библиотека на C, ее не надо пересобирать.

Телепатически предсказываю, что у него библиотека x86, а проект билдится для x64.
Re[9]: Не компилируется Qt-проект
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 26.08.22 18:47
Оценка:
Здравствуйте, qaz77, Вы писали:

Q>Здравствуйте, SаNNy, Вы писали:

SNN>>Я посмотрел, это библиотека на C, ее не надо пересобирать.

Q>Телепатически предсказываю, что у него библиотека x86, а проект билдится для x64.


А можно ли как-то сделать, чтобы у меня проект билдился бы для x86 ?
1613 г. = 2024 г.
Re[10]: Не компилируется Qt-проект
От: Нomunculus Россия  
Дата: 26.08.22 19:01
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>А можно ли как-то сделать, чтобы у меня проект билдился бы для x86 ?


Ну тогда и Qt должно быть x86.
Re[7]: Не компилируется Qt-проект
От: Igore Россия  
Дата: 26.08.22 19:43
Оценка:
Здравствуйте, RussianFellow, Вы писали:

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

SNN>>Не, libpq — это библиотека PostgreSQL
RF>Да, совершенно верно — libpq это библиотека PostgreSQL.
RF>Как пересобрать эту библиотеку под мою архитектуру компилятора Qt Creator 4.12.2 операционной системы Windows 10 ?
https://doc.qt.io/qt-6/sql-driver.html#qpsql

How to Build the QPSQL Plugin on Windows

Install the appropriate PostgreSQL developer libraries for your compiler. Assuming that PostgreSQL was installed in C:\pgsql, build the plugin as follows:

mkdir build-sqldrivers
cd build-sqldrivers

qt-cmake -G Ninja <qt_installation_path>\Src\qtbase\src\plugins\sqldrivers -DCMAKE_INSTALL_PREFIX=<qt_installation_path>\<platform> -DCMAKE_INCLUDE_PATH="C:\pgsql\include" -DCMAKE_LIBRARY_PATH="C:\pgsql\lib"
cmake --build .
cmake --install .

Сделай нормально, собери плагин и используй везде Qt
Re[2]: Не компилируется Qt-проект
От: AleksandrN Россия  
Дата: 27.08.22 20:38
Оценка: :)
Здравствуйте, RussianFellow, Вы писали:

RF>У меня проект называется LunarMissionOrbitsQt.


Надеюсь, этот проект не будет использоваться для управления космическими аппаратами.
Re[3]: Не компилируется Qt-проект
От: pilgrim_ Россия  
Дата: 27.08.22 20:52
Оценка:
Здравствуйте, AleksandrN, Вы писали:

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


RF>>У меня проект называется LunarMissionOrbitsQt.


AN>Надеюсь, этот проект не будет использоваться для управления космическими аппаратами.


Надеемся...
Автор: pilgrim_
Дата: 16.06.18
Re: Не компилируется Qt-проект
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 30.08.22 16:25
Оценка:
Я убрал библиотеку libpq.lib из моего проекта и я закомментировал весь код, связанный с работой с базами данных (разбираться с этим я буду потом).
После небольших изменений в файлах 3dvecmat.h и 3dvecmat.cpp -- файлы, предназначенные для работы с трехмерными векторами и трехмерными матрицами -- у меня теперь программа компилируется (собирается) и запускается.
В связи с этим у меня к вам, уважаемые коллеги, вопрос: не могли бы вы посмотреть код этих файлов 3dvecmat.h и 3dvecmat.cpp и сказать, всё ли правильно в этих файлах?

Файл 3dvecmat.h :

#ifndef T3DVECMAT_H
#define T3DVECMAT_H

//#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "Types.h"
//include <process.h>
#define  smult %
class T3DMatrix;
class T3DVector
{
    friend class T3DMatrix;
public:
    LDouble x,y,z;
    T3DVector();
    //T3DVector(T3DVector& v);
    T3DVector(const T3DVector& v);
    T3DVector(LDouble x0,LDouble y0,LDouble z0);

    T3DVector& operator= (T3DVector v);
    T3DVector& operator+=(T3DVector v);
    T3DVector& operator-=(T3DVector v);
    T3DVector& operator*=(T3DVector v);

    T3DVector operator*=(LDouble s);
    T3DVector operator/=(LDouble s);

    LDouble& operator[](int i);
    LDouble      abs();
    T3DVector ort();

    friend  T3DVector operator+(T3DVector v1,T3DVector v2);
    friend  T3DVector operator-(T3DVector v1,T3DVector v2);
    friend  T3DVector operator-(T3DVector v1);
    friend  T3DVector operator*(LDouble s,T3DVector v2);
    friend  T3DVector operator*(T3DVector v1,LDouble s);
    friend  T3DVector operator/(T3DVector v1,LDouble s);
    friend  T3DVector operator*(T3DVector v1,T3DVector v2);
    friend  LDouble   operator%(T3DVector v1,T3DVector v2);
    friend  T3DVector operator*(T3DVector v,T3DMatrix m);
    friend  T3DVector operator*(T3DMatrix m,T3DVector v);
    friend  LDouble   cos(T3DVector v1,T3DVector v2);
    friend  LDouble      operator^(T3DVector v1,T3DVector v2);
    friend  LDouble      abs(T3DVector v2);
    friend bool operator==(T3DVector v1,T3DVector v2);
    friend bool operator!=(T3DVector v1,T3DVector v2);
};

class T3DMatrix
{
public:
    LDouble a[3][3];
    T3DMatrix();
    T3DMatrix(T3DMatrix& m);
    T3DMatrix(LDouble a00,LDouble a01,LDouble a02,
              LDouble a10,LDouble a11,LDouble a12,
              LDouble a20,LDouble a21,LDouble a22
             );

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

    T3DMatrix operator*=(LDouble s);
    T3DMatrix operator/=(LDouble s);

    T3DMatrix transp();
    LDouble& operator()(int i,int j);
    LDouble det();
    T3DMatrix inv();


    T3DVector& operator[](int i);
    friend  T3DMatrix operator+(T3DMatrix m1,T3DMatrix m2);
    friend  T3DMatrix operator-(T3DMatrix m1,T3DMatrix m2);
    //friend  T3DMatrix operator*(const T3DMatrix& m1,const T3DMatrix& m2);
    friend  T3DMatrix operator*(T3DMatrix m1,T3DMatrix m2);
    friend  T3DMatrix operator-(T3DMatrix m1);
    friend  T3DMatrix operator*(T3DMatrix m1,LDouble s);
    friend  T3DMatrix operator*(LDouble s,T3DMatrix m1);
    friend  T3DMatrix operator/(T3DMatrix m1,LDouble s);
    friend  T3DMatrix operator/(LDouble s,T3DMatrix m1);
    friend  T3DMatrix operator~(T3DMatrix m); //transp;
    friend  T3DMatrix operator!(T3DMatrix m);
    friend  T3DVector operator*(T3DVector v,T3DMatrix m);
    friend  T3DVector operator*(T3DMatrix m,T3DVector v);
    friend bool operator==(T3DMatrix m1,T3DMatrix m2);
    friend bool operator!=(T3DMatrix m1,T3DMatrix m2);
 };

#endif





Файл 3dvecmat.cpp :

//#include "stdafx.h"
#include "3dvecmat.h"

    T3DVector::T3DVector(){x=y=z=0.L;};
    T3DVector::T3DVector(const T3DVector& v){x=v.x;y=v.y;z=v.z;};
    T3DVector::T3DVector(LDouble x0,LDouble y0,LDouble z0){x=x0;y=y0;z=z0;};

    T3DVector& T3DVector::operator= (T3DVector v){x=v.x;y=v.y;z=v.z;return *this;};
    T3DVector& T3DVector::operator+=(T3DVector v){x+=v.x;y+=v.y;z+=v.z;return *this;};
    T3DVector& T3DVector::operator-=(T3DVector v){x-=v.x;y-=v.y;z-=v.z;return *this;};
    T3DVector& T3DVector::operator*=(T3DVector v)
     {
        LDouble X,Y,Z;
        X = y*v.z-z*v.y;
        Y = z*v.x-x*v.z;
        Z = x*v.y-y*v.x;
        x = X; y = Y; z = Z;
        return *this;

     }; //vector multiplication

    T3DVector T3DVector::operator*=(LDouble s){x*=s;y*=s;z*=s;return *this;};
    T3DVector T3DVector::operator/=(LDouble s){x/=s;y/=s;z/=s;return *this;};

    LDouble& T3DVector::operator[](int i){return ((LDouble*)&x)[i-1];};
    LDouble   T3DVector::abs(){return sqrtl(x*x+y*y+z*z);};
    T3DVector T3DVector::ort(){T3DVector res; long double x1, y1, z1; LDouble s = abs(); x1=x/s;y1=y/s;z1=z/s; res.x = x1; res.y = y1; res.z = z1; return res;};

    T3DVector operator+(T3DVector v1,T3DVector v2)
    { T3DVector tmp = v1; return tmp+=v2;};

    T3DVector operator-(T3DVector v1,T3DVector v2)
    { T3DVector tmp = v1; return tmp-=v2;};

    T3DVector operator-(T3DVector v1)
    {T3DVector res(-v1.x,-v1.y,-v1.z);
       return res;
    };

    T3DVector operator*(LDouble s,T3DVector v2)
    {
       T3DVector tmp(v2);
       tmp*=s;
       return tmp;
    };
    T3DVector operator*(T3DVector v1,LDouble s)
    { T3DVector tmp = v1; tmp *= s;return tmp;};

    T3DVector operator*(T3DVector v1,T3DVector v2)
    // vector multiply
    {
        LDouble X,Y,Z;
        T3DVector  res;
        X = v1.y*v2.z-v1.z*v2.y;
        Y = v1.z*v2.x-v1.x*v2.z;
        Z = v1.x*v2.y-v1.y*v2.x;
        res.x = X; res.y = Y; res.z = Z;
        return res;
    };

    T3DVector operator/(T3DVector v1,LDouble s)
    { T3DVector tmp = v1; tmp /= s;return tmp;};

    LDouble      operator%(T3DVector v1,T3DVector v2)
    { return (v1.x*v2.x+v1.y*v2.y+v1.z*v2.z);};// scalar multiply

    T3DVector operator*(T3DVector v,T3DMatrix m);


    LDouble   cos(T3DVector v1,T3DVector v2)
    { return (v1 % v2)/(v1.abs()*v2.abs());};

    LDouble      operator^(T3DVector v1,T3DVector v2)
      {return acosl(cos(v1,v2));};

    LDouble      abs(T3DVector v2)
      {return v2.abs();};

    bool operator==(T3DVector v1,T3DVector v2)
    {return((v1.x==v2.x)&&(v1.y==v2.y)&&(v1.z==v2.z));};

    bool operator!=(T3DVector v1,T3DVector v2)
    {return!(v1==v2);};


    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.L;};
    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(LDouble a00,LDouble a01,LDouble a02,
              LDouble a10,LDouble a11,LDouble a12,
              LDouble a20,LDouble a21,LDouble 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= (const 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+=(const 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-=(const 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*=(LDouble s)
    { a[0][0]*=s;a[0][1]*=s;a[0][2]*=s;
      a[1][0]*=s;a[1][1]*=s;a[1][2]*=s;
      a[2][0]*=s;a[2][1]*=s;a[2][2]*=s;
      return *this;};



    T3DMatrix T3DMatrix::operator/=(LDouble s)
    { a[0][0]/=s;a[0][1]/=s;a[0][2]/=s;
      a[1][0]/=s;a[1][1]/=s;a[1][2]/=s;
      a[2][0]/=s;a[2][1]/=s;a[2][2]/=s;
      return *this;};


    T3DMatrix T3DMatrix::transp() // transp self
    { LDouble tmp;

#define swap(X,Y)  tmp=(X),(X)=(Y),(Y)=tmp
      swap(a[0][1],a[1][0]);
      swap(a[0][2],a[2][0]);
      swap(a[1][2],a[2][1]);
     return *this;
#undef swap
    }  ;

    LDouble& T3DMatrix::operator()(int i,int j) {return a[i-1][j-1];};

 
    LDouble  T3DMatrix::det()
    {
     LDouble Det = (     a[0][0]*a[1][1]*a[2][2] - a[0][0]*a[1][2]*a[2][1]
               - a[0][1]*a[1][0]*a[2][2] + a[0][1]*a[1][2]*a[2][0]
               + a[0][2]*a[1][0]*a[2][1] - a[0][2]*a[1][1]*a[2][0]
           );

     return Det;
     };
 

    T3DVector& T3DMatrix::operator[](int i) { return *(T3DVector*)a[3*(i-1)];}

    T3DMatrix operator+(T3DMatrix m1,T3DMatrix m2)
    { T3DMatrix tmp = m1; tmp+=m2; return tmp;};

    T3DMatrix operator-(T3DMatrix m1,T3DMatrix m2)
    { T3DMatrix tmp = m1; tmp-=m2;return  tmp;};

    //T3DMatrix operator*(const T3DMatrix& m1,const T3DMatrix& m2)
    T3DMatrix operator*(T3DMatrix m1, T3DMatrix m2)
    {
       T3DMatrix res(
            m1.a[0][2]*m2.a[2][0] + m1.a[0][1]*m2.a[1][0] + m1.a[0][0]*m2.a[0][0],
            m1.a[0][2]*m2.a[2][1] + m1.a[0][1]*m2.a[1][1] + m1.a[0][0]*m2.a[0][1],
            m1.a[0][2]*m2.a[2][2] + m1.a[0][1]*m2.a[1][2] + m1.a[0][0]*m2.a[0][2],
            m1.a[1][2]*m2.a[2][0] + m1.a[1][1]*m2.a[1][0] + m1.a[1][0]*m2.a[0][0],
            m1.a[1][2]*m2.a[2][1] + m1.a[1][1]*m2.a[1][1] + m1.a[1][0]*m2.a[0][1],
            m1.a[1][2]*m2.a[2][2] + m1.a[1][1]*m2.a[1][2] + m1.a[1][0]*m2.a[0][2],
            m1.a[2][2]*m2.a[2][0] + m1.a[2][1]*m2.a[1][0] + m1.a[2][0]*m2.a[0][0],
            m1.a[2][2]*m2.a[2][1] + m1.a[2][1]*m2.a[1][1] + m1.a[2][0]*m2.a[0][1],
            m1.a[2][2]*m2.a[2][2] + m1.a[2][1]*m2.a[1][2] + m1.a[2][0]*m2.a[0][2]
            );

       return res;
    };

    T3DMatrix operator-(T3DMatrix m1)
    {
       T3DMatrix res(
            -m1.a[0][0], -m1.a[0][1], -m1.a[0][2],
            -m1.a[1][0], -m1.a[1][1], -m1.a[1][2],
            -m1.a[2][0], -m1.a[2][1], -m1.a[2][2]
            );
      return res;

    };

    T3DMatrix operator*(T3DMatrix m1,LDouble s)
    {T3DMatrix tmp =m1; tmp*=s; return tmp;};

    T3DMatrix operator*(LDouble s,T3DMatrix m1)
    {T3DMatrix tmp =m1; tmp*=s; return tmp;};

    T3DMatrix operator/(T3DMatrix m1,LDouble s)
    {T3DMatrix tmp =m1; tmp/=s; return tmp;};

    T3DMatrix operator/(LDouble s,T3DMatrix m1)
    {T3DMatrix tmp =m1; tmp.inv(); tmp*=s; return tmp;};

    T3DMatrix operator~(T3DMatrix m) //transp;
    {  T3DMatrix res
         (
          m.a[0][0],m.a[1][0],m.a[2][0],
          m.a[0][1],m.a[1][1],m.a[2][1],
          m.a[0][2],m.a[1][2],m.a[2][2]
         )    ;
      return res;

    };

    T3DMatrix operator!(T3DMatrix m)
    { //register LDouble d=m.det();
      LDouble d=m.det();
      if(d != 0) {

      T3DMatrix res(
               (m.a[1][1]*m.a[2][2] - m.a[1][2]*m.a[2][1])/d,
              -(m.a[0][1]*m.a[2][2] - m.a[0][2]*m.a[2][1])/d,
               (m.a[0][1]*m.a[1][2] - m.a[0][2]*m.a[1][1])/d,
              -(m.a[1][0]*m.a[2][2] - m.a[1][2]*m.a[2][0])/d,
               (m.a[0][0]*m.a[2][2] - m.a[0][2]*m.a[2][0])/d,
              -(m.a[0][0]*m.a[1][2] - m.a[0][2]*m.a[1][0])/d,
               (m.a[1][0]*m.a[2][1] - m.a[1][1]*m.a[2][0])/d,
              -(m.a[0][0]*m.a[2][1] - m.a[0][1]*m.a[2][0])/d,
               (m.a[0][0]*m.a[1][1] - m.a[0][1]*m.a[1][0])/d
              );
          return res;

          } else
          {
//            fprintf(stderr, "T3Dmatrix ::operator! : DET= 0");
            throw 777;
          }
    };


    T3DVector operator*(T3DVector v,T3DMatrix m)
    { T3DVector res(
            m.a[2][0]*v.z + m.a[1][0]*v.y + m.a[0][0]*v.x,
            m.a[2][1]*v.z + m.a[1][1]*v.y + m.a[0][1]*v.x,
            m.a[2][2]*v.z + m.a[1][2]*v.y + m.a[0][2]*v.x);
       return res;

    };

    T3DVector operator*(T3DMatrix m,T3DVector v)
    { T3DVector res (
            m.a[0][2]*v.z + m.a[0][1]*v.y + m.a[0][0]*v.x,
            m.a[1][2]*v.z + m.a[1][1]*v.y + m.a[1][0]*v.x,
            m.a[2][2]*v.z + m.a[2][1]*v.y + m.a[2][0]*v.x);
       return res;
    };


   T3DMatrix T3DMatrix::inv()
   { 
       //T3DMatrix res ;
       //res= !(*this);
       //*this =res;
       //return res;
       //register LDouble d=det();
       LDouble d=det();
             if(d != 0) {

             T3DMatrix res(
                      (a[1][1]*a[2][2] - a[1][2]*a[2][1])/d,
                     -(a[0][1]*a[2][2] - a[0][2]*a[2][1])/d,
                      (a[0][1]*a[1][2] - a[0][2]*a[1][1])/d,
                     -(a[1][0]*a[2][2] - a[1][2]*a[2][0])/d,
                      (a[0][0]*a[2][2] - a[0][2]*a[2][0])/d,
                     -(a[0][0]*a[1][2] - a[0][2]*a[1][0])/d,
                      (a[1][0]*a[2][1] - a[1][1]*a[2][0])/d,
                     -(a[0][0]*a[2][1] - a[0][1]*a[2][0])/d,
                      (a[0][0]*a[1][1] - a[0][1]*a[1][0])/d
                     );
                 return res;

                 } else
                 {
       //            fprintf(stderr, "T3Dmatrix ::operator! : DET= 0");
                   throw 777;
                 }
   };

    bool operator==(T3DMatrix m1,T3DMatrix m2)
    {return
     ((m1.a[0][0]==m2.a[0][0])&&(m1.a[0][1]==m2.a[0][1])&&
      (m1.a[0][2]==m2.a[0][2])&&(m1.a[1][0]==m2.a[1][0])&&
      (m1.a[1][1]==m2.a[1][1])&&(m1.a[1][2]==m2.a[1][2])&&
      (m1.a[2][0]==m2.a[2][0])&&(m1.a[2][1]==m2.a[2][1])&&
      (m1.a[2][2]==m2.a[2][2])) ;};

    bool operator!=(T3DMatrix m1,T3DMatrix m2)
    {return!(m1==m2);};
1613 г. = 2024 г.
Re[2]: Не компилируется Qt-проект
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 30.08.22 16:30
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>В связи с этим у меня к вам, уважаемые коллеги, вопрос: не могли бы вы посмотреть код этих файлов 3dvecmat.h и 3dvecmat.cpp и сказать, всё ли правильно в этих файлах?


RF>Файл 3dvecmat.h :



У меня =вопрос: тебе кто-нибудь про циклы рассказывал?
Маньяк Робокряк колесит по городу
Re[2]: Не компилируется Qt-проект
От: AleksandrN Россия  
Дата: 30.08.22 23:19
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>В связи с этим у меня к вам, уважаемые коллеги, вопрос: не могли бы вы посмотреть код этих файлов 3dvecmat.h и 3dvecmat.cpp и сказать, всё ли правильно в этих файлах?


А что, в твоей конторе код-ревью не практикуется?
Re[2]: Не компилируется Qt-проект
От: Chorkov Россия  
Дата: 31.08.22 08:43
Оценка: 4 (1)
Здравствуйте, RussianFellow, Вы писали:

RF>Я убрал библиотеку libpq.lib из моего проекта и я закомментировал весь код, связанный с работой с базами данных (разбираться с этим я буду потом).

RF>После небольших изменений в файлах 3dvecmat.h и 3dvecmat.cpp -- файлы, предназначенные для работы с трехмерными векторами и трехмерными матрицами -- у меня теперь программа компилируется (собирается) и запускается.
RF>В связи с этим у меня к вам, уважаемые коллеги, вопрос: не могли бы вы посмотреть код этих файлов 3dvecmat.h и 3dvecmat.cpp и сказать, всё ли правильно в этих файлах?

1) Много copy/paste
Можно использовать циклы.
Можно использовать initializer-list, вместо 9 аргументов.
Можно использовать инициализацию члена класса в конструкторе, без присваивания каждому элементу матрицы.

2) Пакет из double не выровнен. Это не даст применить SSE инструкции.
Для повышения производительности, лучше иметь 4 double. Пусть даже в последнем значении всегда 0.
Возможно, это сделано для того чтобы использовать хак:
T3DVector& T3DMatrix::operator[](int i) { return *(T3DVector*)a[3*(i-1)];}

Почему бы а, не быть массивом из 3-х T3DVector-ов?

3) Оператор * для пар матрица*матрица, вектор*матрица, матрица*вектор, матрица*число, вектор*число — по правилам линейной алгебры, а для vector*vector, внезапно, векторное произведение.
А произведение vector*vector, по правилом линейной алгебры (dot product) — это оператор %

4) Оператор == для работы с сущностями, основанными на double. Вы хорошо подумали? Хотя бы пометьте как depricated.

5) Тесты отсутствуют совсем, или не приведены для экономии места?
Тесты производительности есть?
Тесть работы в контексте массивов есть? (У многих компиляторов были внезапные баги, попытке применить SSE.)

6) T3DVector::abs — есть, хотя непонятно в какой норме. Хотя бы в начале в комментариях напишите что все в Евклиде. Или так и назовите T3DVector::norm_L2().
T3DMatrix::norm_L2 — вообще отсутствует.

...
Re[2]: Не компилируется Qt-проект
От: Igore Россия  
Дата: 31.08.22 11:41
Оценка: 4 (1)
Здравствуйте, RussianFellow, Вы писали:

RF>Я убрал библиотеку libpq.lib из моего проекта и я закомментировал весь код, связанный с работой с базами данных (разбираться с этим я буду потом).

RF>После небольших изменений в файлах 3dvecmat.h и 3dvecmat.cpp -- файлы, предназначенные для работы с трехмерными векторами и трехмерными матрицами -- у меня теперь программа компилируется (собирается) и запускается.
RF>В связи с этим у меня к вам, уважаемые коллеги, вопрос: не могли бы вы посмотреть код этих файлов 3dvecmat.h и 3dvecmat.cpp и сказать, всё ли правильно в этих файлах?
Какой у тебя С++? Давай будем убирать лишний код. Можно попробовать перейти на готовые библиотеки, например https://doc.qt.io/qt-5/qvector3d.html взять и https://doc.qt.io/qt-5/qgenericmatrix.html#QMatrix3x3-typedef

RF>Файл 3dvecmat.h :


RF>
RF>#ifndef T3DVECMAT_H
RF>#define T3DVECMAT_H
Можно убрать и заменить на
#pragma once
и нижний #endif тоже убрать

RF>#define  smult %
Лучше убрать и испоьзовать явный %
RF>class T3DMatrix;
RF>class T3DVector
RF>{
RF>    friend class T3DMatrix;
RF>public:

RF>    LDouble x,y,z;
Заменяем на 
       LDouble x = 0;
       LDouble y = 0;
       LDouble z = 0;
теперь конструктор можно явно не писать, сгенерируется такой же, ну или написать default
RF>    T3DVector();
       T3DVector() = default;

RF>    T3DVector(const T3DVector& v);
Если есть инициализация в h, то этот конструктор тоже лишний и его можно убрать из .cpp
       T3DVector(const T3DVector& v) = default;       
RF>};

RF>class T3DMatrix
RF>{
RF>public:
RF>    LDouble a[3][3];
       Лучше взять стандартный контейнер и не думать о копировании
       Или можно добавить инициализацию и конструктор не нужно писать
       LDouble a[3][3] = {};
RF>    T3DMatrix();
RF>    T3DMatrix(T3DMatrix& m);
       T3DMatrix() = default;
       T3DMatrix(const T3DMatrix& m) = default;

RF> };
RF>




RF>Файл 3dvecmat.cpp :


RF>
RF>#include "3dvecmat.h"

RF>    LDouble& T3DVector::operator[](int i){return ((LDouble*)&x)[i-1];};
У тебя не LDouble a[3] у тебя 3 отдельные переменные, оно работает, но это ...

RF>    LDouble   T3DVector::abs(){return sqrtl(x*x+y*y+z*z);};
RF>    T3DVector T3DVector::ort(){T3DVector res; long double x1, y1, z1; LDouble s = abs(); x1=x/s;y1=y/s;z1=z/s; res.x = x1; res.y = y1; res.z = z1; return res;};
Оформи что одно действи одна строка, так читать удобней

RF>    T3DMatrix T3DMatrix::transp() // transp self
RF>    { LDouble tmp;

RF>#define swap(X,Y)  tmp=(X),(X)=(Y),(Y)=tmp
есть std::swap
RF>    }  ;

RF>    LDouble& T3DMatrix::operator()(int i,int j) {return a[i-1][j-1];};

RF>
Re[2]: Не компилируется Qt-проект
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 31.08.22 13:42
Оценка: :)
Всем спасибо за ответы!

Файлы 3dvecmat.h и 3dvecmat.cpp писал не я--я там сделал лишь незначительные изменения, чтобы компилятор Qt Creator принял эти файлы.
Но советы, что вы, уважаемые коллеги, мне дали, полезные.
1613 г. = 2024 г.
Re[2]: Не компилируется Qt-проект
От: AleksandrN Россия  
Дата: 31.08.22 23:41
Оценка: +1
Здравствуйте, RussianFellow, Вы писали:

RF>Я убрал библиотеку libpq.lib из моего проекта и я закомментировал весь код, связанный с работой с базами данных (разбираться с этим я буду потом).

RF>После небольших изменений в файлах 3dvecmat.h и 3dvecmat.cpp -- файлы, предназначенные для работы с трехмерными векторами и трехмерными матрицами -- у меня теперь программа компилируется (собирается) и запускается.
RF>В связи с этим у меня к вам, уважаемые коллеги, вопрос: не могли бы вы посмотреть код этих файлов 3dvecmat.h и 3dvecmat.cpp и сказать, всё ли правильно в этих файлах?

RF>Файл 3dvecmat.h :


RF>
RF>    T3DVector& operator= (T3DVector v);
RF>    T3DVector& operator+=(T3DVector v);
RF>    T3DVector& operator-=(T3DVector v);
RF>    T3DVector& operator*=(T3DVector v);
RF>


Лучше
    T3DVector& operator= (const T3DVector &v);
    T3DVector& operator+=(const T3DVector &v);
    T3DVector& operator-=(const T3DVector &v);
    T3DVector& operator*=(const T3DVector &v);


Что бы не вызывать лишний раз конструктор копии при вызове операторов.



RF>Файл 3dvecmat.cpp :


RF>
RF>    LDouble& T3DVector::operator[](int i){return ((LDouble*)&x)[i-1];};
RF>


LDouble это что? typedef для double?
В объявлении класса LDouble x,y,z; и класс попадает под определение POD-класса. Но если в будущем в классе что-то изменится или код будет перенесён на другую архитектуру, то не факт, что x,y,z будут размещены в памяти друг за другом подряд, без пропусков. Ещё нет проверки на то, что i лежит в пределах 0..2.

Лучше заменить на что то вроде
    // Вместо x,y,z.
    std::array<LDouble, 3>    coor;
    // И добавить константы для обращения к координатам x,y,z по индексу.
    enum COOR : size_t
    {
        X = 0,
        Y,
        Z
    };
    // И сделать operator[]
    inline LDouble& T3DVector::operator[](COOR i){ return coor[i]; };
    // И там, где в классе надо обращаться к координатам, писать coor[X], coor[Y], coor[Z]


или на
    LDouble x,y,z;
    
    enum COOR
    {
        X = 0,
        Y,
        Z
    };
    // И сделать operator[]
    LDouble& T3DVector::operator[](int i)
    {
        switch(i)
        {
            case X: return x;
            case Y: return y;
            case Z: return z;
            default: throw std::invalid_argument(std::string("Invalid index ") + std::to_string(i) + " at T3DVector::operator[]");
        }
    };



RF>#define swap(X,Y)  tmp=(X),(X)=(Y),(Y)=tmp
RF>      swap(a[0][1],a[1][0]);
RF>      swap(a[0][2],a[2][0]);
RF>      swap(a[1][2],a[2][1]);
RF>     return *this;
RF>#undef swap

Зачем делать свой swap, если ещё с C++11 есть std::swap?

RF>            throw 777;

Что такое 777? Если какой-нибудь код ошибки, то лучше магические числа заменить константами.

    LDouble a[3][3];
    ...
    T3DVector& T3DMatrix::operator[](int i) { return *(T3DVector*)a[3*(i-1)];}


a объявлена как массив, а потом адрес одного из элементов массива приводится к указателю на класс??? Работает только потому, что это POD-класс, но это потенциальный источник больших проблем. Никогда не надо так делать! И что будет, если i будет равно 0?
Переделать на std::array
    std::array<T3DVector, 3> a;
    ...
    inline T3DVector& T3DMatrix::operator[](size_t i) { return a[i];}
Отредактировано 31.08.2022 23:49 AleksandrN . Предыдущая версия . Еще …
Отредактировано 31.08.2022 23:45 AleksandrN . Предыдущая версия .
Re[3]: Не компилируется Qt-проект
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 01.09.22 17:41
Оценка:
Здравствуйте, AleksandrN, Вы писали:

AN>Зачем делать свой swap, если ещё с C++11 есть std::swap?


Он еще в 98ом был
Маньяк Робокряк колесит по городу
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.