powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Указатели
25 сообщений из 50, страница 2 из 2
Указатели
    #38537042
z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
z
Гость
MasterZivz,

вопрос изначально был про ссылки, а не про указатели. ссылок в С нет.
Название ссылка в C++ может приводить к путанице, так как в информатике, и в С в частности, под ссылкой понимается обобщенный концептуальный тип, а указатели и С++ ссылки являются специфическими реализациями ссылочного типа.
...
Рейтинг: 0 / 0
Указатели
    #38537300
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Код: plaintext
1.
#define sqr(x) (x)*(x)
...
Рейтинг: 0 / 0
Указатели
    #38537313
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#include<stdio.h>

#define SWAP(x,y) \
int temp ## __LINE__ = x; x = y; y = temp ## __LINE__;\

int main(int argc,char **argv){

	int x=2;
	int y=3;

	SWAP(x,y);
	
	printf("x= %i, y = %i\n",x,y);


}



Хе-хе!
...
Рейтинг: 0 / 0
Указатели
    #38537334
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Код: plaintext
1.
2.
#define SWAP(x,y) \
int temp ## __LINE__ = x; x = y; y = temp ## __LINE__;\



Если речь все-таки про С, то должно быть так:
Код: plaintext
1.
2.
#define SWAP(x,y) \
do { int temp ## __LINE__ = x; x = y; y = temp ## __LINE__; } while (0)


потому что С не позволяет объявлять переменные вперемешку с кодом.

А если про С++, то std::swap
...
Рейтинг: 0 / 0
Указатели
    #38537338
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, хех... добавлю в новых одинацдатых сях вон оно как определено:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
template <class T> void swap (T& a, T& b)
{
  T c(std::move(a)); a=std::move(b); b=std::move(c);
}
template <class T, size_t N> void swap (T &a[N], T &b[N])
{
  for (size_t i = 0; i<N; ++i) swap (a[i],b[i]);
}


А второй шаблон насколько я понял определяет свап для двух векторов
...
Рейтинг: 0 / 0
Указатели
    #38537355
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskymayton
Код: plaintext
1.
2.
#define SWAP(x,y) \
int temp ## __LINE__ = x; x = y; y = temp ## __LINE__;\



Если речь все-таки про С, то должно быть так:
Код: plaintext
1.
2.
#define SWAP(x,y) \
do { int temp ## __LINE__ = x; x = y; y = temp ## __LINE__; } while (0)


потому что С не позволяет объявлять переменные вперемешку с кодом.

А если про С++, то std::swap Во первых, современный C - позволяет. Сейчас чтобы компилятор начал ругаться на объявление переменных не в начале блока надо специально включать режим совместимости со старыми стандартами.
Во вторых, do while не обязателен даже в старых стандартах. Достаточно фигурных скобок. Главное чтобы блок был объявлен.
...
Рейтинг: 0 / 0
Указатели
    #38537544
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlВо первых, современный C - позволяет. Сейчас чтобы компилятор начал ругаться на объявление переменных не в начале блока надо специально включать режим
Во вторых, do while не обязателен даже в старых стандартах. Достаточно фигурных скобок. Главное чтобы блок был объявлен.
do while нужно чтобы макрос можно было применять везде где допустим вызов функции.
А просто скобки не везде допустимы.
Например это не будет работать
Код: plaintext
1.
2.
3.
4.
if (a)
   swap(x, y);
else
   other();


gcc умеет еще ({}) для тех же целей, но многие другие компиляторы не умеют.

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

Поэтому если есть возможность без каких либо усилий сделать универсальный макрос для всех компиляторов С, не вижу причин делать макрос который будет работать только с некоторыми компиляторами / опциями, просто потому что это возможно. Главное достоинство С - это кроссплатформенность. Не стоит лишать его этого без веских причин.
...
Рейтинг: 0 / 0
Указатели
    #38537547
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyА просто скобки не везде допустимы.
Например это не будет работать
Код: plaintext
1.
2.
3.
4.
if (a)
   swap(x, y);
else
   other();

Почему не будет??? У меня работает. Если макрос окружен просто скобками, то получится просто командный блок у if, а если с do{}while(0) то получится разовый цикл у if, который имеет в себе блок. В чем разница то?

Anatoly Moskovskygcc умеет еще ({}) для тех же целей, но многие другие компиляторы не умеют.А кто-то пользуется чем-то другим? Какие странные люди.

Anatoly MoskovskyНу а насчет "надо специально включать режим" ругани компилятора, это не совсем соответствует действительности. Например при сборке ядра и модулей линукса по умолчанию выдаются предупреждения на смешанный код. Так что обобщать тоже не надо.Ну так там этот режим включен.
Для gcc это комбинация ключиков -std=c89 -pedantic.
Для всех компиляторов у которых по умолчанию включен более поздний стандарт (а это все современные насколько я знаю) объявление переменной может быть где угодно, главное чтобы перед ее первым использованием...

Anatoly MoskovskyПоэтому если есть возможность без каких либо усилий сделать универсальный макрос для всех компиляторов С, не вижу причин делать макрос который будет работать только с некоторыми компиляторами / опциями, просто потому что это возможно. Главное достоинство С - это кроссплатформенность. Не стоит лишать его этого без веских причин.В общем-то да. С этим утверждением спорить нельзя.
...
Рейтинг: 0 / 0
Указатели
    #38537549
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlПочему не будет??? У меня работает. Если макрос окружен просто скобками, то получится просто командный блок у if, а если с do{}while(0) то получится разовый цикл у if, который имеет в себе блок. В чем разница то?
Если просто скобки, то макрос развернется в такой код
Код: plaintext
1.
2.
3.
4.
if (a)
   {...};
else
   other();


И я очень сомневаюсь, что он у вас "работает"
...
Рейтинг: 0 / 0
Указатели
    #38537556
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

ну уел... :-)
...
Рейтинг: 0 / 0
Указатели
    #38538563
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton

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

Код: plaintext
1.
2.
3.
4.
define sqr(x) x*x
...
int x=5,y;
y=sqr(x+1); "



Понятно что будет правильно так как вы написали :
Код: plaintext
1.
#define sqr(x) (x)*(x)



Я примёл тот комментарий так как хотел прокомментировать, что использование директив препроцессора по типу #define чаще всего нежелательно.

И вот кстати, такой общий вопрос. В теории языков программирования есть понятия аналогичное полноте пространства в математике, так вот интересно, можно ли сейчас обойтись вообще без таких замен кода подобных
Код: plaintext
1.
#define sqr(x) (x)*(x)

. То есть, можно ли написать программный код на языках C or С++ для любого алгоритма без использования данной директивы. И кстати, как я понимаю, без директив #include тоже можно обойтись, если вставлять код из библиотек вручную, но это гемор и бред конечно, наверное. Да и исчезнет функция предварительно откомпилированных заголовков, а это замедлит компиляцию/трансляцию программ. Мой вопрос касается только директивы #define.


Anatoly Moskovsky
Ваш спор, с коллегами mayton и White Owl , очень интересен, я уверен что из него можно извлечь много информации, сейчас буду изучать, ибо пока вопросов слишком много
...
Рейтинг: 0 / 0
Указатели
    #38538565
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
//надо всё-таки использовать предварительный просмотр
"Я примёл тот комментарий так как хотел прокомментировать, что использование директив препроцессора по типу #define чаще всего нежелательно."
так как может привести к трудновыявивым ошибкам.
...
Рейтинг: 0 / 0
Указатели
    #38538715
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryИ кстати, как я понимаю, без директив #include тоже можно обойтись, если вставлять код из библиотек вручную, но это гемор и бред конечно, наверное.
Это скорее всего бред
...
Рейтинг: 0 / 0
Указатели
    #38538906
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercuryИ кстати, как я понимаю, без директив #include тоже можно обойтись, если вставлять код из библиотек вручную, но это гемор и бред конечно, наверное.
Это скорее всего бред
Ну почти бред :)
Сейчас ведется развитие С++ в сторону директивы import которая должна заменить #include в том же смысле как инлайн функции заменили макросы. То есть это будет не препроцессинг, а полноценная фича языка.
Первыми идет в этом направлении Clang.
Посмотрим что получится.
Как минимум скорость компиляции должна будет улучшиться.
...
Рейтинг: 0 / 0
Указатели
    #38539392
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ведь большие голубые пилили такую фишку в Visual Age C++ ...
Но, линейка сдохла и фишки нет.
...
Рейтинг: 0 / 0
Указатели
    #38539509
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, C++ и так сложен макропроцессингом и шаблонами. А добавление
к нему еще и директив статического импорта сделает бинарь непрогнозируемо
большим и запутанным. Я-бы лучше двигался в сторону создания С++ runtime.
...
Рейтинг: 0 / 0
Указатели
    #38539551
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Импорт как раз упростит все.
Да и рантайм и так уже есть: libc + libstdc++ :)

А кому страшно, пусть сидит в своей джаве
...
Рейтинг: 0 / 0
Указатели
    #38539557
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Толик. Кольцо власти жжёт мне руку...
...
Рейтинг: 0 / 0
Указатели
    #38539891
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryИ кстати, как я понимаю, без директив #include тоже можно обойтись, если вставлять код из библиотек вручную, но это гемор и бред конечно, наверное.

maytonЭто скорее всего бред

Anatoly Moskovsky Ну почти бред :)

Согласен. а в целом, я был прав ? Такие вставки в код программы теоретически возможны ?

maytonAnatoly Moskovsky, C++ и так сложен макропроцессингом и шаблонами


не так много работал с шаблонами.Но всё же.
В С тип данных каждой переменной устанавливаются во время компиляции, используется статическая типизация. И это с одной стороны здорово, уменьшаем количество возможных ошибок, увеличиваем скорость работы программы, во время выполнения программы не происходят проверки типов. Это в сравнении с динамической типизацией. Есть и минусы, например нам необходимо отсортировать массив чисел, и было бы здорово если бы могли написать void sorting(any_type arr[]), вот в этом случае шаблоны (или ,как я понимаю, обобщённое программирование) будут очень удобны. Значит он не сложен шаблонами, а наоборот, хорошо что в нём есть шаблоны. Что я упускаю ? Почему он сложен ими ?

Basil A. Sidorov большие голубые

Кто такие большие голубые ?
...
Рейтинг: 0 / 0
Указатели
    #38539893
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли задать переменной адрес где она будет находиться ?
f e:
int a;
&a=0x123;
Наверное нет ? Почему ? А если да, то подскажите пожалуйста как
...
Рейтинг: 0 / 0
Указатели
    #38539937
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСогласен. а в целом, я был прав ? Такие вставки в код программы теоретически возможны ?Возможны.

SashaMercuryне так много работал с шаблонами.Но всё же.
В С тип данных каждой переменной устанавливаются во время компиляции, используется статическая типизация. И это с одной стороны здорово, уменьшаем количество возможных ошибок, увеличиваем скорость работы программы, во время выполнения программы не происходят проверки типов. Это в сравнении с динамической типизацией. Есть и минусы, например нам необходимо отсортировать массив чисел, и было бы здорово если бы могли написать void sorting(any_type arr[]), вот в этом случае шаблоны (или ,как я понимаю, обобщённое программирование) будут очень удобны. Значит он не сложен шаблонами, а наоборот, хорошо что в нём есть шаблоны. Что я упускаю ? Почему он сложен ими ?Потому что есть очень мало задач в которых подобный "any_type" имеет смысл. Но любители шаблонов умудряются писать их для каждого чиха.


SashaMercuryКто такие большие голубые ?IBM

SashaMercuryМожно ли задать переменной адрес где она будет находиться ?
f e:
int a;
&a=0x123;
Наверное нет ? Почему ? А если да, то подскажите пожалуйста как Потому что нет никакой разницы на каком адресе находится переменная.
Код: plaintext
1.
2.
int *a  = 0x123;
#define varA (*a)
...
Рейтинг: 0 / 0
Указатели
    #38539997
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl Потому что нет никакой разницы на каком адресе находится переменная.

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int a;
	int* pa;
	a = 5;
	pa = &a;
	std::cout << a << " " << &a << " " << pa<<std::endl<<"Array"<<std::endl;
	for (int i = 0; i <= 1000; ++i)
	{
		std::cout << i << " " << (pa + i) << " " << *(pa + i) << std::endl;
	}
	return 0;



Иногда вылетает на 100 шаге, а иногда на 500. С чем это связано ? С тем размером памяти что выделен в данный момент потоку программы в ОП ?
...
Рейтинг: 0 / 0
Указатели
    #38540014
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryWhite Owl Потому что нет никакой разницы на каком адресе находится переменная.

Я не могу спорить по этому поводу. Но не убедился что это действительно так. А если это так, то тогда объясните почему программе совершенно безразлично где хранятся данные, и почему это нигде не может понадобиться ?
Потому что ОС решает где выделить место и дает программе адрес этого места. За пределы этого места лезть не стоит, т.к. оно выделено для других переменных.
Есть хорошая книжка где это расписано подробно: Джеффри Рихтер "Windows для профессионалов".
ЧАСТЬ III УПРАВЛЕНИЕ ПАМЯТЬЮ (по ссылке скан позорненький, поищи с лучшим качеством или бумажную купи)
Книга хорошая, расписаны все внутренние особенности виндовса. Я по ней изучал когда-то.
SashaMercuryИногда вылетает на 100 шаге, а иногда на 500. С чем это связано ? С тем размером памяти что выделен в данный момент потоку программы в ОП ?
Если кратко: память выделяется страницами (по 4Кб если не ошибаюсь), пока ты читаешь выделенную память - работает, как только натыкаешься на адрес под который не выделена реальная память - вылетает.
...
Рейтинг: 0 / 0
Указатели
    #38540101
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ребята, о чем топик? просто поговорить?

есть какие-то новые вопросы -- делайте новые топики.
...
Рейтинг: 0 / 0
Указатели
    #38541417
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima_T,
окей,я записал ) Спасибо :-)
...
Рейтинг: 0 / 0
25 сообщений из 50, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Указатели
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]