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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.95
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
12.11.2011, 23:23     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #1
Друзья! Есть какой-нибудь способ без 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. Спасибо, кто откликнется!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2011, 23:23     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы?
Посмотрите здесь:

Существует ли метод/функция перевода значения символьной переменной в int C++
C++ Какие значения возвращает функция анализа символов?
Функция PlaySound воспроизводит звук и возвращает управление СРАЗУ ЖЕ (но это неправильно), почему? C++
C++ Функция принимает указатель на void и возвращает указатель на int
Функция atof() возвращает не точное значения C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
13.11.2011, 14:27     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #41
Попробуйте показать пример кода, который бы вас устроил. Пусть он синтаксически будет не корректен, но будет понятно, о чем речь.

Не по теме:

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
13.11.2011, 14:54  [ТС]     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #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


Это-то и плохо. Ну, видать, судьба
А чё такое эксепшн?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.11.2011, 14:57     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #43
Цитата Сообщение от kravam Посмотреть сообщение
А чё такое эксепшн?
try-throw-catch
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
13.11.2011, 15:56  [ТС]     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #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;
}
Здорово я придумал?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.11.2011, 16:01     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #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"));
}
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
13.11.2011, 16:04     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #46
kravam, тебе такой вариант еще на первой странице предлагали
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
13.11.2011, 16:05     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #47
Цитата Сообщение от kravam Посмотреть сообщение
Здорово я придумал?
Как бы на второй странице такой вариант выкладывали.

Не по теме:

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

Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
13.11.2011, 16:09     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #48
А вообще, если ты пишешь на С++, то логичней использовать исключения для обработки ошибок
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
13.11.2011, 16:15     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #49
Цитата Сообщение от kravam Посмотреть сообщение
Здорово я придумал?
Здорово ты придумал! Еще пару шагов вперед и будут эксепшены.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
13.11.2011, 16:28  [ТС]     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #50
Цитата Сообщение от Nameless One Посмотреть сообщение
kravam, тебе такой вариант еще на первой странице предлагали
а, ну да, но я кстати, отреагировал на то сообщение
функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы?
Ну пусть не я придумал.
Короче я пока на нём остановлюсь. А с исключениями я пока не знаком, ну то есть я их пробовал изучить, но не просёк в чём там их преимущество. Типа возвращать всё в одно место круто гы-гы

Добавлено через 56 секунд
Nameless One, Это вообще не ошибки у меня а вполне себе нормальные возвращаемые ожидаемые значения.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
13.11.2011, 16:37     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #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;
}
Другая стратегия - это сделать для каждой ошибки свой класс исключения
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
13.11.2011, 16:44  [ТС]     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #52
изучу потом обязателно
Chelioss
13.11.2011, 17:03
  #53

Не по теме:

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

Nameless One
13.11.2011, 17:04
  #54

Не по теме:

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

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

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

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

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

/зыы Студия не умеет на этапе разработки разворачивать макросы. Но даже если б и умела, все равно, есть несколько очень простых способов, как при помощи макросов отстрелить себе ногу. Если ошибка происходит где то в зоне действия макроса, найти её "обычными способами" практически нереально. Поэтому, если макрос не понижает сложность проекта, а наоборот увеличивает, то такой макрос лучше не использовать имхо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2011, 20:10     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы?
Еще ссылки по теме:

C++ Возвращаемые значения функции
C++ Почему функция atan возвращает значения фрагментарно
C++ Функция вычисления среднего значения возвращает странное значение

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
13.11.2011, 20:10  [ТС]     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #56
Так я вроде пошёл по вашему способу, теперь функция возвращает string, всё упростилось вроде бы.
Yandex
Объявления
13.11.2011, 20:10     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы?
Ответ Создать тему
Опции темы

Текущее время: 15:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru