Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
1

функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы?

12.11.2011, 23:23. Показов 4069. Ответов 55
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Друзья! Есть какой-нибудь способ без if-else? Ну то есть вот код:

C++
1
2
3
4
5
6
7
8
9
10
11
#define odin 1
 
////////////всякий код
 
int f () {retutn 1;};
 
#include <stdio.h>
////////////////всякий код
int main () {
 printf ("%d\n", f());
}
Надо чтобы в консоли вывелось odin. Спасибо, кто откликнется!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.11.2011, 23:23
Ответы с готовыми решениями:

Как функция возвращает значение int?
Доброго времени суток, собственно, как функция возвращает значение int? Создается переменная...

Макросы в эксель!Ребята необходимо разобраться в макросах!
Ребята,надо Написать программу, используя макросы в Excel,я в них не сильна. Программа должна быть...

Функция (int) возвращает ноль
Добрый день! Пишу скрипт корзины, столкнулся с таким вопросом. Я делаю изменение кол-ва товара на...

Нестандартные заранее определенные макросы C++. Как посмотреть?
В опциях CXXFLAGS компилятора с++ указан макрос препроцессора: -D_UNIX Без него компиляция не...

55
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
13.11.2011, 14:27 41
Author24 — интернет-сервис помощи студентам
Попробуйте показать пример кода, который бы вас устроил. Пусть он синтаксически будет не корректен, но будет понятно, о чем речь.

Не по теме:

Цитата Сообщение от kravam Посмотреть сообщение
а советов, не относящихся к делу, я наслушаюсь
Вот и я туда же. Попробуйте эксепшены -- это удобнее.

0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
13.11.2011, 14:54  [ТС] 42
Да мне уже написали, что невозможно.
А вообще вот:
C++
1
2
3
4
printf ("%d\n", f());
//ну или с другим спецификатором
//............................................
cout<<f();
Второе реализуется, кстати.
Но! Вот ведь чем хороши макросы? Ну тем, хотя бы, что их можно поправить в ОДНОМ МЕСТЕ.
Теперь представьте себе, что я f()
1) усложнил, то есть f () возвращала 0, 1 или 2. А теперь возвращает ещё и 3. и как следствие
2) диапазон возвращаемых макросов расширился.
То есть я добавил в макросы:
C++
1
#define eto_ya_dobavil 3
Всё? А нет, не всё. тЕПЕРЬ МНЕ НАДО ЛЕЗТЬ ЕЩЁ В СПЕЦИАЛЬНУЮ ФУНКЦИЮ, КОТОРАЯ ОТВЕЧАЕТ ЗА ПРЕОБРАЗОВАНИЕ ЧИСЕЛ В СТРОКИ И ТАМ ПРАВИТЬ. В моём варианте эта функция ostream& vivod_makrosov::operator<<

А Nameless One предложил
print_error_description


Это-то и плохо. Ну, видать, судьба
А чё такое эксепшн?
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
13.11.2011, 14:57 43
Цитата Сообщение от kravam Посмотреть сообщение
А чё такое эксепшн?
try-throw-catch
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
13.11.2011, 15:56  [ТС] 44
Ребята, а зачем функции возвращать тип int, тем более, если это значение что-то значит? А не проще ли чтобы функция возвращала string?
Тогда всё круто:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
 
 
#define nol   string("nol")
#define odin  string("odin")
#define dva   string("dva")
#define tri   string("tri")
 
 
 
 
 
string f (int x) {
 switch (x){
  case 0:
   return nol;
  case 1:
   return odin;
  case 2:
   return dva;
  case 3:
   return tri;
  default:
   return string ("Всё плохо, иди в макросы и правь макросы!\n");
  }       
}
 
 
int main () {
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 
 cout<< f(0)<< endl;
 cout<< f(1)<< endl;
 cout<< f(2)<< endl;
 cout<< f(3)<< endl;
 cout<< f(4)<< endl;
 getchar ();
 
 return 0;
}
Здорово я придумал?
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
13.11.2011, 16:01 45
Цитата Сообщение от kravam Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
string f (int x) {
 switch (x){
 case 0:
 return nol;
 case 1:
 return odin;
 case 2:
 return dva;
 case 3:
 return tri;
 default:
 return string ("Всё плохо, иди в макросы и правь макросы!\n");
 } 
}
C++
1
2
3
4
5
string f (int x) 
{
    static std::string arr[] = { "nol", "odin", "dva", "tri" };
    return (x >= 0 && x < 4 ? arr[i] : std::string("Всё плохо, иди в макросы и правь макросы!\n"));
}
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.11.2011, 16:04 46
kravam, тебе такой вариант еще на первой странице предлагали
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
13.11.2011, 16:05 47
Цитата Сообщение от kravam Посмотреть сообщение
Здорово я придумал?
Как бы на второй странице такой вариант выкладывали.

Не по теме:

в одно время написали

0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.11.2011, 16:09 48
А вообще, если ты пишешь на С++, то логичней использовать исключения для обработки ошибок
0
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
13.11.2011, 16:15 49
Цитата Сообщение от kravam Посмотреть сообщение
Здорово я придумал?
Здорово ты придумал! Еще пару шагов вперед и будут эксепшены.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
13.11.2011, 16:28  [ТС] 50
Цитата Сообщение от Nameless One Посмотреть сообщение
kravam, тебе такой вариант еще на первой странице предлагали
а, ну да, но я кстати, отреагировал на то сообщение
функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы?
Ну пусть не я придумал.
Короче я пока на нём остановлюсь. А с исключениями я пока не знаком, ну то есть я их пробовал изучить, но не просёк в чём там их преимущество. Типа возвращать всё в одно место круто гы-гы

Добавлено через 56 секунд
Nameless One, Это вообще не ошибки у меня а вполне себе нормальные возвращаемые ожидаемые значения.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.11.2011, 16:37 51
Цитата Сообщение от kravam Посмотреть сообщение
А с исключениями я пока не знаком, ну то есть я их пробовал изучить, но не просёк в чём там их преимущество. Типа возвращать всё в одно место круто гы-гы
ну вот пример реализации с исключениями (опять с использованием x-макросов, так как ты хочешь использовать для индикации типа ошибки целочисленный идентификатор). Чтобы добавить/удалить исключение, нужно изменить только одну строку в макросе DECLARE_ERRORS.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
#include <stdexcept>
 
#define DECLARE_ERRORS                          \
    X(FILE_ALREADY_EXISTS, "The specified file already exists")     \
    X(INCORRECT_NAME, "The specified filename is incorrect")        \
    X(CUSTOM_ERROR, "Custom error")
 
#define X(ID, DESC) ID,
enum class fs_error_type: size_t
{
    DECLARE_ERRORS
};
#undef X
 
#define X(ID, DESC) DESC,
static const char* fs_error_desc[] =
{
    DECLARE_ERRORS
};
#undef X
 
class fs_error: public std::runtime_error
{
public:
    fs_error(fs_error_type);
 
    const fs_error_type type;   // const public member (!)
};
 
fs_error::fs_error(fs_error_type t)
    : runtime_error(fs_error_desc[static_cast<size_t>(t)]), type(t)
{
}
 
// функция, которая может выбросить исключение
void do_unsafe_fs_stuff(int param) throw(fs_error)
{
    if(param == 42)
    return;         // пусть будет успех
 
    if(param == 255)
    throw fs_error(fs_error_type::INCORRECT_NAME);
 
    if(param == 0)
    throw fs_error(fs_error_type::FILE_ALREADY_EXISTS);
        
    if(param >= 2)
    throw fs_error(fs_error_type::CUSTOM_ERROR);
}
 
 
int main()
{
    size_t arr[4] = {3, 0, 255, 42};
 
    for(size_t i = 0; i < 4; ++i)
    {
    try
    {
        std::cout << "Doing unsafe stuff, passing " << arr[i] << " as param... ";
        do_unsafe_fs_stuff(arr[i]);
        std::cout << "done" << std::endl;
    }
    catch(std::exception& e)
    {
        std::cerr << "an error occured: " << e.what() << std::endl;
    }
    }
    
    return 0;
}
Другая стратегия - это сделать для каждой ошибки свой класс исключения
1
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
13.11.2011, 16:44  [ТС] 52
изучу потом обязателно
0
Chelioss
13.11.2011, 17:03
  #53

Не по теме:

Цитата Сообщение от Nameless One Посмотреть сообщение
Другая стратегия - это сделать для каждой ошибки свой класс исключения
А зачем? Если нам хватает только написать сообщение пользователю об ошибке, то ведь достаточно
Цитата Сообщение от Nameless One Посмотреть сообщение
std::runtime_error
или
Цитата Сообщение от Nameless One Посмотреть сообщение
std::exception

0
Nameless One
13.11.2011, 17:04
  #54

Не по теме:

Цитата Сообщение от Chelioss Посмотреть сообщение
А зачем? Если нам хватает только написать сообщение пользователю об ошибке, то ведь достаточно
я говорил про общий случай. Хотя нужно было бы сказать так: "можно делать для каждого класса (т.е. семейства) ошибок свой класс исключения"

0
Заблокирован
13.11.2011, 19:27 55
Цитата Сообщение от kravam Посмотреть сообщение
должна возвращать int, а не string
ну вот смотри:
Предположим, у тебя имеется функция, которая по значению сможет вернуть тебе имя дефайна:

C++
1
2
#define Odin  1
#define Error 1
Оба дефайна правомерны. Как твоя функция разберётся какой именно она должна вернуть?

Ответ: никак. Если ты сам не укажешь ей, что именно она должна вернуть.
Итого: пляски с бубнами. То, что ты хочешь сделать, как минимум неоправданно сложно.
Зачем это нужно, если можно юзать варианты попроще?

/зы Активно использую макросы. У меня, какой нибудь тривиальный шаблонный класс процентов на 10 минимум состоит из макросов. Не вижу ничего плохого в том, что бы максимально улучшать читабельность, и понижать сложность понимания любыми доступными средствами.

/зыы Студия не умеет на этапе разработки разворачивать макросы. Но даже если б и умела, все равно, есть несколько очень простых способов, как при помощи макросов отстрелить себе ногу. Если ошибка происходит где то в зоне действия макроса, найти её "обычными способами" практически нереально. Поэтому, если макрос не понижает сложность проекта, а наоборот увеличивает, то такой макрос лучше не использовать имхо.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
13.11.2011, 20:10  [ТС] 56
Так я вроде пошёл по вашему способу, теперь функция возвращает string, всё упростилось вроде бы.
0
13.11.2011, 20:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2011, 20:10
Помогаю со студенческими работами здесь

Функция PlaySound воспроизводит звук и возвращает управление СРАЗУ ЖЕ (но это неправильно), почему?
Друзья! Вот код: #include &lt;windows.h&gt; #include &lt;stdio.h&gt; int main (){ PlaySound...

Как использовать значения, возвращаемые IEnumerable
Здравствуйте. Ситуация следующая (программа просто для того, что бы попробовать как работать с...

Как получить возвращаемые значения функцией MessageBox
MessageBox.Show(&quot;Вы уверены, что хотите выйти?&quot;, &quot;Выход из игры!&quot;, MessageBoxButtons.OKCancel,...

Как преобразовать в QString значения возвращаемые QDomElement?
Всем доброго времени суток! Собственно имеется структурированный xml, вида: &lt;firstTag...

Можно ли вывести сразу 2 значения int из функции через return?
Можно ли вывести сразу 2 значения из функции int через return ? Например функция находит X1 и X2...

Реализуйте статический метод d(int a, int b, int c), который возвращает дискриминант b2-4*a*c квадратного уравнения.
Ребят, помогите решить задачи какие сможете... 1. Реализуйте статический метод d(int a, int b,...


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

Или воспользуйтесь поиском по форуму:
56
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru