C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Опять же Invalid Floating Point Operation:(, Ошибка появляется, но программа считает
Велес
Отправлено: 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



smile.gif) тут ты прав — по голове дадут, особенно, если кто-нибудь из конкурентов использует твой код smile.gif)
Но я привык искать ошибки в режиме пошаговой отладки, а имея только куски кода так не получится.

Вот тебе 2 аксионы охотника за ошибками:
1. чудес не бывает
2. если промахнулся в памяти, то чудеса бывают

поэтому разберись с индексами массивов и указателями (в том куске, что ты показал их нет, но это не означает, что ты ими не пользуешься), а остальное — это алгоритмические ошибки и в их появлении есть логика, в отличии от ошибок при работе с памятью...
Nick
Отправлено: 23.11.2003, 09:09


Машинист паровоза

Группа: Участник
Сообщений: 247



Везде в формулах есть операция деления.
Возможно гдето получается деление на 0.
Только при этом другая ошибка должна появиться
Floating point Division by Zero.
Все равно проверь значения переменных.
Велес
Отправлено: 24.11.2003, 08:56


Ученик-кочегар

Группа: Участник
Сообщений: 18



День добрый!

Нет-нет, Георгий был совершенно прав. При использовании <= действительно имело место использованием несуществующего элемента массива. Теперь всё работает, за что ещё раз благодарю Георгия.

Вернуться в Вопросы программирования в C++Builder