Перейти к содержимому

Фотография

high tech for humanгде научиться програмировать


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 78

#41
рюмка

рюмка
  • В доску свой
  • 3 995 сообщений
Zulkar посмотрела на твою подпись чуть под стол не свалилась)
так что никто не учился Си?
  • 0

#42
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений
2 рюмка: С таким макросом, как у Zulkar'a в подписи, шутка не сработает, и подстроить подлянку при отладке вообще не получится. Программу даже запустить вряд ли удастся, не то что отлаживать. :spy:

Кто хоть самую малость учил Си, тот понимает, что в этом случае надо делать так:

//приятной отладки, сволочи
#define TRUE FALSE 

:smoke:
  • 0

#43
Zulkar

Zulkar

    Читатель

  • В доску свой
  • 3 243 сообщений
C чего это вдруг не запустится?
#include <stdio.h>
#define FALSE false
#define TRUE FALSE //отлаживайте сволочи
int main()
{
	
	bool f = TRUE;
	if(f)
	{
		printf("true");
	}else
	{
		printf("false");
	}
	return 0;
};
У меня откомпилилось и сработало правильно. Проблема в другом, в VS уже прописано
#define TRUE true
и
#define FALSE false
так что возможно придется писать #undef TRUE
  • 0

#44
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений

C чего это вдруг не запустится?

С того, что согласно синтаксису, TRUE должно разворачиваться в
FALSE //отлаживайте сволочи 

и тогда, по идее, вместо
bool f = TRUE;
после подстановки должно было получиться
bool f = FALSE //отлаживайте сволочи;
Точка с запятой получается закомментированной, это должно вызвать ошибку при компиляции, разве не так? Но, как ни странно, у меня тоже все откомпилировалось и сработало правильно!

Проблема в другом, в VS уже прописано
#define TRUE true
и
#define FALSE false
так что возможно придется писать #undef TRUE

Ну хорошо, может, здесь проблема именно в этом. А если взять что-нибудь другое, чтобы заранее не было прописано? Например:
#include <stdio.h>
#define swap(x,y) { int temp = x; x = y; y = temp; }
int main()
{
  int x = 5;
  int y = 3;
  printf ("До вызова swap: x = %d, y = %d\n", x, y);
  // Допустим, программист не посмотрел, что это макрос и вызвал swap(x,y) как будто это функция.
  if (x > y) swap(x,y); /* Неверно! */
  printf ("После вызова swap: x = %d, y = %d\n", x, y);
  return 0;
};
Это противоположный пример - в нем должна возникнуть ошибка не из-за пропадания точки с запятой за комментарием, а наоборот, из-за появления лишней точки с запятой после макроподстановки. Но и в этом случае никакой ошибки не возникает, все работает!

P.S. Я знаю, почему это работает, но пока не скажу :D

Сообщение отредактировал Visual1: 12.04.2008, 19:24:57

  • 0

#45
Zulkar

Zulkar

    Читатель

  • В доску свой
  • 3 243 сообщений
Работает потому что наверно TRUE разворачивается в FALSE а не в FALSE //отлаживайте сволочи. Это же комметарий. У кернигана все так прописано, так что это нормально, правда я не нашел у него разбора #define с комментами, видимо подразумевается само собой разумеющимся :smoke:

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


Ну да. Лишние точки с запятой не мешают.
int main()
{
  return 0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
}
равно как и
int main()
{
  return 0
 ;
 ;
 ;
 ;
 ;
 ;
 ;
 ;
 ;
 ;
 ;
 ; 
 ;
}
Вполне прекрасно компилится. Так и должно быть по моему. Точка с запятой обозначает конец строки текста. Причем она не обязательно должна на одной строке находится. Все правильно. :D
А по поводу свапа - программисту который подобное написал, руки поотрывать мало. Думаю вы понимаете почему. :p
  • 0

#46
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений

Работает потому что наверно TRUE разворачивается в FALSE а не в FALSE //отлаживайте сволочи. Это же комметарий. У кернигана все так прописано, так что это нормально, правда я не нашел у него разбора #define с комментами, видимо подразумевается само собой разумеющимся :D

Да, работает, хотя по синтаксису вообще-то не должно. Мне представляется, что где-то в других системах все же не будет работать (развернется не в FALSE, а в FALSE //отлаживайте сволочи). Так что лучше избегать подобных вещей. Может, у Кернигана так прописано, как вы говорите, но у Страуструпа прописано иначе. Вот цитата из его книги:

Простой макрос определяется так:
#define name rest of line

Когда name встречается как лексема, оно заменяется на rest of line. Например:

named = name;

после расширения даст:

named = rest of line;


Ну да. Лишние точки с запятой не мешают.

Да-а?! Прямо-таки во всех случаях? :smoke: А попробуйте совсем немного изменить мой предыдущий пример:
...
// Допустим, программист не посмотрел, что это макрос и вызвал swap(x,y) как будто это функция.
if (x > y) swap(x,y); 
else
x = y;
Ну как вам теперь? Лишние точки с запятой не мешают? ;)

А по поводу свапа - программисту который подобное написал, руки поотрывать мало. Думаю вы понимаете почему. ;)

Ну-ну, не надо быть таким кровожадным. :p Достаточно просто понимать опасности небрежного написания макросов (если есть возможность, лучше вообще их не использовать). С этой целью я и привел этот пример по поводу свапа. Не вы его привели, а я. Поэтому не вам у меня спрашивать, понимаю ли я, почему подобное писать нельзя. Скорее, наоборот.

Сообщение отредактировал Visual1: 12.04.2008, 22:51:07

  • 0

#47
Zulkar

Zulkar

    Читатель

  • В доску свой
  • 3 243 сообщений

Да, работает, хотя по синтаксису вообще-то не должно. Мне представляется, что где-то в других системах все же не будет работать (развернется не в FALSE, а в FALSE //отлаживайте сволочи). Так что лучше избегать подобных вещей. Может, у Кернигана так прописано, как вы говорите, но у Страуструпа прописано иначе. Вот цитата из его книги:


Простой макрос определяется так:
#define name rest of line

Когда name встречается как лексема, оно заменяется на rest of line. Например:

named = name;

после расширения даст:

named = rest of line;

Хорошо. Цитата из Страуструпа. (язык программирования С++, раздел 4.7 - тот же самый, что использовали вы, только на несколько абзацев ниже)

Если макроопределение достаточно сложное, и требуется комментарий
к нему, то разумнее написать комментарий вида /* */, поскольку
в реализации С++ может использоваться препроцессор С, который не
распознает комментарии вида //. Например:
#define m2(a) something(a) /* глубокомысленный комментарий */

То есть комментарии можно вставлять в строку макроса. Другое дело, что компилятор С их может не принять. А компилятор С++ запросто. Тестил на VS, C++Builder, gcc. Все работает. Возможно экзотический самописный компилятор Васи Пупкина такое и не примет, но это уже не мои проблемы.

Да-а?! Прямо-таки во всех случаях? :D А попробуйте совсем немного изменить мой предыдущий пример:
...
Ну как вам теперь? Лишние точки с запятой не мешают? :p

Абсолютно. Я обычно пишу
if (x > y)
{
   SWAP(x,y); 
}
else
{
   x = y;
}
Так кстати проще читается. ИМХО, естественно.

Ну-ну, не надо быть таким кровожадным. :smoke: Достаточно просто понимать опасности небрежного написания макросов (если есть возможность, лучше вообще их не использовать). С этой целью я и привел этот пример по поводу свапа. Не вы его привели, а я. Поэтому не вам у меня спрашивать, понимаю ли я, почему подобное писать нельзя. Скорее, наоборот.

Опасность понимаю, поэтому и использую только когда не вижу иного выхода. А вот дальше... Я вас чем-то оскорбил?
  • 0

#48
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений

Хорошо. Цитата из Страуструпа. (язык программирования С++, раздел 4.7 - тот же самый, что использовали вы, только на несколько абзацев ниже)


Если макроопределение достаточно сложное, и требуется комментарий
к нему, то разумнее написать комментарий вида /* */, поскольку
в реализации С++ может использоваться препроцессор С, который не
распознает комментарии вида //. Например:
#define m2(a) something(a) /* глубокомысленный комментарий */

То есть комментарии можно вставлять в строку макроса.

С этим я совершенно несогласен! :D Из приведенной вами цитаты Страуструпа ни в коем случае не следует того, что утверждаете вы - вы ведь утверждаете, что комментарии типа // якобы "можно вставлять в строку макроса". Полностью цитата из п. 4.7 книги Б. Страуструпа выглядит так:

Обратите внимание на различие результатов расширения этих двух макросов:
#define m1(a) something(a) // глубокомысленный комментарий
#define m2(a) something(a) /* глубокомысленный комментарий */

например,
int a = m1(1) + 2;
int b = m2(1) + 2;

расширяется в
int a = something(1) //глубокомысленный комментарий +2;
int b = something(1) /* глубокомысленный комментарий */ +2;

Другое дело, что компилятор С их может не принять. А компилятор С++ запросто. Тестил на VS, C++Builder, gcc. Все работает. Возможно экзотический самописный компилятор Васи Пупкина такое и не примет, но это уже не мои проблемы.

Обсуждение "экзотического самописного компилятора Васи Пупкина" тоже не мои проблемы. Вообще, такого компилятора не существует, поскольку компиляторы С/С++ пишут лишь немногие, наиболее квалифицированные и опытные, разработчики. Да, у меня компилятор Microsoft тоже принял комментарий //, причем я задавал опции компиляции исходника как для С++, так и для С. Возможно, разработчики компилятора сделали любезный подарок пользователям (программистам) - зная об этой распространенной ошибке, сделали дополнительную обработку комментариев. И все же, не следует игнорировать предупреждение Б. Страуструпа - он не стал бы писать такое серьезное предупреждение (см. цитату выше) почем зря.

Абсолютно. Я обычно пишу

if (x > y)
{
   SWAP(x,y); 
}
else
{
   x = y;
}
Так кстати проще читается. ИМХО, естественно.

Эти скобки вам разве только в подобных случаях помогут, а в других - нет. См. еще раз пример Б. Страуструпа насчет #define m1(a) something(a) // глубокомысленный комментарий

А вот дальше... Я вас чем-то оскорбил?

Ваш предыдущий вопрос (понимаю ли я пример, который мной же и был приведен) был довольно глупый. Вам на это было указано. Я думаю, для вас этого должно быть достаточно, чтобы не задавать новых глупых вопросов.
  • 0

#49
Zulkar

Zulkar

    Читатель

  • В доску свой
  • 3 243 сообщений

С этим я совершенно несогласен! :D Из приведенной вами цитаты Страуструпа ни в коем случае не следует того, что утверждаете вы - вы ведь утверждаете, что комментарии типа // якобы "можно вставлять в строку макроса". Полностью цитата из п. 4.7 книги Б. Страуструпа выглядит так:


Обратите внимание на различие результатов расширения этих двух макросов:
#define m1(a) something(a) // глубокомысленный комментарий
#define m2(a) something(a) /* глубокомысленный комментарий */

например,
int a = m1(1) + 2;
int b = m2(1) + 2;

расширяется в
int a = something(1) //глубокомысленный комментарий +2;
int b = something(1) /* глубокомысленный комментарий */ +2;

Что то я в Страуструпе такого не нашел, ладно будем считать, что у меня Страуструп неполный. В инете нашел несколько ссылок, все совпадают с моей(по крайней мере в пункте 4.7). Ну да, ладно, возможно у вас более новое издание. Кстати второе определение может привести к еще более тяжелым последствиям. В старых средах программирования, такое встречалось. Чертовски трудноуловимая ошибка...

Возможно, разработчики компилятора сделали любезный подарок пользователям (программистам) - зная об этой распространенной ошибке, сделали дополнительную обработку комментариев. И все же, не следует игнорировать предупреждение Б. Страуструпа - он не стал бы писать такое серьезное предупреждение (см. цитату выше) почем зря.

Возможно. Только это работает на большинстве компиляторов (на всех, которые я тестил). Не знаю как сейчас в ANSI правильно, у меня его нет, но то чем обычно пользуюсь (студия и gcc) работают прекрасно.

Эти скобки вам разве только в подобных случаях помогут, а в других - нет

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

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

По вашему это вопрос? O_O

Думаю вы понимаете почему. :smoke:

Я вообще-то высказал убеждение. В конце вопроса обычно ставится вопросительный знак, если вы не знали. К тому же слово "понимаете" относилось не к тому, понимаете ли вы ваш пример, полностью согласен, это звучит глупо, а к немного другому. Читайте внимательнее. То вы слово "мультипарадигматический" мне припишите, то еще что-то не так прочитаете.
  • 0

#50
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений

Я вообще-то высказал убеждение. В конце вопроса обычно ставится вопросительный знак, если вы не знали.

Знаю. А что означает знак :-), которым вы сопроводили это ваше якобы "убеждение"? То, что это никакое не убеждение - это шутка. Шутка насчет моих способностей к пониманию моего же примера. Ну и глупая ваша шутка. Не ожидал подобных глупостей от вас. Плохо, что мне приходится объяснять вам это - должны были сами понимать.

Читайте внимательнее. То вы слово "мультипарадигматический" мне припишите,

Неправда, это слово я вам не приписывал. Ваше слово было "мультипарадигмический". Читайте внимательнее свои же собственые сообщения.

то еще что-то не так прочитаете.

Пишите аккуратнее, и вас прочитают так, как следует.
  • 0

#51
Zulkar

Zulkar

    Читатель

  • В доску свой
  • 3 243 сообщений
Ладно, Visual1. Давайте считать что мы друг друга не совсем поняли. Закончим флеймить и придираться к словам. Мир?
  • 0

#52
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений
Этот флейм и непонимание получились не по моей вине. Я не корчил дурацких рож, когда речь шла о способностях собеседника к пониманию. Я не тащил в эту тему слова, обсуждавшиеся совсем в другой теме. А вообще, конечно, я всегда за мир (хоть и не любой ценой).
  • 0

#53
Zulkar

Zulkar

    Читатель

  • В доску свой
  • 3 243 сообщений
То есть я флудер, плохо воспитанный, а вы белый и пушистый? Я уже написал что вы меня неправильно поняли, особенно это заметно, когда вопрос у вас превратился в шутку. Я ваши посты глупыми не называл, равно как и не говорил ничего про вашу рожу. Ну не хотите мира, не надо. Больше на ваши посты такого рода отвечать не собираюсь. Если по теме - всегда пожалуйста.
  • 0

#54
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений

То есть я флудер, плохо воспитанный, а вы белый и пушистый?

А что, разве наоборот? Плохо воспитанный флудер - это я, а белый и пушистый - это вы? Это я первый начал шутить насчет умственных способностей собеседника, а затем выяснять отношения?

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

Как же мне правильно понимать? Значит, это у вас был не вопрос, и не шутка, насчет моих способностей к пониманию моего же примера? Тогда что же это было такое, с улыбкой до ушей? (только не надо про ваше "убеждение" в том, что я способен понимать свои же собственные примеры - такое оправдание выглядит довольно нелепо).

Ну не хотите мира, не надо.

Мира хочу, но не на таких условиях. Вы же не согласны признать, что были неправы.

Больше на ваши посты такого рода отвечать не собираюсь. Если по теме - всегда пожалуйста.

Взаимно. Успехов.
  • 0

#55
v04bvs

v04bvs
  • В доску свой
  • 2 062 сообщений
Ну вы нафлудили тут, да ещё и поссорились :) Стандарт читать надо, в нём в самом начале написано

3 The source file is decomposed into preprocessing tokens (2.4) and sequences of white-space characters
(including comments). A source file shall not end in a partial preprocessing token or partial com-
ment14). Each comment is replaced by one space character. New-line characters are retained. Whether
each nonempty sequence of white-space characters other than new-line is retained or replaced by one
space character is implementation-defined. The process of dividing a source file’s characters into pre-
processing tokens is context-dependent. [Example: see the handling of < within a #include prepro-
cessing directive. ]
4 Preprocessing directives are executed and macro invocations are expanded. If a character sequence that
matches the syntax of a universal-character-name is produced by token concatenation (16.3.3), the
behavior is undefined. A #include preprocessing directive causes the named header or source file to
be processed from phase 1 through phase 4, recursively.


Т.е. сначала все комментарии заменяются одним пробелом, а уже потом выполняются макроподстановки.
  • 0

#56
рюмка

рюмка
  • В доску свой
  • 3 995 сообщений
не осилила всю страницу но думаю подразумевалось //приятной отладки сволочи - это коментарий. смысле первоначально автор имел это ввиду?

Сообщение отредактировал рюмка: 29.04.2008, 16:13:40

  • 0

#57
рюмка

рюмка
  • В доску свой
  • 3 995 сообщений
глюк

Сообщение отредактировал рюмка: 29.04.2008, 16:19:55

  • 0

#58
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений

не осилила всю страницу но думаю подразумевалось //приятной отладки сволочи - это коментарий. смысле первоначально автор имел это ввиду?

Да, именно это подразумевалось. Это комментарий :D Только я утверждал, что нельзя его располагать на одной строке с макросом #define TRUE FALSE, и оказался неправ, хоть и привел для обоснования цитату из книги Б. Страуструпа, где он специально рассматривал такой случай. Но видимо, я отстал от жизни - во времена написания книги Страуструпа было нельзя, но теперь можно. Мой компилятор ошибку не выдает, а v04bvs для дополнительного обоснования привел даже цитату из современного стандарта, за что ему спасибо.
  • 0

#59
bruman

bruman

    Читатель

  • Свой человек
  • 577 сообщений

Подскажите кто знает курсы по с++, курс должен быть не для начинающих) можно в росси

Ох внушка :smoke:
Да не бавает курсав для прадиванатых спяцав ;)

Курсы для новичков. Для спецов воркшопы и семинары. По основам врядли - только по конкретному продукту.
  • 0

#60
"0x0000"

"0x0000"
  • Свой человек
  • 543 сообщений
кто нибудь разбирается в виндовс службах? Запихал в On_start код клиента для WCF-сервиса. Всё компилится, служба устанавливается, но с веб-сервисом не работает. Нужно ли ещё что то делать чтобы служба работала с WCF ? Вобщем то код виндовс служб стандартный и простой.
  • 0


Количество пользователей, читающих эту тему: 1

пользователей: 0, неизвестных прохожих: 1, скрытых пользователей: 0

Размещение рекламы на сайте     Предложения о сотрудничестве     Служба поддержки пользователей

© 2011-2022 vse.kz. При любом использовании материалов Форума ссылка на vse.kz обязательна.