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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.95
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
13.11.2011, 10:49  [ТС]     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #21
Нет не позволю. Извольте ответить на два вопроса:
C++
1
#define makroopredelenie 1
1) Это макроопределение?
2) Это макрос?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
13.11.2011, 10:51     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #22
Цитата Сообщение от kravam Посмотреть сообщение
То есть юзать в С++ нечто называющееся макросами, нельзя. Но то же самое, называющееся макроопределениями
макрос и макроопределение в С/С++ - это одно и то же.
Ты бы лучше полностью описал свою задачу, т.к. то, как ты хочешь в данном случае использовать макросы, выглядит весьма сомнительно

Цитата Сообщение от kravam Посмотреть сообщение
Нет не позволю. Извольте ответить на два вопроса:
C++
1
#define makroopredelenie 1
1) Это макроопределение?
2) Это макрос?
  1. да
  2. да
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
13.11.2011, 10:54  [ТС]     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #23
Цитата Сообщение от Nameless One Посмотреть сообщение
макрос и макроопределение в С/С++ - это одно и то же.
молодец. А тот, другой модератор их различает. Это у него ошибка.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
13.11.2011, 10:58     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #24
с чего ты это взял? Дай ссылку на пост. Он, если я не ошибаюсь, всего лишь предложил тебе вместо макросов использовать константы
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
13.11.2011, 11:02  [ТС]     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #25
Ой, прошу прощения, я уж запутался. Вот так надо ставить вопрос:
C++
1
#define makroopredelenie 1
1) Это макрос?
2) Это именованная константа?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.11.2011, 11:04     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #26

Не по теме:

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



Добавлено через 20 секунд
kravam, это макрос.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
13.11.2011, 11:08     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #27
kravam, пример именованной константы:
C++
1
const size_t array_length = 15;
Почитать, почему в C++ лучше использовать const вместо define для обозначения константных данных
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
13.11.2011, 11:10  [ТС]     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #28
А... а по-моему это и то и другое. Вот здесь написано, что такое именованная константа, мой пример подходит под это определение. Так что разницы между ними нет. А коль скоро так, совет использовать одно вместо другого странен.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
13.11.2011, 11:15     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #29
kravam, ты по ссылке ходил? Так все ясно расписано
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.11.2011, 11:22     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #30
kravam, ещё раз говорю, это Pure C-style. В С++ под именованными константами понимается именно то, о чём вам сказал Nameless One в 27 сообщении этой темы. Или вам неймётся поспорить, не важно даже, о чём?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
13.11.2011, 11:52  [ТС]     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #31
Ну я не знаю, чистый это С или не чистый. Откроем лучше стандарт С++, недавно принятый, пункт 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" так ничё...

CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
13.11.2011, 12:50     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #32
kravam, мне кажется, или вы не разу не использовали, определенные вами макросы? Зачем они тогда?
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
13.11.2011, 12:59     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #33
kravam, присоединяюсь к вышеозвученному вопросу, при чем здесь макросы?
И да,
Цитата Сообщение от Nameless One Посмотреть сообщение
ты бы лучше полностью описал свою задачу, т.к. то, как ты хочешь в данном случае использовать макросы, выглядит весьма сомнительно
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
13.11.2011, 13:17     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #34
Использовать массивы или мапы. Вот что-то в таком духе.
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 можно по-интереснее инициализировать сложный объект типа мапа.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
13.11.2011, 13:45  [ТС]     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #35
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\\
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
13.11.2011, 13:53     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #36
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;
      /* ... */
   }
}

Не по теме:

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

kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
13.11.2011, 14:05  [ТС]     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #37
Э нет, макросы тут нужны для удобства. Вот вы просили задание, я написал задание и даже написал что в действительности возвращаются значения ОСМЫСЛЕННЫЕ. Это я повторяю, между прочим:
...А, кстати, в реализации 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
и там что-нибудь кропать! Мне кажется всё понятно, код модернизируется, и надо свести
места, куда вставлять изменения к минимуму.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
13.11.2011, 14:06     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #38
Цитата Сообщение от kravam Посмотреть сообщение
Так-то я представляю, что препроцессор заменит строки на цифры, ага
а в чем тогда смысл функции f?

Цитата Сообщение от kravam Посмотреть сообщение
Нет так нет, очень жаль, чё могу сказать.
в таком виде, как ты хочешь - нет, нельзя. Один из вариантов того, как это сделать можно, я показал выше (с x-макросами и enum'ами). Тогда тебе действительно при добавлении нового идентификатора ошибки нужно будет изменить только одно место в коде
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
13.11.2011, 14:11  [ТС]     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #39
функция f это просто демонстрационная функция. Её смысл- продемонстрировать как я использую макросы вместо чисел. И если "odin"== 1 (ежу понятно, да ведь? Вы же это хотели сказать?), то в реальном задании соответствие между строками и числами неочевидно, следует понимать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2011, 14:19     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
13.11.2011, 14:19     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы? #40
Цитата Сообщение от kravam Посмотреть сообщение
И если "odin"== 1 (ежу понятно, да ведь? Вы же это хотели сказать?), то в реальном задании соответствие между строками и числами неочевидно, следует понимать.
в любом случае, если у тебя в этой функции
C
1
2
case 3:
    return MACRO_IDENTIFIER;
MACRO_IDENTIFIER раскрывается в 3 (т.е. каждой ветви case соответствует возврат макроса с тем же значением), то функция не имеет смысла
Yandex
Объявления
13.11.2011, 14:19     функция возвращает int, возвращаемые значения определены в макросах, как сразу выводить определённые макросы?
Ответ Создать тему
Опции темы

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