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

 
не разберусь с функцией, (продолжение другого топика)
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



Напиши следующее в своем файле
CODE

#include <math.h>


Оно тебя спасет
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 немного не то написал. biggrin.gif
надо
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



Как спросили в первом посте так и написал wink.gif

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