Шустрый

Профиль
Группа: Участник
Сообщений: 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 ¶ms) { 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 - непонятно чем они вызваны..
|