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

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

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

Студворк — интернет-сервис помощи студентам
Друзья! Есть какой-нибудь способ без 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.11.2011, 23:23
Ответы с готовыми решениями:

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

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

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

55
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
13.11.2011, 14:27
Студворк — интернет-сервис помощи студентам
Попробуйте показать пример кода, который бы вас устроил. Пусть он синтаксически будет не корректен, но будет понятно, о чем речь.

Не по теме:

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

0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
13.11.2011, 14:54  [ТС]
Да мне уже написали, что невозможно.
А вообще вот:
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
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
13.11.2011, 14:57
Цитата Сообщение от kravam Посмотреть сообщение
А чё такое эксепшн?
try-throw-catch
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
13.11.2011, 15:56  [ТС]
Ребята, а зачем функции возвращать тип 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
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
13.11.2011, 16:01
Цитата Сообщение от 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
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.11.2011, 16:04
kravam, тебе такой вариант еще на первой странице предлагали
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
13.11.2011, 16:05
Цитата Сообщение от kravam Посмотреть сообщение
Здорово я придумал?
Как бы на второй странице такой вариант выкладывали.

Не по теме:

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

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

Добавлено через 56 секунд
Nameless One, Это вообще не ошибки у меня а вполне себе нормальные возвращаемые ожидаемые значения.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.11.2011, 16:37
Цитата Сообщение от 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
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
13.11.2011, 16:44  [ТС]
изучу потом обязателно
0
13.11.2011, 17:03

Не по теме:

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

0
13.11.2011, 17:04

Не по теме:

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

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

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

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

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

/зыы Студия не умеет на этапе разработки разворачивать макросы. Но даже если б и умела, все равно, есть несколько очень простых способов, как при помощи макросов отстрелить себе ногу. Если ошибка происходит где то в зоне действия макроса, найти её "обычными способами" практически нереально. Поэтому, если макрос не понижает сложность проекта, а наоборот увеличивает, то такой макрос лучше не использовать имхо.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
13.11.2011, 20:10  [ТС]
Так я вроде пошёл по вашему способу, теперь функция возвращает string, всё упростилось вроде бы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.11.2011, 20:10
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
56
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru