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

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

12.11.2011, 23:23. Показов 4950. Ответов 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
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
13.11.2011, 10:49  [ТС]
Студворк — интернет-сервис помощи студентам
Нет не позволю. Извольте ответить на два вопроса:
C++
1
#define makroopredelenie 1
1) Это макроопределение?
2) Это макрос?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.11.2011, 10:51
Цитата Сообщение от kravam Посмотреть сообщение
То есть юзать в С++ нечто называющееся макросами, нельзя. Но то же самое, называющееся макроопределениями
макрос и макроопределение в С/С++ - это одно и то же.
Ты бы лучше полностью описал свою задачу, т.к. то, как ты хочешь в данном случае использовать макросы, выглядит весьма сомнительно

Цитата Сообщение от kravam Посмотреть сообщение
Нет не позволю. Извольте ответить на два вопроса:
C++
1
#define makroopredelenie 1
1) Это макроопределение?
2) Это макрос?
  1. да
  2. да
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
13.11.2011, 10:54  [ТС]
Цитата Сообщение от Nameless One Посмотреть сообщение
макрос и макроопределение в С/С++ - это одно и то же.
молодец. А тот, другой модератор их различает. Это у него ошибка.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.11.2011, 10:58
с чего ты это взял? Дай ссылку на пост. Он, если я не ошибаюсь, всего лишь предложил тебе вместо макросов использовать константы
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
13.11.2011, 11:02  [ТС]
Ой, прошу прощения, я уж запутался. Вот так надо ставить вопрос:
C++
1
#define makroopredelenie 1
1) Это макрос?
2) Это именованная константа?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
13.11.2011, 11:04

Не по теме:

Цитата Сообщение от Nameless One Посмотреть сообщение
если я не ошибаюсь
Не ошибаешься))



Добавлено через 20 секунд
kravam, это макрос.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.11.2011, 11:08
kravam, пример именованной константы:
C++
1
const size_t array_length = 15;
Почитать, почему в C++ лучше использовать const вместо define для обозначения константных данных
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
13.11.2011, 11:10  [ТС]
А... а по-моему это и то и другое. Вот здесь написано, что такое именованная константа, мой пример подходит под это определение. Так что разницы между ними нет. А коль скоро так, совет использовать одно вместо другого странен.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.11.2011, 11:15
kravam, ты по ссылке ходил? Так все ясно расписано
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
13.11.2011, 11:22
kravam, ещё раз говорю, это Pure C-style. В С++ под именованными константами понимается именно то, о чём вам сказал Nameless One в 27 сообщении этой темы. Или вам неймётся поспорить, не важно даже, о чём?
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
13.11.2011, 11:52  [ТС]
Ну я не знаю, чистый это С или не чистый. Откроем лучше стандарт С++, недавно принятый, пункт 16.3 И там увидим:
[IMG]file:///C:/DOCUME%7E1/ser/LOCALS%7E1/Temp/moz-screenshot-3.png[/IMG][IMG]file:///C:/DOCUME%7E1/ser/LOCALS%7E1/Temp/moz-screenshot-4.png[/IMG][IMG]file:///C:/DOCUME%7E1/ser/LOCALS%7E1/Temp/moz-screenshot-5.png[/IMG]
C++
1
2
3
4
5
6
16.3 Macro replacement
...
A preprocessing directive of the form
# define identifier replacement-list new-line
defines an object-like macro that 
...Ну так далее
Так что никуда они не делись из стандарта C++, а там остались.
...Давать ссыли на подобные сайты это бить ниже пояса, вё равно я их не осилю. Ладно, ваша взяла. Пусть именованные константы вообще лучше макроопределений. Но дело даже не в этом. Как сей факт поможет в решении моего вопроса? Никак. Просто теперь я буду знать, что именованные константы лучше макросов. Рад, очень рад.

...Пока что единственное, что мне удалось напропать:
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
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
 
 
#define nol    0
#define odin   1
#define dva    2
#define tre    3
 
 
class vivod_makrosov {
 public:
  vivod_makrosov () {}        
 ~vivod_makrosov () {}        
 
 ostream& operator<< (int);
 
};
 
 
ostream& vivod_makrosov::operator<< (int k) {                                  
 switch (k){
  case 0:
   return cout<< "nol";
  case 1:
   return cout<< "odin";
  case 2:
   return cout<< "dva";
  case 3:
   return cout<< "tri";
  default:
   return cout<< "немедленно разбирайся с макросами в двух местах: собственно в макросах\
   и в классе vivod_makrosov!";
  }       
}
 
vivod_makrosov vivod_makrosov_;
 
int f (int x) {
 return x;
}
 
 
int main () {
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 
 vivod_makrosov_<< f(0)<< endl;
 vivod_makrosov_<< f(1)<< endl;
 vivod_makrosov_<< f(2)<< endl;
 vivod_makrosov_<< f(3)<< endl;
 vivod_makrosov_<< f(4)<< endl;
 getchar ();
 
 return 0;
}
Вывод:
C++
1
vivod_makrosov_<< f(0)<< endl
приемлем. То есть как и было заявлено, функция возвращает int, а выводится string. То, что при изменении возвращаемого значения придётся залезать в два места и там править всё это дело (в макросы и в класс) это недостаток, но я не знаю, как его решить.
[IMG]file:///C:/DOCUME%7E1/ser/LOCALS%7E1/Temp/moz-screenshot.png[/IMG][IMG]file:///C:/DOCUME%7E1/ser/LOCALS%7E1/Temp/moz-screenshot-1.png[/IMG][IMG]file:///C:/DOCUME%7E1/ser/LOCALS%7E1/Temp/moz-screenshot-2.png[/IMG]

Добавлено через 2 минуты

Не по теме:

С и С++ мешать это плохо, а "это Pure C-style" вместо "это чистый C-style" так ничё...

0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
13.11.2011, 12:50
kravam, мне кажется, или вы не разу не использовали, определенные вами макросы? Зачем они тогда?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.11.2011, 12:59
kravam, присоединяюсь к вышеозвученному вопросу, при чем здесь макросы?
И да,
Цитата Сообщение от Nameless One Посмотреть сообщение
ты бы лучше полностью описал свою задачу, т.к. то, как ты хочешь в данном случае использовать макросы, выглядит весьма сомнительно
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
13.11.2011, 13:17
Использовать массивы или мапы. Вот что-то в таком духе.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <string>
 
const int ONE = 1;
const int TWO = 2;
const int THREE = 3;
 
std::string names[] = {"", "one", "two", "three"};
 
int main(int argc, char *argv[]) {
  int code = TWO;
  std::cout << names[code] << std::endl;
}
C 0x можно по-интереснее инициализировать сложный объект типа мапа.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
13.11.2011, 13:45  [ТС]
CyBOSSeR, имено, что мне не удалось их использовать. Код притянут за уши, я использую
строки "nol" "odin" "dva" "tri" потому, что они похожи на макросы, НО НЕ МАКРОСЫ. И неиспользоование последних ПРИ ВОЗВРАТЕ ЗНАЧЕНИЯ меня угнетает.
...А вообще можно было вот так сделать:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int f (int x) {
 switch (x){
  case 0:
   return nol;
  case 1:
   return odin;
  case 2:
   return dva;
  case 3:
   return tre;
  default:
   return 4;
  }       
 return x;
}
, хе, вот использование. Ну а чё? В реальном коде эти макросы имеют осмысленое значение.

Не по теме:

И вообще вам, ребята необязательно знать зачем мне всё это надо, ибо задача довольно сложна, разбираться вы с ней не будете, а советов, не относящихся к делу, я наслушаюсь, этап пройденый.

, но тем не менее:

Я пишу виртуальную ось, щас пишу функцию create_papka (string), котора возвращает значения int, такие:
C++
1
2
3
4
#define EST_ODNOIMONNII_FAIL 0
#define PAPKA_UZHE_EST 1
#define IMA_PAPKI_NEKORREKTNOE 3
#define PAPKA_SOZDANA 4
(Ещё надо добвить форс-мажорный макрос, когда попака не создана неизвестно почему, почва для дальнейших разбирательств, тык скыть.)
Щас я на стадии тестирования create_papka (), то есть так:

C++
1
2
3
4
5
6
7
8
9
10
 printf ("создание папок с корректными именами, но, возможно , уже имеющихся\n");
 printf ("%d\n", vfs_.create_papka("ooooo\\"));
 vfs_.create_papka("vD:\\ooooo\\");
 vfs_.create_papka("ooooo\\");
 vfs_.create_papka("vD:\\ooooo\\");
 vfs_.create_papka("ooooo\\rtrtrrt\\wewe");
 vfs_.create_papka("vD:\\ooooo\\rtrtrrt\\weewewewewew");
 vfs_.create_papka("vD:\\ooooo\\rtrtrrt\\wewewewew");
 vfs_.create_papka("vD:\\ooooo\\rtrtrrt\\wewe\\kkkkkk\\");
 vfs_.create_papka("vD:\\ooooo\\rtrtrrt\\wewe\\kkkkkk\\");
Ели бы я видел, какое именно значение возвразщается каждый раз при вызове create_papka () это помоглобы мне исправить ошибки. Но я вижу только цифры, это мне надо залезать в макросы и смотреть, что каждая цифра значит. Вот и всё собнсо. Для упрощения себе жизни я и всё это замутил, чтобы каждый раз в макросы не лезть и не смотреть какую же именно ошибку обозначает то или иное значение.

...А, кстати, в реализации create_papka возврат осуществляется не как return 0 или return 1, а как return EST_ODNOIMONNII_FAIL или return PAPKA_UZHE_EST; Это просто для удобства. Но разве не в это суть макросов?

Добавлено через 3 минуты
vfs это у меня класс "виртуальная файловая система"
vfs_ соответственно это объект этого класса, а create_papka один из методов
этого класса
...............................
C++
1
vfs_.create_papka("vD:\\ooooo\\");
ВЫзов метода. Создаётся тык скыть папка
vD:\\ooooo\\
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.11.2011, 13:53
kravam, ты просто не понимаешь, как работают макросы. После препроцессорной обработки (которая происходит еще до самой компиляции), из кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int f (int x) {
 switch (x){
  case 0:
   return nol;
  case 1:
   return odin;
  case 2:
   return dva;
  case 3:
   return tre;
  default:
   return 4;
  }       
 return x;
}
получается код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int f (int x) {
 switch (x){
  case 0:
   return 0;
  case 1:
   return 1;
  case 2:
   return 2;
  case 3:
   return 3;
  default:
   return 4;
  }       
 return x;
}
твоя функция - бессмысленна, используя ее, ты сводишь пользу макросов как осмысленных идентификаторов на нет

Цитата Сообщение от kravam Посмотреть сообщение
Ели бы я видел, какое именно значение возвразщается каждый раз при вызове create_papka () это помоглобы мне исправить ошибки. Но я вижу только цифры, это мне надо залезать в макросы и смотреть, что каждая цифра значит. Вот и всё собнсо. Для упрощения себе жизни я и всё это замутил, чтобы каждый раз в макросы не лезть и не смотреть какую же именно ошибку обозначает то или иное значение.
для подобных случаев обычно пишут функции типа таких:
C
1
2
3
4
5
6
7
8
9
10
void print_error_description(int err_code)
{
   switch(err_code)  /* ну или вариант с массивом строковых описаний */
   {
      case FILE_ALREADY_EXISTS:
          fprintf(stderr, "Specified file already exists\n");
          break;
      /* ... */
   }
}

Не по теме:

Дикая смесь транслита и английских слов выглядит просто-напросто ужасно

1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
13.11.2011, 14:05  [ТС]
Э нет, макросы тут нужны для удобства. Вот вы просили задание, я написал задание и даже написал что в действительности возвращаются значения ОСМЫСЛЕННЫЕ. Это я повторяю, между прочим:
...А, кстати, в реализации create_papka возврат осуществляется не как return 0 или return 1, а как return EST_ODNOIMONNII_FAIL или return PAPKA_UZHE_EST; Это просто для удобства. Но разве не в это суть макросов?
Так-то я представляю, что препроцессор заменит строки на цифры, ага
........................................ .................................
Мне непонятно: есть какая-нибудь возможность вывести на экран строки, как я хочу или нет? Может, директиву какую препроцессору дать или ещё что-нибудь. Нет так нет, очень жаль, чё могу сказать.

Добавлено через 6 минут
Цитата Сообщение от Nameless One Посмотреть сообщение
для таких случаев обычно пишут функции типа таких:
Так я такую и написал ну или примерно таку. Недостаток в том, что вот сейчас у меня не поределён ещё один макрос, который возвращает значение , допустим , 5. Это если папка просто не создана по неизвестной причине.
Так вот, если я этот макрос добавлю собственно в макросы, вот сюда:
C++
1
#define PAPKA_SOZDANA_NEPONATNO_POCHEMU 5
ТО всё будет нормально и даже этот возврат я реализую в creete_papka (); НО!
Ведть я ещё должен буду залезть в одно место кода, а имено в функцию
print_error_description
и там что-нибудь кропать! Мне кажется всё понятно, код модернизируется, и надо свести
места, куда вставлять изменения к минимуму.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.11.2011, 14:06
Цитата Сообщение от kravam Посмотреть сообщение
Так-то я представляю, что препроцессор заменит строки на цифры, ага
а в чем тогда смысл функции f?

Цитата Сообщение от kravam Посмотреть сообщение
Нет так нет, очень жаль, чё могу сказать.
в таком виде, как ты хочешь - нет, нельзя. Один из вариантов того, как это сделать можно, я показал выше (с x-макросами и enum'ами). Тогда тебе действительно при добавлении нового идентификатора ошибки нужно будет изменить только одно место в коде
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
13.11.2011, 14:11  [ТС]
функция f это просто демонстрационная функция. Её смысл- продемонстрировать как я использую макросы вместо чисел. И если "odin"== 1 (ежу понятно, да ведь? Вы же это хотели сказать?), то в реальном задании соответствие между строками и числами неочевидно, следует понимать.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.11.2011, 14:19
Цитата Сообщение от kravam Посмотреть сообщение
И если "odin"== 1 (ежу понятно, да ведь? Вы же это хотели сказать?), то в реальном задании соответствие между строками и числами неочевидно, следует понимать.
в любом случае, если у тебя в этой функции
C
1
2
case 3:
    return MACRO_IDENTIFIER;
MACRO_IDENTIFIER раскрывается в 3 (т.е. каждой ветви case соответствует возврат макроса с тем же значением), то функция не имеет смысла
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.11.2011, 14:19
Помогаю со студенческими работами здесь

Нестандартные заранее определенные макросы 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; ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
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