Tlik |
Отправлено: 09.03.2004, 11:18 |
|
Не зарегистрирован
|
QUOTE |
Doga Отправлено: 13/02/2004, 14:17
https://rxlib.ru/forums/index.php?ac...755778bfe853a86
Round(1999.6745, 2) возвратит 1999.67;
Round(1999.6745, 1) возвратит 1999.7;
Round(1999.6745, 0) возвратит 2000.0;
Round(6769.1536, -2) возвратит 6800.0;
Вот собственно код процедуры:
double Round(double Value, int Precision)
{
bool Reverse = false;
if (Value < 0.0)
{
Value = fabsl(Value);
Reverse = true;
}
int ValP3_1 = (int)(Value * IntPower(10., Precision + 1));
int ValP3_2 = (int)(Value * IntPower(10., Precision)) * 10;
double RetVal;
if (abs(abs(ValP3_1) — abs(ValP3_2)) < 5)
{
RetVal = ((double)((int)(Value * IntPower(10., Precision))))/IntPower(10., Precision);
}
else
{
RetVal = ((double)((int)(Value * IntPower(10., Precision)) + 1))/IntPower(10., Precision);
}
if (Reverse)
{
RetVal *= -1.;
}
return RetVal;
}
|
У меня выдает ошибку:
[C++ Error] Okrugl.cpp(33): E2268 Call to undefined function 'fabsl'
[C++ Error] Okrugl.cpp(37): E2268 Call to undefined function 'IntPower'
Функцию я объявил так:
void Round(double,int);
Мое новое значение будет тут: RetVal ? |
|
Gedeon |
Отправлено: 09.03.2004, 11:46 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Напиши следующее в своем файле
Оно тебя спасет
|
|
Tlik |
Отправлено: 09.03.2004, 12:53 |
|
Не зарегистрирован
|
не спасает от этого:
[C++ Error] Okrugl.cpp(37): E2268 Call to undefined function 'IntPower' |
|
Gedeon |
Отправлено: 09.03.2004, 14:04 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Странно, не должно такого быть — эта функция описана в math.h
|
|
Asher |
Отправлено: 09.03.2004, 15:28 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Привет.
QUOTE | Странно, не должно такого быть — эта функция описана в math.h |
нифига! Она в Math.hpp
P.S. По поводу округления на форуме пробегал вариант по-проще и соот. по-быстрее.
|
|
Tlik |
Отправлено: 09.03.2004, 17:28 |
|
Не зарегистрирован
|
Снова ошибка((
[Linker Error] Unresolved external 'TForm1::Roundz(double, int)' referenced from D:\LSPASENKO\MY_DEVELOPER\OKRUGL\FORMMAIN.OBJ
Ругается на код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Roundz(1999.6745,2);
}
P.S.
Да та ошибка исправилась. Функция в Math.hpp. |
|
Asher |
Отправлено: 09.03.2004, 17:45 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Видите ли вы разницу между вызовами Round и Roundz ???
|
|
Guest |
Отправлено: 10.03.2004, 08:55 |
|
Не зарегистрирован
|
QUOTE | Видите ли вы разницу между вызовами Round и Roundz ??? |
Да, извините опечатался. Я переназвал ее везде в коде как Roundz, а тут просмотрел.( В коде все названно правильно.
При компиляции выдает ошибку:
[Linker Error] Unresolved external 'TForm1::Roundz(double, int)' referenced from D:\.......\TEST\OKRUGL\UNIT1.OBJ
а когда проверяю код просто "Compile select unit", то ошибки в коде нет. Где искать причину, сам файл "Unit1.obj" существует.
Может я неправильно оюъявил функцию и передаю в нее параметры.
Объявил:
private: // User declarations
void Roundz(double,int);
Вызываю:
Roundz(1999.6745, 2);
|
|
Gedeon |
Отправлено: 10.03.2004, 09:34 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE (Guest @ 10/03/2004, 09:57) | private: // User declarations
void Roundz(double,int);
Вызываю:
Roundz(1999.6745, 2); |
Если вы так обьявляете функцию, значит она член того класса к которому относится private: и если ее вызов происходит не из этого класса то
1) Обьявите ее как Public:
2) Вызывать нужно так
CODE |
ВашКласс->Roundz(1999.6745, 2);
|
|
|
xTrim |
Отправлено: 10.03.2004, 09:44 |
|
Машинист паровоза
Группа: Участник
Сообщений: 208
|
мне кажется функция объявлена, но не реализована. т.е. объявлена как член класса TForm1, а реализована как свободная функция, добавь перед реализацией TForm1::
CODE |
unit.h
...
private: // User declarations
void Roundz(double,int);
...
unit.cpp
void TForm1::Roundz(double,int)
{
//реализация
}
...
|
|
|
Tlik |
Отправлено: 10.03.2004, 11:02 |
|
Не зарегистрирован
|
Исправил:
void TForm1::Roundz(double Value, int Precision)
И появилась ошибка:
[C++ Error] Unit1.cpp(57): E2467 'TForm1::Roundz(double,int)' cannot return a value
Закоментировал строку в функции "return RetVal;" и выполнил код, работает.
Проверил на примерах:
Round(1999.6745, 2) возвратит 1999.67;
Round(1999.6745, 1) возвратит 1999.7;
Round(1999.6745, 0) возвратит 2000.0;
Round(6769.1536, -2) возвратит 6800.0;
1. В первых двух правильно, а во вторых двух выдает без "0". (То есть "2000" и "6800"; - ЭТО правильно?
2. Вопрос. нужно ли эта сторока в коде "return RetVal;" не пойму??
|
|
Asher |
Отправлено: 10.03.2004, 11:21 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Привет.
1. Все правильно.
2. return RetVal Нужно оставить
Просто xTrim немного не то написал.
надо
double TForm1::Roundz(double Value, int Precision)
ну и в h-файле соответственно
double Roundz(double Value, int Precision);
P.S. Почитайте какую-нибудь книгу по азам. Вы не понимаете что делаете.
Отредактировано Asher — 10/03/2004, 13:24
|
|
xTrim |
Отправлено: 10.03.2004, 11:44 |
|
Машинист паровоза
Группа: Участник
Сообщений: 208
|
Как спросили в первом посте так и написал
|
|