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

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

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

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

Не по теме:

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



Добавлено через 20 секунд
kravam, это макрос.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.11.2011, 11:08 27
kravam, пример именованной константы:
C++
1
const size_t array_length = 15;
Почитать, почему в C++ лучше использовать const вместо define для обозначения константных данных
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
13.11.2011, 11:10  [ТС] 28
А... а по-моему это и то и другое. Вот здесь написано, что такое именованная константа, мой пример подходит под это определение. Так что разницы между ними нет. А коль скоро так, совет использовать одно вместо другого странен.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.11.2011, 11:15 29
kravam, ты по ссылке ходил? Так все ясно расписано
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
13.11.2011, 11:22 30
kravam, ещё раз говорю, это Pure C-style. В С++ под именованными константами понимается именно то, о чём вам сказал Nameless One в 27 сообщении этой темы. Или вам неймётся поспорить, не важно даже, о чём?
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
13.11.2011, 11:52  [ТС] 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" так ничё...

0
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
13.11.2011, 12:50 32
kravam, мне кажется, или вы не разу не использовали, определенные вами макросы? Зачем они тогда?
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.11.2011, 12:59 33
kravam, присоединяюсь к вышеозвученному вопросу, при чем здесь макросы?
И да,
Цитата Сообщение от Nameless One Посмотреть сообщение
ты бы лучше полностью описал свою задачу, т.к. то, как ты хочешь в данном случае использовать макросы, выглядит весьма сомнительно
0
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
13.11.2011, 13:17 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 можно по-интереснее инициализировать сложный объект типа мапа.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
13.11.2011, 13:45  [ТС] 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\\
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.11.2011, 13:53 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;
      /* ... */
   }
}

Не по теме:

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

1
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
13.11.2011, 14:05  [ТС] 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
и там что-нибудь кропать! Мне кажется всё понятно, код модернизируется, и надо свести
места, куда вставлять изменения к минимуму.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.11.2011, 14:06 38
Цитата Сообщение от kravam Посмотреть сообщение
Так-то я представляю, что препроцессор заменит строки на цифры, ага
а в чем тогда смысл функции f?

Цитата Сообщение от kravam Посмотреть сообщение
Нет так нет, очень жаль, чё могу сказать.
в таком виде, как ты хочешь - нет, нельзя. Один из вариантов того, как это сделать можно, я показал выше (с x-макросами и enum'ами). Тогда тебе действительно при добавлении нового идентификатора ошибки нужно будет изменить только одно место в коде
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
13.11.2011, 14:11  [ТС] 39
функция f это просто демонстрационная функция. Её смысл- продемонстрировать как я использую макросы вместо чисел. И если "odin"== 1 (ежу понятно, да ведь? Вы же это хотели сказать?), то в реальном задании соответствие между строками и числами неочевидно, следует понимать.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
13.11.2011, 14:19 40
Цитата Сообщение от kravam Посмотреть сообщение
И если "odin"== 1 (ежу понятно, да ведь? Вы же это хотели сказать?), то в реальном задании соответствие между строками и числами неочевидно, следует понимать.
в любом случае, если у тебя в этой функции
C
1
2
case 3:
    return MACRO_IDENTIFIER;
MACRO_IDENTIFIER раскрывается в 3 (т.е. каждой ветви case соответствует возврат макроса с тем же значением), то функция не имеет смысла
0
13.11.2011, 14:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2011, 14:19
Помогаю со студенческими работами здесь

Функция 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,...


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

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