Форум программистов, компьютерный форум CyberForum.ru

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

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

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

24.10.2011, 14:44. Просмотров 1415. Ответов 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

Что неправильно?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2011, 14:44     Вопрос по определению типа переменной
Посмотрите здесь:
Переменной d присвоить первую цифру после запятой некоторой переменной x типа float C++
Записать адрес переменной произвольного типа в переменную типа int C++
C++ Вопрос об области видимости переменной
C++ Определение типа переменной
C++ Шаблон типа переменной
C++ Преобразование типа переменной
C++ проблема с переменной типа char
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
27.10.2011, 02:44     Вопрос по определению типа переменной #16
Т.е. надо сперва поспорить, а только потом сказать про
Цитата Сообщение от accept Посмотреть сообщение
это вопрос оформления кода
?
Ну вы молодец.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
27.10.2011, 05:37     Вопрос по определению типа переменной #17
Цитата Сообщение от Chelioss
Т.е. надо сперва поспорить, а только потом сказать про
если ей сказать про оформление кода, она это не воспримет
потому говорится сразу "нельзя писать без отступов, нельзя использовать goto, нельзя делать бесконечные циклы, функция должна возвращать соответствующее значение"
иначе появляется что-нибудь вроде "return EXIT_SUCCESS;" , что тоже сработает без ошибок
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
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, то будет неявное приведение.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
27.10.2011, 06:02     Вопрос по определению типа переменной #19
Цитата Сообщение от taras atavin
и если вместо 0.0f подсунуть 0.0
можно любую заюзать, главное, что не символ 'a', когда функция возвращает вещественное число
потому что есть такая вещь, как "самодокументированность кода", когда ты видишь ноль (целый), возвращаемый из функции, которая возвращает float, то это признак ошибки
значит, либо у функции поменяли возвращаемый тип и забыли переделать тело, либо в функцию копировали из другого места и тоже не всё проверили
а когда всё соответствует, тогда всё нормально
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.10.2011, 07:03     Вопрос по определению типа переменной #20
Цитата Сообщение от accept Посмотреть сообщение
это вопрос оформления кода
Это вопрос контроля типов, ни чего общего с оформлением не имеющий.

Добавлено через 2 минуты
Цитата Сообщение от accept Посмотреть сообщение
когда ты видишь ноль (целый), возвращаемый из функции, которая возвращает float, то это признак ошибки
Нет. Надо только понимать, что под этим подразумевается приведение типа, а в вызывающей функции будет получен 0.0f.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2011, 16:42     Вопрос по определению типа переменной
Еще ссылки по теме:
C++ Удаление переменной типа класса
C++ Вывод переменной типа char
C++ Действовать в зависимости от типа переменной
Объявление переменной своего типа C++
C++ Проверка типа вводимой переменной

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

Или воспользуйтесь поиском по форуму:
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
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 это ничего не меняет
Yandex
Объявления
27.10.2011, 16:42     Вопрос по определению типа переменной
Ответ Создать тему
Опции темы

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