Велес |
Отправлено: 22.11.2003, 12:22 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 18
|
День добрый.
Снова я и снова вынужден обращаться за помощью.
Проблема заключается в том, что при запуске расчета, программа сначала кричит: Invalid Floating Point Operation, вроде приостанавливает работу приложения, потом естессно нажимаю кнопку запуска и работа возобновляется и при этом ещё и выдаёт мне результаты (правильные!) расчёта.
Коды:
Форма 1: Ввод данных в массив:
Main->alfa[Main->w] = StrToFloat(Edit1->Text) * pow(10, -30);
Main->ksia[Main->w] = StrToFloat(Edit2->Text) * pow(10, -36);
Main->r0[Main->w] = StrToFloat(Edit3->Text) * pow(10, -9);
Main->q[Main->w] = StrToFloat(Edit5->Text)/pow(10, -9);
Main->w = Main->w + 1;
Форма 2 (Main), в которую и передаются массивы:
for(int z = 0; z <= w; z ++)
{
C1[z] = (-6 * me * pow(c, 2)* alfa[z] * alfgts)/((alfa[z]/ksia[z])+(alfgts/ksigts));
C2[z] = ((45 * pow(h, 2) * (alfa[z]) * alfgts * ((1/(2*((alfgts/ksigts)/((alfa[z])/(ksia[z]))+1)))+(1/(2*(((alfa[z])/(ksia[z]))/(alfgts/ksigts)+1)))))/(32*pow(M_PI, 2)*me));
b1 = 1 + 4*C2[z]/(3*C1[z]*pow(r0[z],2));
b2 = q[z]*r0[z];
B[z] = 6*C1[z]*exp(b2)*b1/(q[z]*pow(r0[z], 7));
RichEdit1->Lines->Insert(0, "" + FloatToStr(C1[z]));
RichEdit1->Lines->Insert(1, "" + FloatToStr(C2[z]));
RichEdit1->Lines->Insert(2, "" + FloatToStr(B[z]));
RichEdit1->Lines->Insert(3, "" + IntToStr(w));
}
Ошибку, которая упоминалась выдаёт на строках: C1[z]=..., C2[z]=...., B[z]. Естессно в зависимости от того, какая из них первая идёт, т.е. если закомментировать C1[z], то появится на C2[z] и т.д.
Помогите пожалуйста, ибо своих мозгов увы не хватает.
Заранее благодарен. |
|
Георгий |
Отправлено: 22.11.2003, 12:49 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
QUOTE | Main->alfa[Main->w] = StrToFloat(Edit1->Text) * pow(10, -30);
Main->ksia[Main->w] = StrToFloat(Edit2->Text) * pow(10, -36);
Main->r0[Main->w] = StrToFloat(Edit3->Text) * pow(10, -9);
Main->q[Main->w] = StrToFloat(Edit5->Text)/pow(10, -9);
Main->w = Main->w + 1; |
QUOTE | for(int z = 0; z <= w; z ++)
{...}; |
при работе w у тебя всегда равна числу элементов в массиве, но индекс последнего элемента = w-1 поэтому цикл надо писать так:
CODE | for(int z = 0; z < w; z ++)
{...}; |
т.е. z строго меньше w и меняется в диапазоне от 0 до w-1 включительно.
Лучше было бы если бы весь поект приложили бы — тогда можеть быть ещё что-нибудь нашли бы. |
|
Велес |
Отправлено: 22.11.2003, 12:59 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 18
|
Георгий, спасибо за совет.
Весь проект? Хммм, много получится. Да и я как бы не имею права выставлять весь код программы. По голове дадут:(....больно....
Отредактировано Велес — 22/11/2003, 14:33 |
|
Георгий |
Отправлено: 22.11.2003, 21:19 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
) тут ты прав — по голове дадут, особенно, если кто-нибудь из конкурентов использует твой код )
Но я привык искать ошибки в режиме пошаговой отладки, а имея только куски кода так не получится.
Вот тебе 2 аксионы охотника за ошибками:
1. чудес не бывает
2. если промахнулся в памяти, то чудеса бывают
поэтому разберись с индексами массивов и указателями (в том куске, что ты показал их нет, но это не означает, что ты ими не пользуешься), а остальное — это алгоритмические ошибки и в их появлении есть логика, в отличии от ошибок при работе с памятью... |
|
Nick |
Отправлено: 23.11.2003, 09:09 |
|
Машинист паровоза
Группа: Участник
Сообщений: 247
|
Везде в формулах есть операция деления.
Возможно гдето получается деление на 0.
Только при этом другая ошибка должна появиться
Floating point Division by Zero.
Все равно проверь значения переменных. |
|
Велес |
Отправлено: 24.11.2003, 08:56 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 18
|
День добрый!
Нет-нет, Георгий был совершенно прав. При использовании <= действительно имело место использованием несуществующего элемента массива. Теперь всё работает, за что ещё раз благодарю Георгия. |
|
|