| 
			| 
					
						| eugrita 
								Помогающий    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++ » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    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 
								Помогающий    Offline | 
								|  | « Ответ #2 : 06-10-2010 07:04 »  |  | 
 
 не помогло |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    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 
								Помогающий    Offline | 
								|  | « Ответ #4 : 06-10-2010 07:19 »  |  | 
 
 хрен. Вообще применил статические массивы [100] -не помогает.Ошибка непонятно в чем
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #5 : 06-10-2010 07:23 »  |  | 
 
 значит, выход за границы массива. Где отладчик останавливается ?
 Сделай, наконец, проверку всех индексов во время всех обращений
 |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #6 : 06-10-2010 11:18 »  |  | 
 
 Судя по тому, что в первом посте динамически создаются одиночные значения, а для удаления применяется оператор удаления массива, то наверняка это не единственная ошибка в программе. Потому пока считаю, что вина FloatToStrF не доказана. |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| eugrita 
								Помогающий    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++ » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #8 : 06-10-2010 15:40 »  |  | 
 
 ffNumber - это что, и где определено? |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| eugrita 
								Помогающий    Offline | 
								|  | « Ответ #9 : 06-10-2010 17:48 »  |  | 
 
 ffNumber - это константа задающая фиксированный формат. С ней-то нет проблемЕще раз:  написал более 50 программ думаю под C++ Builder но такого маразма с FloatToStr никогда не было
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #10 : 06-10-2010 18:22 »  |  | 
 
 Если это 51-ая, то предыдущие 50 в зачет не пойдут! Во-первых, выбирай более длинные и понятные имена переменных. Во-вторых, форматируй код. Тогда и самому легче будет понимать свой код, и тому, кто его будет читать.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #11 : 06-10-2010 18:26 »  |  | 
 
 eugrita, ну, на твой код без содрогания тоже не взглянешь... 
 комментарии тоже шедевральны )) //изм-е кол-ва уч-ков
 
 s=FloatToStrF(-2,ffNumber,6,3); //оператор валит программу
 А проблема остаётся в порче s
 
 скрин ошибки можешь показать ?
 
 |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #12 : 06-10-2010 18:30 »  |  | 
 
 Леш, думаю, что он где-то неаккуратно работал с массивами, вышел за пределы и испортил соседнюю память. Возможно, как раз ту, где хранится AnsiString s. |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #13 : 06-10-2010 18:32 »  |  | 
 
 Я об этом подумал, но массивы динамические. В этом "проблема" - сложно за них вылезти так, чтоб портить s |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #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;
 
Никакие они не динамические...   |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #15 : 06-10-2010 18:40 »  |  | 
 
 так это он сейчас их застатил, а до этого они были динамические )
 //float *a, *b,*c, *F; //
 
 |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	|  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #17 : 06-10-2010 18:49 »  |  | 
 
 Леш, а AnsiString, кстати, тоже хранит свою строку динамически. |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| eugrita 
								Помогающий    Offline | 
								|  | « Ответ #18 : 06-10-2010 19:03 »  |  | 
 
 по поводу выхода заграницы массива - из приведенных кодов ясно что это невозможно.Работал при N=3 - что хватает с лихвой
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #19 : 06-10-2010 19:06 »  |  | 
 
 eugrita, я думаю, что пока код не приведешь в порядок, ошибка так и будет появляться. Только при разных условиях она может выскакивать в разных местах.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| eugrita 
								Помогающий    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 » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #21 : 07-10-2010 04:22 »  |  | 
 
 если вы под этим имеете в виду писать открыв и закр скобки одна под другойзапись по одному оператору в строку
 и написание полных а не сокращенных комментариев - то это - фигня для чайников.
 
 после этого пропадает интерес помогать такому крутому программисту, так как все мы на этом форуме считаем, что это чуть ли не основы работающего кода   Кстати почему -то идут искажения в отображении текста кода на сайте.
 Это не искажения, это ты не умеешь тегом code пользоваться. Оборачивай код в [code] [/code] Так мы далеко не уедем!!!
 да. |  
						| 
								|  |  
								| « Последнее редактирование: 07-10-2010 04:24 от Алексей1153++ » |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Антон (LogRus) | 
								|  | « Ответ #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 
								Помогающий    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) | 
								|  | « Ответ #24 : 07-10-2010 06:33 »  |  | 
 
 код говно
 деление на 0 так и осталось
 |  
						| 
								|  |  
								|  |  Записан | 
 
 Странно всё это.... |  |  | 
	| 
			| 
					
						| eugrita 
								Помогающий    Offline | 
								|  | « Ответ #25 : 07-10-2010 06:38 »  |  | 
 
 ан нет деления на 0 если в l*l+4*x(l-x) - там 0<=x<=1 и >0Нечего сказать по существу - так и сознайтесь
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Антон (LogRus) | 
								|  | « Ответ #26 : 07-10-2010 06:51 »  |  | 
 
 Почитай описание исключения или делишь на 0 или пытаешься использовать не инициализированный float
 да деления на 0 может и нет, но мнение моё о коде остаётся
 
 |  
						| 
								|  |  
								|  |  Записан | 
 
 Странно всё это.... |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #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 
								Помогающий    Offline | 
								|  | « Ответ #29 : 07-10-2010 07:35 »  |  | 
 
 N=3 т.к N - глобальная и здесь задается по клику на кнопку OK т.е в bOKClick(...) |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |