Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: глюк с FloatToStr, FloatToStrF  (Прочитано 37081 раз)
0 Пользователей и 1 Гость смотрят эту тему.
eugrita
Помогающий

ru
Offline Offline

« : 06-10-2010 06:55 » 

непонятный глюк в
AnsiString s=FloatToStrF(-2,ffNumber,6,3);
возможно связан не с  самим FloatToStr
а динамическим размещением/освобождением массивов
на старте проги AnsiString s=FloatToStrF(-2,ffNumber,6,3); проходит великолепно
после выполнения 1 или неск раз функций
TForm1::crt()
{ a=new float (N+1); b=new float (N+1);  c=new float (N+1); F=new float (N+1);}

TForm1::del()
{ delete []a;   delete []b; delete []c;  delete []F;}
тот же оператор в другом месте валит прогу. Почему?
« Последнее редактирование: 06-10-2010 06:59 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 06-10-2010 07:01 » 

скорее всего дважды вызываешь процедуру удаления. Невалидные указатели надо обнулять!

Код:
TForm1::del()
{
   delete []a; a=0;
   delete []b; b=0;
   delete []c; c=0;
  delete []F; F=0;
}

Записан

eugrita
Помогающий

ru
Offline Offline

« Ответ #2 : 06-10-2010 07:04 » 

не помогло
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 06-10-2010 07:14 » 

тогда отладчик в руки - и вперёд Улыбаюсь

Кстати, скобки надо квадратные, у тебя ж массивы
Код:
TForm1::crt()
{
 a=new float [N+1];
 b=new float [N+1];
  c=new float [N+1];
 F=new float [N+1];
}

а ещё лучше - примени std::vector

Записан

eugrita
Помогающий

ru
Offline Offline

« Ответ #4 : 06-10-2010 07:19 » 

хрен. Вообще применил статические массивы [100] -не помогает.
Ошибка непонятно в чем
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 06-10-2010 07:23 » 

значит, выход за границы массива. Где отладчик останавливается ?

Сделай, наконец, проверку всех индексов во время всех обращений
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 06-10-2010 11:18 » 

Судя по тому, что в первом посте динамически создаются одиночные значения, а для удаления применяется оператор удаления массива, то наверняка это не единственная ошибка в программе. Потому пока считаю, что вина FloatToStrF не доказана.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
eugrita
Помогающий

ru
Offline Offline

« Ответ #7 : 06-10-2010 14:41 » 

вот код программы (неиспольз функц выкинул.
валится в функции Output на 1 операторе s=FloatToStrF(-2,ffNumber,6,3);
Что может быть причиной ошибки??
Код:
TForm1 *Form1;
int ia;//режим расчета ia=0  - по вар, ia=1 - по уч-кам
int N; //кол точек разбиения
float h;//шаг
float l;//длина
int nu;//кол уч-ков ступенч стержня
int S,G;//N группы, N студ
float C;
//float *a, *b,*c, *F; //
float a[100], b[100],c[100], F[100]; //
float * L, *I,*ML, *MR;//L -длина уч-ков, I - мом инерции, ML,MR - моменты нагрузки на левом и прав концах
AnsiString s;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{}

void __fastcall TForm1::FormActivate(TObject *Sender)
{
  N=cse->Value;  sgY->ColCount=N+1;
  //crt();
  sgY->Cells[0][0]="Yi"; sy->Cells[0][0]="L=";  sy->Cells[0][1]="I=";
  sy->Cells[0][2]="Mлев="; sy->Cells[0][3]="Mпр=";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cseChange(TObject *Sender)
{
  N=cse->Value;  sgY->ColCount=N+1;
  sgM->RowCount=N; sgM->ColCount=N;
 // del(); crt();
  s=FloatToStrF(-2,ffNumber,6,3);
}

void __fastcall TForm1::csyChange(TObject *Sender)
{//изм-е кол-ва уч-ков
 nu=csy->Value; sy->ColCount=nu+1;
 delY(); crtY();
}
TForm1::crtY()
{ L=new float [nu]; I=new float [nu];  ML=new float [nu]; MR=new float [nu];}
TForm1::delY()
{ delete []L;   delete []I; delete []ML;  delete []MR;}


void __fastcall TForm1::cssChange(TObject *Sender)
{//
  S=css->Value; C=0.04*(G+S);
  lc->Caption=FloatToStrF(C,ffNumber,5,2);
}
void __fastcall TForm1::csgChange(TObject *Sender)
{
 G=csg->Value;
 C=0.04*(G+S);
 lc->Caption=FloatToStrF(C,ffNumber,5,2);
}

void __fastcall TForm1::bOKClick(TObject *Sender)
{if (ia==0) l=1;
 else  if (inp()==-1) return;
 h=l/N;
    sgM->Cells[0][0]=1;
//генерирование векторов прогонки
  for (int i=0;i<N;i++)
  {a[i]=1; c[i]=1; }
   a[0]=0;  c[N-1]=0;
  if (ia==0) BFvar();
  else BFuch();
  Output();
}

float TForm1::BFvar()
{//
  float p,f,x;
  for (int i=0;i<N;i++)
 {
   x=i*h;p=-S/(l*l+4*x*(l-x));
  // b[i]=-2+h*h*p;                 //закомментирован чтоб не было подохрения в ошибке
  // f=-C*(2-p*x*(l-x)); F[i]=h*h*f;//закомментирован чтоб не было подохрения в ошибке
 }
}
TForm1::BFuch()
{ //генерирование диаг вектора b и прав частей F для задания по уч-кам

}
TForm1::Output()
{ // вывод в интервейс матрицы прогонки
 [b]s=FloatToStrF(-2,ffNumber,6,3); //оператор валит программу[/b]
 for (int i=0;i<N;i++) {
  sgM->Cells[i][i]=b[i];//FloatToStrF(b[i],ffNumber,6,3);
  if (i<N-1) sgM->Cells[i][i+1]="-1";
  if (i<N-1)  sgM->Cells[i+1][i]="-1";
                       }
}
« Последнее редактирование: 06-10-2010 15:35 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 06-10-2010 15:40 » 

ffNumber - это что, и где определено?
Записан

eugrita
Помогающий

ru
Offline Offline

« Ответ #9 : 06-10-2010 17:48 » 

ffNumber - это константа задающая фиксированный формат. С ней-то нет проблем
Еще раз:  написал более 50 программ думаю под C++ Builder но такого маразма с FloatToStr никогда не было
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 06-10-2010 18:22 » 

Если это 51-ая, то предыдущие 50 в зачет не пойдут! Во-первых, выбирай более длинные и понятные имена переменных. Во-вторых, форматируй код. Тогда и самому легче будет понимать свой код, и тому, кто его будет читать.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 06-10-2010 18:26 » 

eugrita, ну, на твой код без содрогания тоже не взглянешь...

комментарии тоже шедевральны )) //изм-е кол-ва уч-ков

s=FloatToStrF(-2,ffNumber,6,3); //оператор валит программу
А проблема остаётся в порче s

скрин ошибки можешь показать ?
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 06-10-2010 18:30 » 

Леш, думаю, что он где-то неаккуратно работал с массивами, вышел за пределы и испортил соседнюю память. Возможно, как раз ту, где хранится AnsiString s.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 06-10-2010 18:32 » 

Я об этом подумал, но массивы динамические. В этом "проблема" - сложно за них вылезти так, чтоб портить s
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 06-10-2010 18:37 » 

Цитата
Код:
float a[100], b[100],c[100], F[100]; //
float * L, *I,*ML, *MR;//L -длина уч-ков, I - мом инерции, ML,MR - моменты нагрузки на левом и прав концах
AnsiString s;

Никакие они не динамические... Улыбаюсь
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #15 : 06-10-2010 18:40 » 

так это он сейчас их застатил, а до этого они были динамические )

//float *a, *b,*c, *F; //
Записан

eugrita
Помогающий

ru
Offline Offline

« Ответ #16 : 06-10-2010 18:46 » new



« Последнее редактирование: 06-10-2010 18:48 от eugrita » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 06-10-2010 18:49 » 

Леш, а AnsiString, кстати, тоже хранит свою строку динамически.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
eugrita
Помогающий

ru
Offline Offline

« Ответ #18 : 06-10-2010 19:03 » 

по поводу выхода заграницы массива - из приведенных кодов ясно что это невозможно.
Работал при N=3 - что хватает с лихвой
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #19 : 06-10-2010 19:06 » 

eugrita, я думаю, что пока код не приведешь в порядок, ошибка так и будет появляться. Только при разных условиях она может выскакивать в разных местах.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
eugrita
Помогающий

ru
Offline Offline

« Ответ #20 : 07-10-2010 02:57 » 

если вы под этим имеете в виду писать открыв и закр скобки одна под другой
запись по одному оператору в строку
и написание полных а не сокращенных комментариев - то это - фигня для чайников.
Вам же должно быть очевидно что эти преобразования не влияют на работоспособность программы
вот вам еще более упрощенный код той же проги
Код:
TForm1 *Form1;
int ia;//ðåæèì ðàñ÷åòà ia=0  - ïî âàð, ia=1 - ïî ó÷-êàì
int N; //êîë òî÷åê ðàçáèåíèÿ
float h;//øàã
float l;//äëèíà
int nu;//êîë ó÷-êîâ ñòóïåí÷ ñòåðæíÿ
int S,G;//N ãðóïïû, N ñòóä
float C;
float a[100], b[100],c[100], F[100]; //
AnsiString s;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{}
void __fastcall TForm1::bOKClick(TObject *Sender)
{
    N=3;l=1;h=l/N;
    sgM->Cells[0][0]="1";
    //ãåíåðèðîâàíèå âåêòîðîâ ïðîãîíêè
    for (int i=0;i<N;i++)
    {
        a[i]=1; c[i]=1;
    }
    a[0]=0;  c[N-1]=0;
    BFvar();
    // âûâîä â èíòåðôåéñ ìàòðèöû ïðîãîíêè
    for (int i=0;i<N;i++)
    {
        sgM->Cells[i][i]=sgM->Cells[i][i]="2";//FloatToStrF(b[i],ffNumber,7,3); // <--валится стем же сообщением
        if (i<N-1) sgM->Cells[i][i+1]="-1";
        if (i<N-1)  sgM->Cells[i+1][i]="-1";
    }
}

float TForm1::BFvar()
{//
    float p,f,x;
    for (int i=0;i<N;i++)
    {
        x=i*h;p=-S/(l*l+4*x*(l-x));
        b[i]=-2+h*h*p;
        f=-C*(2-p*x*(l-x)); F[i]=h*h*f;
    }
}
тут уж пенять не на чего всего 2 функции. Ошибка идет при доступе к Cells грида sgM
я даже вывожу в нее строку "2" чтобы исключить мусор в b[i]
в этом случае вывод происходит но полсекундой позде появляется то же сообщение.
при повторном нажатии на кнопку bOK валится уже на 1-м операторе
N=3;l=1;h=l/N

Боюсь что окончательная причина этого не в этом
Может надо переустановить билдер или винду


Добавлено через 22 минуты и 11 секунд:
Кстати почему -то идут искажения в отображении текста кода на сайте.
У меня было написано в функции BFVar  операторы
b =-2+h*h*p;  и  F =h*h*f;  
как элементы массивов с квадратными скобками  а при отображении они пропадают
видимо их принимают за какие-то теги.
т.е так b(i)=-2+h*h*p;//специально изменил квадр скобку на круглую чтоб хоть отображалась!!!
 Так мы далеко не уедем!!!

« Последнее редактирование: 07-10-2010 03:19 от eugrita » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #21 : 07-10-2010 04:22 » 

если вы под этим имеете в виду писать открыв и закр скобки одна под другой
запись по одному оператору в строку
и написание полных а не сокращенных комментариев - то это - фигня для чайников.
после этого пропадает интерес помогать такому крутому программисту, так как все мы на этом форуме считаем, что это чуть ли не основы работающего кода Улыбаюсь

Цитата
Кстати почему -то идут искажения в отображении текста кода на сайте.
Это не искажения, это ты не умеешь тегом code пользоваться. Оборачивай код в [code] [/code]

Цитата
Так мы далеко не уедем!!!
да.
« Последнее редактирование: 07-10-2010 04:24 от Алексей1153++ » Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #22 : 07-10-2010 05:31 » 

Код:
int ia;//режим расчета ia=0  - по вар, ia=1 - по уч-кам
int N; //кол точек разбиения
float h;//шаг
float l;//длина
int nu;//кол уч-ков ступенч стержня
int S,G;//N группы, N студ
float C;
//float *a, *b,*c, *F; //
float a[100], b[100],c[100], F[100]; //

float TForm1::BFvar()
{//
    float p,f,x;
    for (int i=0;i<N;i++)
    {
        x=i*h;p=-S/(l*l+4*x*(l-x));
    }
}
5 минут на подумать

ИМХО первопричина проблемы исключительная говнокодность программы
1. глобальные переменные
2. не инициализированные переменные
3. отсутствие проверок граничных условий (деление на 0 например)

Еще раз:  написал более 50 программ думаю под C++ Builder но такого маразма с FloatToStr никогда не было

Давай будем не письками мерится, а чем нибудь более достоим уважения.
Записан

Странно всё это....
eugrita
Помогающий

ru
Offline Offline

« Ответ #23 : 07-10-2010 06:23 » 

Ладно. Не хочу никого в идеологии обижать.
Вот еще раз код. Нет ни одной неинициализированной переменной кроме части массивов к которым нет обращения. Валится все равно. Иногда по другому - при 1 - нажатии на кнопку все проходит,
при 2-м нажатии -опять та же фигня
Код:
TForm1 *Form1;
int ia;//режим расчета ia=0  - по вар, ia=1 - по уч-кам
int N; //кол точек разбиения
float h;//шаг
float l;//длина
int nu;//кол уч-ков ступенч стержня
int S,G;//N группы, N студ
float C;
 float a[100], b[100],c[100], F[100]; //
AnsiString s;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{}
void __fastcall TForm1::bOKClick(TObject *Sender)
{
  N=3;l=1;h=l/N;
    sgM->Cells[0][0]="1";
//генерирование векторов прогонки
  for (int i=0;i<N;i++)
  {
    a[i]=1; c[i]=1;
  }
   a[0]=0;  c[N-1]=0;
   BFvar();
  // вывод в интерфейс матрицы прогонки
 for (int i=0;i<N;i++) {
  sgM->Cells[i][i]="2";//FloatToStrF(b[i],ffNumber,7,3);
  if (i<N-1) sgM->Cells[i][i+1]="-1";
  if (i<N-1)  sgM->Cells[i+1][i]="-1";
                       }
}

float TForm1::BFvar()
{//
  float p,f,x;
  S=1;  C=0.08;
  for (int i=0;i<N;i++)
 {
   x=i*h;p=-S/(l*l+4*x*(l-x));
   b[i]=-2+h*h*p;
   f=-C*(2-p*x*(l-x)); F[i]=h*h*f;
 }
}


 
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #24 : 07-10-2010 06:33 » 

код говно

деление на 0 так и осталось
Записан

Странно всё это....
eugrita
Помогающий

ru
Offline Offline

« Ответ #25 : 07-10-2010 06:38 » 

ан нет деления на 0 если в l*l+4*x(l-x) - там 0<=x<=1 и >0
Нечего сказать по существу - так и сознайтесь
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #26 : 07-10-2010 06:51 » 

Почитай описание исключения или делишь на 0 или пытаешься использовать не инициализированный float

да деления на 0 может и нет, но мнение моё о коде остаётся
Записан

Странно всё это....
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #27 : 07-10-2010 07:03 » 

Боюсь что окончательная причина этого не в этом
Может надо переустановить билдер или винду

Несомненно! Но обязательно нечетное количество раз!!! Ага


eugrita, поверь - мы желаем тебе только блага. Т.ч. лучше прислушивайся к рекомендациям. Код действительно отвратительный. Менее терпеливый человек сразу скажет, чтобы ты все переписывал заново, а не пытался искать ошибку.
« Последнее редактирование: 07-10-2010 07:06 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zubr
Гость
« Ответ #28 : 07-10-2010 07:30 » 

Код:
float TForm1::BFvar()
{//
  float p,f,x;
  S=1;  C=0.08;
  for (int i=0;i<N;i++)
 {
   x=i*h;p=-S/(l*l+4*x*(l-x));
   b[i]=-2+h*h*p;
   f=-C*(2-p*x*(l-x)); F[i]=h*h*f;
 }
}
Чему равно N в этой функции?
Записан
eugrita
Помогающий

ru
Offline Offline

« Ответ #29 : 07-10-2010 07:35 » 

N=3 т.к N - глобальная и здесь задается по клику на кнопку OK т.е в bOKClick(...)
Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines