Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2009, 01:07   #1
d9m0n
Пользователь
 
Регистрация: 03.03.2009
Сообщений: 29
Злость проблема с gcc

у меня возникла проблема с программой. есть код (кусок):
PHP код:
for(int k=0;k<el;k++)
{
    if(
k!=j)
    
vects.push_back(newplane[k]-newplane[j]);
}
//cout<<"ab:"<<vects[0]<<endl;
//cout<<"ac:"<<vects[1]<<endl;
cout<<"ap:"<<vec<<endl;
double** matr = new double*[el-1];    
for (
int ii=0ii<el-1ii++)
{
    
matr[ii] = new double[el-1];

здесь была необъяснимая проблема со строкой:
cout<<"ap:"<<vec<<endl;
Если эта строка есть, то выполнялось все нормально, если же её закомментировать, то ход выполнения программы изменялся.
Этот код располагается во вложенном цикле. Если убрать эту строку,то после break из этого цикла выполнение передавалось на начало внешнего цикла, но номер итерации внешнего цикла не увеличивался!!, хотя в заголовке цикла прописано увеличение счетчика после каждой итерации (for(int i=0;i<n;i++)).
Сначала я с этим мирился, но теперь, после внесения некоторых изменений в код, даже с этой строкой код просто зацикливается на одном и том же значении счетчика внешнего цикла.

Может быть, кто сталкивался с подобной проблемой?
Компилятор gcc 4.2.1, система - gentoo 2.6.27
d9m0n вне форума Ответить с цитированием
Старый 04.09.2009, 01:28   #2
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Весь код покажи..
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 04.09.2009, 01:39   #3
d9m0n
Пользователь
 
Регистрация: 03.03.2009
Сообщений: 29
По умолчанию

вот код функции:
PHP код:
vector<pointqhull::extremums()
{
    
std::vector <doubleM(7);
    
M[0]=12.011;//"c"
    
M[1]=51.996;//"cr"
    
M[2]=95.940;//"mo"
    
M[3]=58.933;//"co"
    
M[4]=26.982;//"al"
    
M[5]=58.690;//"ni"
    
M[6]=55.847;//"fe"
    
std::vector <doubleCONCENTRATION(7);
    
CONCENTRATION[0]=2.e-3;   //"c"
    
CONCENTRATION[1]=2.5e-2;  //"cr"
    
CONCENTRATION[2]=1.4e-2;  //"mo"
    
CONCENTRATION[3]=10e-2;   //"co"
    
CONCENTRATION[4]=0.9e-2;  //"al"
    
CONCENTRATION[5]=14e-2;   //"ni"
    
CONCENTRATION[6]=1.-CONCENTRATION[0]-CONCENTRATION[1]-CONCENTRATION[2]-CONCENTRATION[3]-CONCENTRATION[4]-CONCENTRATION[5];//"fe"

    
std::vector <doubleCONCENTRATION_MOLE(7);
    
CONCENTRATION_MOLE=CONCENTRATION_MASStoCONCENTRATION_MOLE(CONCENTRATION,M);//
    
vector<doublecoordpt;
    for(
int i=0;i<el-1;i++) coordpt.push_back(CONCENTRATION_MOLE[i]);
    
point pt(coordpt);
    
vector<pointpts;
    
int algoritm=0;
    if(
el==2)
    {
    for(
int i=0;i<qh.size();i++)
    {
        if(
qh[i][0].function!=qh[i][1].function)
        {
        
pts.clear();
        
pts.push_back(qh[i][0]);
        
pts.push_back(qh[i][1]);
        return 
pts;
        }
    }
    }
    else
    {
    
hyperplane plane;
    
int num;
    
bool second=false;
    for(
int i=0;i<qh.size();i++)
    {
        
num=0;
        for(
int j=0;j<el;j++)
        {
        if(
qh[i][j].function!=qh[i][j+1].function)
        {
            
algoritm=qh[i][j+1].function;
            
num++;
            continue;
        }
        }
        if(
num!=0)
        {
                 
plane=qh[i];
        
double angle=0;
        
double temp;
        
vector<doublenewpoint;
                     
std::vector <doublem(2);
        
vector<pointpts1;
        for(
int j=0;j<el;j++)
        {
            
newpoint.clear();
               
m[0]=1.0;
               
m[1]=algoritm?3.0:1.0;
               
newpoint.push_back(plane[j][0]*m[1]/(m[0]+m[1]-m[1]*(1.0-plane[j][0])));
               for (
1i<el-1i++)
                
newpoint.push_back(plane[j][i]*m[0]/(m[0]+m[1]-m[1]*(1.0-plane[j][0])));
            
pts1.push_back(point(newpoint,plane[j].function));
        }
        
hyperplane newplane(pts1);
        for(
int j=0;j<el;j++)
        {
            
double M;
            
vector<doubleb_mas;
            
vector<pointvects;
            
vector<doublecoef;
            
point vec;
            
vec=(pt-newplane[j]);
            for(
int k=0;k<el;k++)
            {
            if(
k!=j)
                
vects.push_back(newplane[k]-newplane[j]);
            }
            
//cout<<"ab:"<<vects[0]<<endl;
            //cout<<"ac:"<<vects[1]<<endl;
            
cout<<"ap:"<<vec<<endl// все дело в этой строке
                
double** matr = new double*[el-1];
                for (
int ii=0ii<el-1ii++)
                {
                
matr[ii] = new double[el-1];
                }
            for(
int j=0;j<el-1;j++)
            for(
int k=0;k<el-1;k++)
            {
                
double elem=0;
                for(
int u=0;u<el-1;u++)
                
elem+=vects[j][u]*vects[k][u];
                
matr[j][k]=elem;
            }
            
M=hyperplane::det(matr,el-1);
            for (
int j=0j<el-1j++) 
                
delete[] matr[j];
                
delete[] matr;
            for (
int j=0j<el-1j++)
            {
            
double elem=0;
            for(
int k=0;k<el-1;k++)
                
elem+=vects[j][k]*vec[k];
            
b_mas.push_back(elem);
            }
            for(
int j=0;j<el-1;j++)
            
coef.push_back(b_mas[j]/M);
            
double coef_sum=0;
            
bool lower=false;
            for(
int j=0;j<el-1;j++)
            {
            if(
coef[j]<=0.0)
            {
                
lower=true;
                break;
            }
            
coef_sum+=coef[j];
            }
            
cout<<"test u and v"<<endl;
            if(
lower||(coef_sum>1))break;
            
cout<<"this is extremum place"<<endl;
            
pts.clear();
            
vector<pointline;
            for(
int k=0;k<el;k++)
            {
            
vector<doubletpt;
            if(
newplane[k].function!=algoritm)
            {
                for(
int u=0;u<el-1;u++)
                
tpt.push_back(newplane[k][u]);
                
pts.push_back(tpt);
            }
            else
            {
                
line.clear();
                for(
int u=0;u<el-1;u++)
                
tpt.push_back(newplane[k][u]);
                
line.push_back(tpt);
            }
            }
            
line.push_back(pt);
            if(
el==3// dlya 3d
            
{
            
vector<doublecoeffs1=hyperplane(pts).getCoeffs();
            
vector<doublecoeffs2=hyperplane(line).getCoeffs();
            
double t=0;
            for(
int k=0;k<el-1;k++)
                
t+=coeffs1[k]*line[0][k];
            
t+=coeffs1[el-1];
            
point vect=line[0]-line[1];
            
t=t/(coeffs1[0]*vect[0]+coeffs1[1]*vect[1]+coeffs1[2]);
            
vector<doublenewpt1;
            for(
int k=0;k<el-1;k++)
                
newpt1.push_back(line[0][k]+vect[k]*t);
            
vector<doublenewpt;
            
pts.clear();
            
pts.push_back(point(newpt1));
            
pts.push_back(line[0]);
            return 
pts;
            }
        }
        }    
    }
    }
    return 
pts;

d9m0n вне форума Ответить с цитированием
Старый 04.09.2009, 01:48   #4
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Цитата:
cout<<"ap:"<<vec<<endl; // все дело в этой строке
Значит проблема в этом операторе
Код:
std::ostream &operator << (std::ostream &lhs, const point &rhs){
что здесь?
}
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 04.09.2009, 02:00   #5
d9m0n
Пользователь
 
Регистрация: 03.03.2009
Сообщений: 29
По умолчанию

я думаю, что с оператором все нормально, я его проверил, оттестировал. Проблем с использованием не возникало. вот его код:
PHP код:
ostreamoperator<<(std::ostream &os, const point pt)
{
    
os<<"(";
    for (
int i=0;i<pt.dimensions();i++)// пока меньше размерности пространства
    
{
        
os<<(double)pt[i]; // вывод координаты
        
if (i!=pt.dimensions()-1)// вывод ";" между координатами
            
os<<";";
    }
    
os<<"("<<pt.function<<")";
    
os<<")";
    return 
os;

operator[] в классе point переопределен. Возвращает значение из массива внутри класса по индексу.
d9m0n вне форума Ответить с цитированием
Старый 04.09.2009, 02:13   #6
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Здесь точно нехватает &
Код:
ostream& operator<<(std::ostream &os, const point &pt)
Если в point нету оператора копирования (и конструктора копирования) то проблема может быть из за этого..
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 04.09.2009, 02:30   #7
d9m0n
Пользователь
 
Регистрация: 03.03.2009
Сообщений: 29
По умолчанию

проверил, не помогает.
Как в этом может быть проблема? оператор вывода ничего не меняет в объекте. И не может поменять, т.е. объект передается по значению.
В классе нет указателей и виртуальных функций, значит конструктор копирования по умолчанию вполне подходит.
Раньше у меня была проблема только при отсутствии строки вывода значения, сейчас же - и с ней те же самые проблемы. Отладчик как то не очень корректно переходит при выходе из цикла по break. Сначала показывает выполнение следующего за break оператора, а затем переходит к началу внешнего цикла. Я думаю, что проблема с компилятором. Попробую обновить его.
d9m0n вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопрос по GCC XAOC-forever Qt и кроссплатформенное программирование С/С++ 7 07.04.2009 19:17
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37
inline asm в gcc drRobert Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 23.08.2008 10:26
Какой тип с/c++ больше всего напоминает компилятор gcc и g++ Который используется в UNIX-подобных система Иллидан Свободное общение 4 28.03.2008 02:29