Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Чтение из файла


Автор: lisushka 1.6.2007, 13:03
Есть текстовый документ "1.txt" . В нем  числа - значения переменных. То есть, например, первое значение - количество переменных,
второе - количество ограничений. Три(первое, второе и предпоследнее) значения типа int, остальные - double. Вот, например, его содержание :

5
10
-0.01
0.01
-1000
1000
10
20
0.005

 В приложении на С++ я считываю эти значения(в нужные мне переменные считываются). А вот когда я их, получившиеся переменные, использую для вызова 
функции Gen_task(), они( типа double) не срабатывают. Причем, если передавать сразу значениями все работает(занесено в комментарии).В чем тут может быть дело и как это исправить?
Часть кода на С++:

Код

void main(void)
{
    int n; //êîëè÷åñòâî ïåðåìåííûõ
    int m; //êîëè÷åñòâî îãðàíè÷åíèé
    double *A,*b,*c,*x0,*x_dop,*x_opt;
    double a,bb,xll,xhh, an,bn;
    double ro2,eps,del,eta;
    int kol,kkol;//êîëè÷åñòâî çàäà÷ â ñåðèè
    int j;
    int kRes=0;//êîëè÷åñòâî ðåøåííûõ çàäà÷
    int kNeResO;//îáùåå êîëè÷åñòâî íåðåøåííûõ çàäà÷
    int maxf1,minf1,srednf1,maxg1,ming1,sredng1,
        maxf2,minf2,srednf2,maxg2,ming2,sredng2,
        maxf3,minf3,srednf3,maxg3,ming3,sredng3;
    //n=20; m=40;
    ifstream in;
    in.open("c:\\1.txt");
    in>>n;
    printf("n=%d\n",n);
    if(n<1)
    {
        cout<<"Error!Enter again!\n";
        return;
    }
    in>>m;
    printf("m=%d\n",m);
    if(m<1)
    {
        cout<<"Error!Enter again!\n";
        return;
    }
    in>>a;
    an=double(a);
    printf("an=%lf\n",an);
    if(an=0.0)
    {
        cout<<"Error!Enter again!\n";
        return;
    }
    in>>bb;
    bn=double(bb);
    printf("bn=%lf\n",bn);
    if(bn=0.0)
    {
        cout<<"Error!Enter again!\n";
        return;
    }
    in>>xll;
    printf("xll=%lf\n",xll);
    if(xll=0.0)
    {
        cout<<"Error!Enter again!\n";
        return;
    }
    in>>xhh;
    printf("xhh=%lf\n",xhh);

    if(xhh=0.0)
    {
        cout<<"Error!Enter again!\n";
        return;
    }
    in>>eps;
    printf("eps=%lf\n",eps);
    if(eps=0.0)
    {
        cout<<"Error!Enter again!\n";
        return;
    }
    in>>kkol;
    printf("kkol=%d\n",kkol);
    in>>eta;
    printf("eta=%lf\n",eta);
    in.close();



    A=new double[n*n*(m+1)];
    b=new double[n*(m+1)];
    c=new double[m+1];
    x_dop=new double[n];
    x0=new double[n];
    x_opt=new double[n];

    ofstream out;
    out.open("test.txt");;//ñîçäàíèå ôàéëà äëÿ âûâîäà
    if(!out)
    {
        cout<<"File is not possible open\n";
        return;
    }
    out<<"êîëè÷åñòâî ïåðåìåííûõ="<<n<<"\n";
    out<<"êîëè÷åñòâî îãðàíè÷åíèé="<<m<<"\n";

    del=1e-6;
//    eta=0.005;
    out<<"del="<<del<<" eta="<<eta<<"\n";
//    eps=1.0;
    out<<"eps="<<eps<<"\n";


    kNeResO=0;
    for(kol=0;kol<kkol;kol++)
    {
        printf("kol=%d\n",kol);
        out<<"Íîìåð çàäà÷è="<<kol<<"\n";
//        Gen_task(n,m,-0.01,0.01,-1000.0,1000.0,eps,A,b,c,x_dop);

        Gen_task(n,m,an,bn,xll,xhh,eps,A,b,c,x_dop);






Автор: DigitSphinx 1.6.2007, 13:23
Код

double a, an, bb, bn;
...................
in >> a;
an = double(a);
...................
in>>bb;
bn=double(bb);
...................

 smile 
А зачем ??
У тебя в переменные считываются значения ? 
Если да то может проблема в функции Gen_task() .
Если нет попробуй считывать в char;
Код

char Buff[1024];
in >> Buff;
an = atof(Buff);



Автор: lisushka 1.6.2007, 13:55
Нет, не получается так тоже. Отвечаю на вопрос "Зачем?": может несовпадение типов. 
С функцией все нормально, потому что, если напрямую задавать значения, она работает. Это проверялось и не раз. Но я сразу при ее вызове вручную значения задавала. Один из таких вызовов закомментирован.
Код

void Gen_task(int n,      int m,  double a1,  double b1,double x_l,double x_h,double eps_h,double*A,double*b, double*c,  double* x_dop)



Автор: DigitSphinx 1.6.2007, 14:14
Долго думал в чем же дело ?!?!?!
 smile  
Код

.................
if(an=0.0)
.................
if(bn=0.0)
.................
if(xll=0.0)
.................
if(xhh=0.0)
.................
if(eps=0.0)
.................
if(eps=0.0)
.................

Ты их сама обнуляешь !
Надо “==” вместо “=”
И еще лучше 
Код

....
if(0.0 == an)
....

тогда эта ошибка не появится ! а если опечатаешься "=" вместо "==" то  компилятор начнет ругаться
Код

error C2106: '=' : left operand must be l-value 


Автор: nickless 1.6.2007, 16:54
Кстати, проверять переменные типа float и double на равенство не рекомендуется, они могут быть "почти" равны или нужное число может вообще не иметь точного представления в двоичном виде (0.1 например). Лучше писать так:
Код
const double eps = 1.0e-10; // или сколько надо
if ((0.0 + eps > f) && (f > 0.0 - eps)) {
    // код
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)