Четверг, 28 Марта 2024, 12:13

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 4
  • 1
  • 2
  • 3
  • 4
  • »
Форум игроделов » Программирование » C/C++ » #if
#if
HagraelДата: Понедельник, 10 Января 2011, 08:09 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Вот у меня код:
Code
#define PROGRAM_TYPE NOT_DEGRESS

#if PROGRAM_TYPE == DEGRESS

#include <iostream>
#include <conio.h>
using namespace std;
int main() {
  cout << "DEGREES";
  _getch();
  return 0;
}

#endif

Однако выводится DEGREES. Почему? о_О


WereWolfДата: Понедельник, 10 Января 2011, 09:36 | Сообщение # 2
частый гость
Сейчас нет на сайте
cout << "DEGREES";

Вроде как вывод срабатывает


В мире много глюков - и с ними надо жить!!!
HagraelДата: Понедельник, 10 Января 2011, 09:41 | Сообщение # 3
почетный гость
Сейчас нет на сайте
WereWolf, так это по идее к компилятору попасть не должно было, т. к. PROGRAM_TYPE = NOT_DEGRESS, а не DEGREES.

kiselevДата: Понедельник, 10 Января 2011, 09:42 | Сообщение # 4
участник
Сейчас нет на сайте
http://msdn.microsoft.com/en-us/library/078sfkak%28v=vs.71%29.aspx
RikettaДата: Понедельник, 10 Января 2011, 09:43 | Сообщение # 5
Strategist
Сейчас нет на сайте
Hagrael, Это текст, обычный текст, т.к. он в кавычках, попробуй без кавычек...
Вывод будет срабатывать и с Not и без, т.к. ты выводишь обычный текст.


Fougerite - Rust Server OpenSource API
TerraDev - Terraria OpenSource Hack
HagraelДата: Понедельник, 10 Января 2011, 09:54 | Сообщение # 6
почетный гость
Сейчас нет на сайте
_getch тут вообще не при чём. Проблема вот в чём - после просмотра файла препроцессором долен остаться пустой файл. Я же поставил условие:
#if PROGRAM_TYPE == ...
А оно не срабатывает. В компилятор всё равно попадает всё, что написано в теле условия.


FarcuatДата: Понедельник, 10 Января 2011, 09:58 | Сообщение # 7
частый гость
Сейчас нет на сайте
У тебя не определены DEGRESS и NOT_DEGRESS.

добавь две строки в самом начале

Code
#define DEGRESS 100
#define NOT_DEGRESS 101

и будет работать. Вернее компилятор будет ругаться на отсутсвие main().

froexДата: Понедельник, 10 Января 2011, 10:05 | Сообщение # 8
Руководитель Froexilize team
Сейчас нет на сайте
каждый #if-блок желательно закрывать парным #endif

Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.
HagraelДата: Понедельник, 10 Января 2011, 10:34 | Сообщение # 9
почетный гость
Сейчас нет на сайте
froex, проскроллите код, у меня есть парный #endif =)
Farcuat, зачем создавать лишние макросы? Я хочу запихать в PROGRAM_TYPE строчку, а не приравнять его к DEGREES или NOT_DEGRESS. Разве не строчка там приравнивается? о_О В общем, можете написать рабочий код, который в зависимости от макроса PROGRAM_TYPE пишет различный код? Буду премного благодарен.


FarcuatДата: Понедельник, 10 Января 2011, 11:38 | Сообщение # 10
частый гость
Сейчас нет на сайте
Чтобы записать строчку тебе следовало добавить ковычки, вот так
Code
#define PROGRAM_TYPE "NOT_DEGRESS"

В таком варианте можешь использовать PROGRAM_TYPE как строчку.

В #if сравнивай только числа. Вариант с числами выглядит так.

Однако я не советую тебе так писать код на Си. Директива #if чаще всего используется внутри библиотечных файлов типа "conio.h", чтобы избежать их повторного включения в программу. Если нужно чтобы программа выполняла разные действия делай условия в программе, а не с помощью директив препроцессора.

Не пытайся уменьшать размер экзешника таким образом. Это же Си, ты не для браузера программируешь, загрузка кода по сети каждый раз не требуется.

ezhickovichДата: Понедельник, 10 Января 2011, 12:36 | Сообщение # 11
[Великий и могучий хозяинъ]
Сейчас нет на сайте
Farcuat, А не лучше ли так?
Code
#define NOT_DEGRESS    100   
#define DEGRESS  101   
#define PROGRAM_TYPE NOT_DEGRESS   

#include <iostream.h>   
#include <conio.h>   
using namespace std;   
int main () {
#if PROGRAM_TYPE == DEGRESS   
     cout << "\nDEGREES ";   
     cout << PROGRAM_TYPE;   
#else
     cout << "\nNOT_DEGREES ";   
     cout << PROGRAM_TYPE;   
#endif
     getch ();
     return 0;
}



Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!


Сообщение отредактировал ezhickovich - Понедельник, 10 Января 2011, 12:37
HagraelДата: Понедельник, 10 Января 2011, 13:11 | Сообщение # 12
почетный гость
Сейчас нет на сайте
Всем спасибо!

FarcuatДата: Понедельник, 10 Января 2011, 13:16 | Сообщение # 13
частый гость
Сейчас нет на сайте
ezhickovich, да лучше.
HagraelДата: Понедельник, 10 Января 2011, 13:44 | Сообщение # 14
почетный гость
Сейчас нет на сайте
Ещё 2 вопроса появились - каким образом работает такой вызов функции?
Code
static_cast<int>(var)

То есть каким макаром туда int в угловых скобках попадает? о_О
И ещё - в char может быть 1 байт, _getch возвращает char, и когда пишешь cout << _getch(), то выводится буква. Выходит, на одну букву расходуется 8 бит или как?


ezhickovichДата: Понедельник, 10 Января 2011, 14:24 | Сообщение # 15
[Великий и могучий хозяинъ]
Сейчас нет на сайте
Quote (Hagrael)
Выходит, на одну букву расходуется 8 бит или как?

Да, представь себе... wink

Quote (Hagrael)
То есть каким макаром туда int в угловых скобках попадает? о_О

Ээээ... Вообще не понял вопрос...
Открой уже гугл... Клик



Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
HagraelДата: Понедельник, 10 Января 2011, 16:16 | Сообщение # 16
почетный гость
Сейчас нет на сайте
ezhickovich, вот именно потому, что вы не поняли вопроса, вы и отправили меня на гугл =) Дело в том, что я не понимаю, каким образом <int> попадает в функцию? То есть я знаю такую операцию:
Code
class my_type {
     operator<int a> {
         cout << a;
     }
}

И то с <...> не проверял, так что не знаю, будет ли работать, но загвоздка ещё вот в чём - static_cast ведь не объект, так что к нему по идее такое нельзя прицепить. Или я ошибаюсь?


ezhickovichДата: Понедельник, 10 Января 2011, 16:24 | Сообщение # 17
[Великий и могучий хозяинъ]
Сейчас нет на сайте
Это функция шаблон... wink


Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!


Сообщение отредактировал ezhickovich - Понедельник, 10 Января 2011, 16:24
HagraelДата: Понедельник, 10 Января 2011, 17:39 | Сообщение # 18
почетный гость
Сейчас нет на сайте
ezhickovich, понятно, спасибо. Ну в общем, пока на этом зацикливаться думаю не стоит.

Добавлено (10.01.2011, 17:36)
---------------------------------------------
А вот ещё вопрос - в каком порядке инициализируются функции? То есть у меня 3 функции, first, main, second (расположены в том же порядке, в котором написаны), как действует программа? То есть она ведь вначале инициализирует все функции, а лишь после выполняет функцию main или нет? Если да, то зачем прототипы?

Добавлено (10.01.2011, 17:39)
---------------------------------------------
И зачем юзать статические переменные, если они всегда будут в памяти?


KornivalДата: Понедельник, 10 Января 2011, 17:49 | Сообщение # 19
The Witcher
Сейчас нет на сайте
Hagrael, функции инициализируются в порядке расположения в коде.
Quote (Hagrael)
Если да, то зачем прототипы?

Вот когда придется разбивать код и держать его в нескольких файлах, тогда поймешь biggrin
Quote (Hagrael)
И зачем юзать статические переменные, если они всегда будут в памяти?

Я использовал статические переменные в качестве счетчиков. Если выбирать между глобальными и статическими переменными, я думаю выбор очевиден.


Сообщение отредактировал Kornival - Понедельник, 10 Января 2011, 17:51
HagraelДата: Понедельник, 10 Января 2011, 18:06 | Сообщение # 20
почетный гость
Сейчас нет на сайте
Kornival, понял =)
Что у меня не так? Компилятор выдаёт ошибку:
Code

int initGame(bool map[]);
int main() {
     return 0;
     bool map[20][15];
     initGame(map);
}
int initGame(bool map[15][20]) {
  for (int i=0; i<20; i++) {
   for (int j=0; j<15; j++) {
    map[i][j]=false;
   }
  }
  map[0][0]=true;
  return 0;
}

Вот ошибка:
\Code Blocks\game\main.cpp||In function `int main()':|
\Code Blocks\game\main.cpp|14|error: cannot convert `bool (*)[15]' to `bool*' for argument `1' to `int initGame(bool*)'


Форум игроделов » Программирование » C/C++ » #if
  • Страница 1 из 4
  • 1
  • 2
  • 3
  • 4
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг