Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2012, 14:20   #1
Aido2
Новичок
Джуниор
 
Регистрация: 09.02.2012
Сообщений: 4
По умолчанию В Чём моя ошибка?

Здраствуйте.
Начал учить C++, учу понятное дело постепенно. Прочитал один урок - написал програмку с использованием новых возможностей или дополнил старую. Дошел до функций, появились проблемы. Обясните пожалуста в чём именно ошибка (програма работает следующим образом: пользователь вводит процент, программа находит минимальное количество действий (предметов, побед и т.д.) для достижения такого процента показывая сколько уже выполнено и сколько всего действитй)
Цитата:
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;

bool end_quest ()
{
char word;
cout<<"Повторить?\n (y)да/(any)нет"<<endl;
cin>>word;
if (word =='y') return true;
else return false;
}

double sumary(double dRate, double *dSum, double *dCompl)
{
int iCompl;
while (iCompl != *dCompl)
{
dSum+=1;
dCompl = *dSum*dRate;
iCompl = static_cast<int>(dCompl);
if (dSum>9000)
{ cout << "Eror - не вычислимый процент" << "\n";
system ("PAUSE");
}
}
}


int main(bool repet)
{
do
{
double dPRate;
double Sum=0;
double Compl=0;
cout<<"Введите процент: ";
cin>>dPRate;
double Rate=dPRate/100;
sumary(Rate,&Sum,&Compl);
cout<<"Общее количество: "<<Sum
<<"\nСделано: "<<Compl<<endl;
repet=end_quest();
}
while (repet == true);
system ("PAUSE");

}
вот такая ошибка
Код:
 D:\Progs\win005.cpp
[Warning] In function `double sumary(double, double*, double*)':

21 D:\Progs\win005.cpp
cannot convert `double' to `double*' in assignment
22 D:\Progs\win005.cpp
invalid static_cast from type `double*' to type `int'
23 D:\Progs\win005.cpp
ISO C++ forbids comparison between pointer and integer
при этом до использования функции программа работала, вот рабочий вариант:

Цитата:
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;

bool end_quest ()
{
char word;
cout<<"Повторить?\n (y)да/(n)нет"<<endl;
cin>>word;
if (word =='y') return true;
else return false;
}

int main(bool repet)
{
do
{
double dPRate;
cout<< "Введите необходимый процент: ";
cin >> dPRate;
double dRate=dPRate/100;
double Sum=0;
double dX;
int iX;
while ( iX != dX)
{
Sum = Sum+1;
dX = Sum * dRate;
// часть кода для проверки программы cout << " period" << Sum << "iX" << iX << " DX" << dX << "\n";
iX = static_cast<int>(dX);
if (Sum>9000)
{ cout << "Eror - не вычислимый процент" << "\n";
system ("PAUSE");
return 0;
}
}
cout << "Итог: " << "\n" << "Всего = " << Sum
<< "\n" << "Сделано = " << dX
<< "\n";

repet=end_quest();
}
while (repet == true);
system ("PAUSE");
}
заранее спасибо
Aido2 вне форума Ответить с цитированием
Старый 09.02.2012, 15:02   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Код:
double sumary(double dRate, double *dSum, double *dCompl)
{
    int iCompl;
    while (iCompl != *dCompl) //<--- что с чем сравнивается? Что больше, килограмм гвоздей, или один крокодил?
    {
       dSum+=1;  dCompl = *dSum*dRate;

       iCompl = static_cast<int>(dCompl); //<--- что к чему приводится? Килограмм гвоздей к крокодилу?

       if (dSum>9000)  { cout << "Eror - не вычислимый процент" << "\n"; system ("PAUSE"); }
    }
}

Последний раз редактировалось _Bers; 09.02.2012 в 17:19.
_Bers вне форума Ответить с цитированием
Старый 09.02.2012, 15:27   #3
Aido2
Новичок
Джуниор
 
Регистрация: 09.02.2012
Сообщений: 4
По умолчанию

Т.е. нельзя сравнивать типы int и double? Я перевожу чтобы отсечь дробную часть и продолжить расчет если таковая была, сейчас попробую ввести еще одну переменную которая вернет значение double но возможно вы подскажете более простой метод?
просто для примера в предыдущей программе такое работает, а в функции почему то нет.
Aido2 вне форума Ответить с цитированием
Старый 09.02.2012, 15:32   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Aido2 Посмотреть сообщение
Т.е. нельзя сравнивать типы int и double?
Можно. С++ предоставляет программистам 100500 разных способов, как отстрелить себе ногу.

Цитата:
Сообщение от Aido2 Посмотреть сообщение
Я перевожу чтобы отсечь дробную часть и продолжить расчет если таковая была
Используй явное приведение типов, что бы компилятор знал, что "это так задумано".

А вот кастовать указатель на double к int - это уже пахнет явный фейлом. О чем и сообщает компилятор.
_Bers вне форума Ответить с цитированием
Старый 09.02.2012, 16:26   #5
Aido2
Новичок
Джуниор
 
Регистрация: 09.02.2012
Сообщений: 4
По умолчанию

возможно я что-то не так понял, но разве у меня не явное приведение типа?
static_cast

Назначение: Приведение типа по обычным правилам, когда компилятор отказывается привести его автоматически (отличается от применяемого в Си (type_to)expression_from только тем, что с указателями не работает; для указателей применяется reinterpret_cast).
З.Ы. Брал с вики
З.Ы. и еще я не могу понять как оно тогда сработало в преведущей врсии

Последний раз редактировалось Aido2; 09.02.2012 в 16:30.
Aido2 вне форума Ответить с цитированием
Старый 09.02.2012, 17:20   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Кстати, по этой причине, я всегда пишу звездочку возле типа, если речь о типе.
Я бы переписал твой код вот так:

Цитата:
double sumary(double dRate, double* dSum, double* dCompl)
{
int iCompl;
while (iCompl != *dCompl) //<--- что с чем сравнивается? Что больше, килограмм гвоздей, или один крокодил?
{
dSum+=1; dCompl = *dSum*dRate;

iCompl = static_cast<int>(dCompl); //<--- что к чему приводится? Килограмм гвоздей к крокодилу?

if (dSum>9000) { cout << "Eror - не вычислимый процент" << "\n"; system ("PAUSE"); }
}
}
Дошло, нет? Ты что к чему приводишь то?
_Bers вне форума Ответить с цитированием
Старый 09.02.2012, 18:27   #7
Aido2
Новичок
Джуниор
 
Регистрация: 09.02.2012
Сообщений: 4
По умолчанию

три часа пыток но я разобрался, растяпа просто оказалось
Цитата:
dCompl = *dSum*dRate; //<------у меня оператор с указателем *dCompl
ну и такие же ошибки дальше...
извиняюсь за беспокойство
Aido2 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
в чем моя ошибка? mroff Общие вопросы Delphi 5 17.07.2011 11:55
в чём ошибка артём1 Помощь студентам 1 02.11.2010 01:11
Это ошибка Delphi или моя ошибка??? bloodeagle Общие вопросы Delphi 3 12.11.2009 15:26
В чём ошибка? Roman Общие вопросы C/C++ 2 24.12.2008 01:42
базовые и производные классы (В чём моя ошибка) umnix Общие вопросы C/C++ 5 01.12.2007 17:26