Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перенос программы из MS C++ в GNU C++ 
:(
    Опции темы
evilguard
Дата 26.2.2008, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 19.11.2006

Репутация: нет
Всего: нет



Пишу программу на C++ с использованием QT для интерфейса. Начал делать еще под виндой в MSVC 2005 c интеграцией QT, теперь переношу этот проект под линукс - спасибо кроссплатформенности. Взникли ошибки при компиляции. Естественно до этого код вполне нормально работал.
ошибок много, я попрошу помощи хотя бы по нескольким, из одной функции:
Код

#include "mgrid.h"

double MGrid::calc(double src, double a, int approx, double n)
{
    double res;
    switch (approx)
    {
    case 1:
        res=a*src;
        break;
    case 2:
        res=a*pow(src,n);
        break;
    }
    return res;
}
double MGrid::distance(double x1, double y1, double x2, double y2)
{
    return sqrt(pow((x2-x1),2)+pow((y2-y1),2));
}

MGrid::MGrid (QString fileName, bool invert)
{
    objectName = getFileName(fileName);
    type = MObject::Grid;
    QFile file(fileName);
    file.open(QIODevice::ReadOnly);
    QDataStream in(&file);
    in.setByteOrder(QDataStream::LittleEndian);

    qint32 header, nX, nY;
    in >> header;
    in.skipRawData(4*4);
    in >> nY >> nX;
    numX=nX;
    numY=nY;
    in >> minX >> minY >> xSize >> ySize >> minZ >> maxZ;

    int kInv;
    if (invert)
    {
        kInv=-1;
        swap(minZ, maxZ);
        minZ=-minZ;
        maxZ=-maxZ;
    }
    else
        kInv=1;

    maxX = minX+(numX-1)*xSize;
    maxY = minY+(numY-1)*ySize;
    defineCoo();

    in.skipRawData(24);
    grid = new double[numX*numY];
    for (int i=0; i<numX*numY; i++)
    {
        in >> grid[i];
        grid[i]=kInv*grid[i];
    }
    vec3Ddefined = false;
}

MGrid::MGrid (GridParams& params)
{
    objectName = getFileName( params.objectName );
    type = MObject::Grid;
    numX = params.numX;
    numY = params.numY;
    minX = params.minX;
    minY = params.minY;
    xSize = params.xSize;
    ySize = params.ySize;
    maxX = minX+(numX-1)*xSize;
    maxY = minY+(numY-1)*ySize;
    grid = new double[numX*numY];
    vec3Ddefined = false;
}

MGrid::~MGrid()
{
    delete[] grid;
    if (vec3Ddefined)
    {
        delete[] vertices;
        delete[] colors;
    }
}

double MGrid::getX(int i) const
{
    return minX+i*xSize;
}

double MGrid::getY(int j) const
{
    return minY+j*ySize;
}

double MGrid::getZ(int i, int j) const
{
    return grid[j*numX+i];
}

//Вариант без поиска - all data
void MGrid::calculate(vector<MPoint> &data, int approx, double n)
{
    double co=25;
    int    lags=14;
    int num_close_wells=10;
    int i,j,k;

    //Определение экспериментальной вариограммы
    int size_s;
    for (j=1, size_s=0; j<data.size(); j++)
    size_s+=j;
    struct tab1
    {
        double dist, semi_v;
        tab1 () { dist = semi_v = 0; }
    };
    vector <tab1> table1(size_s);

    double maxD=0;
    for (j=0,k=0; j<data.size(); j++)
    {
        for(i=j+1; i<data.size(); i++, k++)
        {
            table1[k].dist=distance(data[i].x, data[i].y, data[j].x, data[j].y);
            table1[k].semi_v=0.5*pow((data[j].z-data[i].z),2);
            if (maxD<table1[k].dist)
                maxD=table1[k].dist;
        }
    }

    double lag=maxD/(lags-1);    //определяем величину лага
    struct tab2
    {
        double semi_v;
        int n;
        tab2 () { semi_v = 0.f; n = 0; }
    };
    vector <tab2> table2(lags);    //таблица дисперсий по лагам

    for(i=0; i<table1.size(); i++)
    {
        table2[floor(table1[i].dist/lag)].n++;
        table2[floor(table1[i].dist/lag)].semi_v+=table1[i].semi_v;
    }
    for(i=0; i<table2.size(); i++)
    {
        if (table2[i].n!=0)
            table2[i].semi_v=table2[i].semi_v/table2[i].n;
    }

    //Определение параметров вариограммы МНК
    double a;
    if (approx==1)
    {
            double
                S_yx=0,
                S_x2=0;
            for(i=0; i<table2.size(); i++)
                if (table2[i].n!=0)
                {
                    S_yx+=(i+lag/2)*table2[i].semi_v;
                    S_x2+=(i+lag/2)*(i+lag/2);
                }
            a=S_yx/S_x2;
    }
    else if(approx==2)
    {
            double
                S_yxn=0,
                S_x2n=0;
            for(i=0; i<table2.size(); i++)
                if (table2[i].n!=0)
                {
                    S_yxn+=pow((i+lag/2),n)*table2[i].semi_v;
                    S_x2n+=pow((i+lag/2),2*n);
                }
            a=S_yxn/S_x2n;
    }

    //Расчет сетки
    int size=data.size()+1; //размер с учетом добавления строки и столбца с единицами
    double **matrix=new double*[size];
    for (i=0;i<size;i++)
        matrix[i]=new double[2*size];
    double **G=new double*[size];
    for (i=0;i<size;i++)
        G[i]=new double[2*size];

    //Заполнение элементами матрицы
    for (i=0; i<size-1; i++)
        for (j=0; j<size-1; j++)
            G[i][j]=calc(distance(data[i].x, data[i].y, data[j].x, data[j].y), a, approx, n);
    for (i=0; i<size-1; i++)
        G[size-1][i]=1;
    for (i=0; i<size-1; i++)
        G[i][size-1]=1;
    G[size-1][size-1]=0;

    //Добавляем единичную матрицу
    for (i=0;i<size;i++)
        for (j=0;j<size;j++)
        {
            if (i==j) G[i][j+size]=1;
            else G[i][j+size]=0;
        }

    //Переставляем строки
    for (i=0; i<size; i++)
        if (i==size-1)
            for (j=0; j<2*size; j++)
                matrix[0][j]=G[size-1][j];
        else
            for (j=0; j<2*size; j++)
                matrix[i+1][j]=G[i][j];
    // Вычисления
    double coef;
    for (i=0;i<size-1;i++)
        for (j=i+1;j<size;j++)
        {
            coef=matrix[j][i]/matrix[i][i];
            for (k=i+1;k<2*size;k++) matrix[j][k]=matrix[j][k]-coef*matrix[i][k];
        }
    for (i=size-1;i>0;i--)
        for (j=i-1;j>=0;j--)
        {
            coef=matrix[j][i]/matrix[i][i];
            for (k=size;k<2*size;k++)
                matrix[j][k]=matrix[j][k]-coef*matrix[i][k];
        }
    for (i=0;i<size;i++)
        if (matrix[i][i]!=1)
            for (j=size;j<2*size;j++) matrix[i][j]/=matrix[i][i];

    //Перенос в другой массив
    for (i=0; i<size; i++)
        for (j=0; j<size; j++)
            G[i][j]=matrix[i][j+size];

    minZ = maxZ = data[0].z;
    int currentProcent = 0;

    double *vec=new double[size];
    double *vesa=new double[size];
    double x = 0,
           y = 0,
           z = 0;
    for (int i2=0; i2<numX; i2++)
    {
        x = getX(i2);
        for (int j2=0; j2<numY; j2++)
        {
            y = getY(j2);
            z = 0;

            //Вектор точки
            for (i=0; i<size-1; i++)
                vec[i]=calc(distance(data[i].x, data[i].y, x, y), a, approx, n);
            vec[size-1]=1;

            //Вектор весов
            for (i=0; i<size; i++)
                vesa[i]=0;
            for (i=0; i<size; i++)
                for (j=0; j<size; j++)
                    vesa[i]+=vec[j]*G[j][i];

            //z точки
            for (i=0; i<size-1; i++)
                z+=vesa[i]*data[i].z;

            MinMax(z, minZ, maxZ);
            grid[j2*numX+i2]=z;

            if (((i2*numY+j2)*100/((numX-1)*(numY-1)))>currentProcent)
                emit progressBarChanged(++currentProcent);
        }
    }

    delete[] vec;
    delete[] vesa;

    //Трансформация координат
    defineCoo();

    for (i=0;i<size;i++)
        delete matrix[i];
    delete[] matrix;
    for (i=0;i<size;i++)
        delete G[i];
    delete[] G;}

void MGrid::ReDraw(int zScale)
{
    if (vec3Ddefined)
    {
        delete[] vertices;
        delete[] colors;
        delete[] indices;
    }
    vertices = new GLfloat [numX*numY*3];
    colors = new GLfloat [numX*numY*3];
    for (UINT j=0; j<numY; j++)
        for (UINT i=0; i<numX; i++)
        {
            vertices[j*numX*3+i*3+0] = (float) getX(i);
            vertices[j*numX*3+i*3+1] = (float) getY(j);
            vertices[j*numX*3+i*3+2] = (float) getZ(i, j)*zScale;
        }
    for (UINT j=0; j<numY; j++)
        for (UINT i=0; i<numX; i++)
        {
            MRGB color(getZ(i, j), minZ, maxZ);
            colors[j*numX*3+i*3+0] = color.r;
            colors[j*numX*3+i*3+1] = color.g;
            colors[j*numX*3+i*3+2] = color.b;
        }
    indices = new GLuint [(numX-1)*(numY-1)*4];
    numOfQuads = 0;
    for (UINT j=0; j<numY-1; j++)
        for (UINT i=0; i<numX-1; i++)
            if (!(fabs(getZ(i, j))==undef || fabs(getZ(i, j+1))==undef ||
                fabs(getZ(i+1, j+1))==undef || fabs(getZ(i+1, j))==undef))
            {
                indices[numOfQuads*4+0] = j*numX+i;
                indices[numOfQuads*4+1] = (j+1)*numX+i;
                indices[numOfQuads*4+2] = (j+1)*numX+(i+1);
                indices[numOfQuads*4+3] = j*numX+(i+1);
                numOfQuads++;
            }
    vec3Ddefined = true;
    Draw();
}

void MGrid::Draw()
{
    glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);
    glColorPointer(3, GL_FLOAT, 0, colors);
    glVertexPointer(3, GL_FLOAT, 0, vertices);
    glDrawElements(GL_QUADS, numOfQuads*4, GL_UNSIGNED_INT, indices);
}

QDataStream &operator>>(QDataStream &in, MGrid &grid)
{
    qint32 header, numX, numY;
    double minX, minY, xSize, ySize, minZ, maxZ;
    in >> header;
    in.skipRawData(4*4);
    in >> numY >> numX >> minX >> minY >> xSize >> ySize >> minZ >> maxZ;
    in.skipRawData(24);
    double *grd;
    grd = new double[numX*numY];
    for (int i=0; i<numX*numY; i++)
        in >> grd[0];
//    grid = MGrid(numX, numY, minX, minY, xSize, ySize, minZ, maxZ, grd);

    return in;
}

struct YrLine3D
{
    double k1, b1, k2, b2;
};

void Line3Dparams(MPoint &p1, MPoint &p2, YrLine3D &params)
{
    params.k1 = (p2.y-p1.y)/(p2.x-p1.x);
    params.b1 = p1.y-params.k1*p1.x;
    params.k2 = (p2.z-p1.z)/(p2.x-p1.x);
    params.b2 = p1.z-params.k2*p1.x;
}

void getZfromTriangle(MPoint &p1, MPoint &p2, MPoint &p3, MPoint &p0)
{
    double k1 = (p1.y-p0.y)/(p1.x-p0.x);
    double b1 = p1.y-k1*p1.x;
    double k2 = (p3.y-p2.y)/(p3.x-p2.x);
    double b2 = p3.y-k2*p3.x;
    MPoint p_;
    p_.x = (b2-b1)/(k1-k2);
    p_.y = k1*p_.x+b1;
    YrLine3D params;
    Line3Dparams(p2, p3, params);
    p_.z = params.k2*p_.x+params.b2;
    Line3Dparams(p_, p1, params);
    p0.z = params.k2*p0.x+params.b2;
}

double MGrid::operator ()(double _x, double _y) const
{
    assert((_x>minX)&&(_x<maxX)&&(_y>minY)&&(_y<maxX));
    int i = floor((_x-minX)/xSize);
    int j = floor((_y-minY)/ySize);
    double dx = _x - (minX+i*xSize);
    double dy = _y - (minY+j*ySize);
    if (dx==0)
        return getZ(i,j)+(getZ(i,j+1)-getZ(i,j))/(getY(j+1)-getY(j))*dy;
    if (dy==0)
        return getZ(i,j)+(getZ(i+1,j)-getZ(i,j))/(getX(i+1)-getX(i))*dx;
    MPoint p1(getX(i), getY(j), getZ(i, j));
    MPoint p2(getX(i), getY(j+1), getZ(i, j+1));
    MPoint p3(getX(i+1), getY(j), getZ(i+1, j));
    MPoint p4(getX(i+1), getY(j+1), getZ(i+1, j+1));
    MPoint p0(_x, _y, 0);
    if (dy<numY-numY/numX*dx)
        getZfromTriangle(p1, p2, p3, p0);
    else
        getZfromTriangle(p4, p2, p3, p0);
    return p0.z;
}

Ну и фрагмент вывода консоли с ошибками:

Код

mgrid.cpp: In member function ‘void MGrid::calculate(std::vector<MPoint, std::allocator<MPoint> >&, int, double)’:
mgrid.cpp:115: warning: comparison between signed and unsigned integer expressions
mgrid.cpp:122: error: ‘MGrid::calculate(std::vector<MPoint, std::allocator<MPoint> >&, int, double)::tab1’ uses local type ‘MGrid::calculate(std::vector<MPoint, std::allocator<MPoint> >&, int, double)::tab1’
mgrid.cpp:122: error:   trying to instantiate ‘template<class _Alloc> class std::allocator’
mgrid.cpp:122: error: template argument 2 is invalid
mgrid.cpp:122: error: invalid type in declaration before ‘(’ token
mgrid.cpp:125: warning: comparison between signed and unsigned integer expressions
mgrid.cpp:127: warning: comparison between signed and unsigned integer expressions
mgrid.cpp:129: error: invalid types ‘int[int]’ for array subscript
mgrid.cpp:130: error: invalid types ‘int[int]’ for array subscript
mgrid.cpp:131: error: invalid types ‘int[int]’ for array subscript
mgrid.cpp:132: error: invalid types ‘int[int]’ for array subscript
mgrid.cpp:143: error: ‘MGrid::calculate(std::vector<MPoint, std::allocator<MPoint> >&, int, double)::tab2’ uses local type ‘MGrid::calculate(std::vector<MPoint, std::allocator<MPoint> >&, int, double)::tab2’
mgrid.cpp:143: error:   trying to instantiate ‘template<class _Alloc> class std::allocator’
mgrid.cpp:143: error: template argument 2 is invalid
mgrid.cpp:143: error: invalid type in declaration before ‘(’ token
mgrid.cpp:145: error: request for member ‘size’ in ‘table1’, which is of non-class type ‘int’
mgrid.cpp:147: error: invalid types ‘int[int]’ for array subscript
mgrid.cpp:148: error: invalid types ‘int[int]’ for array subscript
mgrid.cpp:148: error: invalid types ‘int[int]’ for array subscript
mgrid.cpp:150: error: request for member ‘size’ in ‘table2’, which is of non-class type ‘int’
mgrid.cpp:152: error: invalid types ‘int[int]’ for array subscript
mgrid.cpp:153: error: invalid types ‘int[int]’ for array subscript
mgrid.cpp:153: error: invalid types ‘int[int]’ for array subscript
mgrid.cpp:153: error: invalid types ‘int[int]’ for array subscript
mgrid.cpp:163: error: request for member ‘size’ in ‘table2’, which is of non-class type ‘int’
mgrid.cpp:164: error: invalid types ‘int[int]’ for array subscript
mgrid.cpp:166: error: invalid types ‘int[int]’ for array subscript
mgrid.cpp:176: error: request for member ‘size’ in ‘table2’, which is of non-class type ‘int’
mgrid.cpp:177: error: invalid types ‘int[int]’ for array subscript
mgrid.cpp:179: error: invalid types ‘int[int]’ for array subscript
mgrid.cpp:108: warning: unused variable ‘co’
mgrid.cpp:110: warning: unused variable ‘num_close_wells’

Собственно все комментировать не прошу))Файл выложил целиком для удобства чтения и поиска строк. Мне бы только по ошибке в строчках 122 и 143 -  непонятно чем они вызваны..
PM MAIL   Вверх
JackYF
Дата 26.2.2008, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



Цитата(evilguard @  26.2.2008,  14:50 Найти цитируемый пост)
mgrid.cpp:143: error: ‘MGrid::calculate(std::vector<MPoint, std::allocator<MPoint> >&, int, double)::tab2’ uses local type ‘MGrid::calculate(std::vector<MPoint, std::allocator<MPoint> >&, int, double)::tab2’

ЕМНИП, локальные типы не разрешается использовать в STL-контейнерах. Выноси за пределы функции.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
evilguard
Дата 26.2.2008, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 19.11.2006

Репутация: нет
Всего: нет



Спасибо большое за ответ, я как раз минут за 10 до вашего поста методом тыка догадался вынести описание структур за пределы тела функции. Это получается особенность компилятора GNU C++?
PM MAIL   Вверх
bsa
Дата 26.2.2008, 23:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



evilguard, нет. это, я так понимаю, особенность стандарта С++ и проблемы с его интерпретаций МС. Хотя, я бы не отказался от возможности использовать внутренние типы в качестве параметров шаблонов, будь она стандартна...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.