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(...)
|
|
|
Записан
|
|
|
|
|