Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
Heidel
111 / 111 / 7
Регистрация: 11.10.2011
Сообщений: 647
#1

Вопрос по определению типа переменной - C++

24.10.2011, 14:44. Просмотров 1505. Ответов 20
Метки нет (Все метки)

В основной программе вычисляется с
C++
1
2
3
c = p (9)/h (3, z) + p (4); //Âû÷èñëåГ*ГЁГҐ Г±. Âûçîâ ðåêóðñèâГ*ûõ ГґГіГ*êöèé p ГЁ h
cout << "c="<< c << endl;
cout <<"\n" ;
Для её вычисления вызываются две рекурсивные функции

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// ÐåêóðñèâГ*Г*Гї ГґГіГ*êöèÿ äëÿ âû÷èñëåГ*ГЁГї p
double p (int i) 
{
    if (i==1)
        return cos (1);
    if (i==2)
        return -sin (1);
    if (i>=3)
        return (2*p (i-1) - p (i-2));
    return EXIT_SUCCESS;
}
 
// ÐåêóðñèâГ*Г*Гї ГґГіГ*êöèÿ äëÿ âû÷èñëåГ*ГЁГї h
double h (int i, int z)
{
    if (i==1)
        return 0.5;
    if (i==2)
        return sin (0.5);
    if (i>=3)
        return (z*h (i-1, z) + h (i-2,z));
    return EXIT_SUCCESS;
}
Вопрос в том, что при вычислении с её тип нигде не указан, а при попытке указать
C++
1
double c;
или
C++
1
double c= p (9)/h (3, z) + p (4);
пишет error C2086: 'c' : redefinition

Что неправильно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2011, 14:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вопрос по определению типа переменной (C++):

Переменной d присвоить первую цифру после запятой некоторой переменной x типа float - C++
Нужно целой переменной d присвоить первую цыфру после комы некоторой переменной x типа float Скажите, пожалуйста, с чего начать и по...

Записать адрес переменной произвольного типа в переменную типа int - C++
Здравствуйте, есть структура __packed struct myStruct{ uint32 HisCh; uint32 sNo; uint16 tNo; uint32 reserv; };

Вопрос об области видимости переменной - C++
У меня в проге один главный цикл и в этом цикле еще 4 цикла. Так вот, в начале главного цикла я написал int i =0; Вопрос, этот i = 0 будет...

Преобразование типа переменной - C++
Как сделать что бы компилятор не отслеживал преобразование типов переменных Конкретней на примере: #include &lt;iostream&gt; #include...

Определение типа переменной - C++
#include &lt;iostream&gt; #include &lt;typeinfo&gt; int main() { int t = 10; std::cout &lt;&lt; typeid(t).name() &lt;&lt; std::endl; if...

Перегрузка типа переменной - C++
Приветствую! Извиняюсь если уже было, просто гуглил гуглил и не нашёл ничего такого.. В общем короче, есть у меня шаблон класса. В...

20
Chelioss
181 / 181 / 4
Регистрация: 08.01.2011
Сообщений: 1,137
27.10.2011, 02:44 #16
Т.е. надо сперва поспорить, а только потом сказать про
Цитата Сообщение от accept Посмотреть сообщение
это вопрос оформления кода
?
Ну вы молодец.
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
27.10.2011, 05:37 #17
Цитата Сообщение от Chelioss
Т.е. надо сперва поспорить, а только потом сказать про
если ей сказать про оформление кода, она это не воспримет
потому говорится сразу "нельзя писать без отступов, нельзя использовать goto, нельзя делать бесконечные циклы, функция должна возвращать соответствующее значение"
иначе появляется что-нибудь вроде "return EXIT_SUCCESS;" , что тоже сработает без ошибок
0
taras atavin
3883 / 1757 / 92
Регистрация: 24.11.2009
Сообщений: 27,566
27.10.2011, 05:51 #18
Цитата Сообщение от Chelioss Посмотреть сообщение
Вообще-то это double, а не float.
И возвращать не обязательно именно такой тип, который указан в заголовке функции.
Главное, чтобы этот тип смог преобразоваться в тип, указанный в заголовке функции.
Обязательно. Если ты хочешь вернуть значение другого, но совместимого типа, то его обязательно надо преобразовать к типу самой функции. Хоть неявно, но обязательно. Не веришь - попробуй вернуть значение типа без обратной совместимости (то есть чтоб тип значения приводился к типу функции, а наоборот - нет), а в вызывающей функции присвоить его переменной типа самого значения. Или попробуй вернуть значение, тип которого может быть приведён к типу функции только явно.

Добавлено через 7 минут
Цитата Сообщение от Chelioss Посмотреть сообщение
Вы поняли, что сказали? Как это написать тип, указанный в заголовке функции, и при этом не тип, указанный в заголовке функции?
Он то понял, а ты нет. В заголовке указан один тип, явный операнд return имеет другой тип. Например,
C++
1
2
3
4
float f()
{
 return 0;
}
. В этом случае будет подставлено неявное преобразование, то есть на самом деле будет
C++
1
2
3
4
float f()
{
 return ((float)0);
}
, функция вернёт 0.0f, а не 0.

Добавлено через 1 минуту
Цитата Сообщение от accept Посмотреть сообщение
главное, что оно вещественное, а не целое и не символ
Контроль типов более строгий, чем твоё "лишь бы вещественное" и если вместо 0.0f подсунуть 0.0, то будет неявное приведение.
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
27.10.2011, 06:02 #19
Цитата Сообщение от taras atavin
и если вместо 0.0f подсунуть 0.0
можно любую заюзать, главное, что не символ 'a', когда функция возвращает вещественное число
потому что есть такая вещь, как "самодокументированность кода", когда ты видишь ноль (целый), возвращаемый из функции, которая возвращает float, то это признак ошибки
значит, либо у функции поменяли возвращаемый тип и забыли переделать тело, либо в функцию копировали из другого места и тоже не всё проверили
а когда всё соответствует, тогда всё нормально
0
taras atavin
3883 / 1757 / 92
Регистрация: 24.11.2009
Сообщений: 27,566
27.10.2011, 07:03 #20
Цитата Сообщение от accept Посмотреть сообщение
это вопрос оформления кода
Это вопрос контроля типов, ни чего общего с оформлением не имеющий.

Добавлено через 2 минуты
Цитата Сообщение от accept Посмотреть сообщение
когда ты видишь ноль (целый), возвращаемый из функции, которая возвращает float, то это признак ошибки
Нет. Надо только понимать, что под этим подразумевается приведение типа, а в вызывающей функции будет получен 0.0f.
0
Chelioss
181 / 181 / 4
Регистрация: 08.01.2011
Сообщений: 1,137
27.10.2011, 16:42 #21
Цитата Сообщение от taras atavin Посмотреть сообщение
Обязательно. Если ты хочешь вернуть значение другого, но совместимого типа, то его обязательно надо преобразовать к типу самой функции. Хоть неявно, но обязательно. Не веришь - попробуй вернуть значение типа без обратной совместимости (то есть чтоб тип значения приводился к типу функции, а наоборот - нет), а в вызывающей функции присвоить его переменной типа самого значения. Или попробуй вернуть значение, тип которого может быть приведён к типу функции только явно.
http://lurkmore.ru/images/thumb/0/0b...inFacepalm.png
Вы написали то же самое, что и я. ( про совместимость )
Цитата Сообщение от taras atavin Посмотреть сообщение
Он то понял, а ты нет.
А вы уверены, что сами поняли?
1) функция не может возвратить тип, отличный от типа, указанного в заголовке функции. Если это он имел ввиду, то он просто сам капитан очевидность.
2) Если он имел ввиду, что значение, которое мы указываем после ключевого слова return, должно быть такого же типа, что и указанного в заголовке функции, то как можно написать значение одновременно того же типа, указанного в заголовке функции, и типа, которое неявно преобразуется в тип, указанного в заголовке?
Тут либо одно:
C++
1
2
3
4
int f ()
{ 
  return 0; // int
}
Либо другое:
C++
1
2
3
4
int f()
{
 return 0.0; // неявное преобразование
}
Он написал, что эти два случая могут проявится в одном. Это же надо до такого додуматься.

Добавлено через 32 минуты
Все, понял, что он имел в виду. Это я не так понял. Но относительно facepalm'a это ничего не меняет
0
27.10.2011, 16:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2011, 16:42
Привет! Вот еще темы с ответами:

Шаблон типа переменной - C++
В графической библиотеке (SFML) есть шаблон для типа переменной Vector2. Переменная хранит в себе два числа заданного типа (Например,...

Объявление переменной своего типа - C++
Есть код #include &lt;iostream&gt; #include &lt;iomanip&gt; //#include &quot;complexz&quot; using namespace std; int main(){ double a,b,c,d; ...

Проверка типа вводимой переменной - C++
Сабж. Консольный режим. Возможно ли это вообще? Преобразование типов канечн рулезная вещь. Вот в таком кусочке: cout &lt;&lt;...

Удаление переменной типа класса - C++
Как удалить переменную типа класса который я сам создал?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.