Re[4]: C - Проверить тип (перенную) на указатель
От: Vain Россия google.ru
Дата: 08.07.11 08:35
Оценка: +1
Здравствуйте, ДимДимыч, Вы писали:

V>>Скомпилировать выражение и выдать ошибку (или не выдать) должен независимо от того выбросит он выражение из рантайма или не выбросит.

ДД>Синтаксический анализ произведется в любом случае. Я опасался, что компилятор может таки сгенерировть код, обращающийся к 0[var], в таком случае возможна runtime-ошибка доступа к памяти.
ДД>Такая модификация должна решить пробоему:
ДД>
ДД>#define STATIC_ASSERT_NO_POINTER_VALUE(var) (&((char *)0)[var] == &((char *)0)[var])
ДД>

Зачем так извращаться, есть же уже готовый подход — запихнуть в sizeof.
(void)(sizeof(((int*)0)[var]));
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[7]: Проще надо быть, проще... ;)
От: Erop Россия  
Дата: 09.07.11 03:54
Оценка: :)
Здравствуйте, Vain, Вы писали:

V>А при чём здесь умножение на 0?


Ну макрос же, мне вот, например, для того, чтобы понять, что во всех контекстах запись (var)*0 будет интерпретирована правильно, надо подумать, а для записи (var)*2 это очевидно. Ergo: запись с 2 ЧИТАБЕЛЬНЕЕ...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[12]: Проще надо быть, проще... ;)
От: Vain Россия google.ru
Дата: 11.07.11 03:13
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>>>Суть в том, что вместо var могут передать много чего.

V>>Не может, я же указал, что туда только имя переменной передаётся.
E>А это как гарантируется?
Примерно также гарантируется как для других макросов. У тебя ведь не вызывает вопросов что, к примеру, в assert любой может передать любой мусор, непонятно почему здесь возникает.

E>>>Имя типа, цепочку пунктуаторов, кусок какого-нибудь оператора...

V>>Я так и не понял чем умножение на 2, а не на 0, должно от этого спасти.
E>Тем, что 2 намного меньше перегружено.
Ничего не понял, какая ещё перегрузка?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
C - Проверить тип (перенную) на указатель
От: Vain Россия google.ru
Дата: 07.07.11 21:34
Оценка:
Не знаю даже куда это больше подходит, сюда или в этюды..
Вот надо было мне проверить перед арифметикой над переменной ,что переменная не указатель, иначе — ошибка компиляции. Всё бы хорошо, только язык не плюсы — ни шаблонов тебе, ни перегрузки функций, да ещё и переменные объявлять нужно в начале блока функции. Вообщем нашёл решение не хуже шаблонов. Показалось интересным.
void dummy(type var, type var2)
{
  STATIC_ASSERT_NO_POINTER_VALUE(var); /* all or nothing */

  type res = var-var2; /* valid if not pointer arithmetic */

  /* ... */
}

#define STATIC_ASSERT_NO_POINTER_VALUE(var) ...

Во что надо задефайнить макрос?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: C - Проверить тип (перенную) на указатель
От: ДимДимыч Украина http://klug.org.ua
Дата: 07.07.11 23:03
Оценка:
Здравствуйте, Vain, Вы писали:

V>Вот надо было мне проверить перед арифметикой над переменной ,что переменная не указатель, иначе — ошибка компиляции. Всё бы хорошо, только язык не плюсы — ни шаблонов тебе, ни перегрузки функций, да ещё и переменные объявлять нужно в начале блока функции. Вообщем нашёл решение не хуже шаблонов. Показалось интересным.

V>
V>void dummy(type var, type var2)
V>{
V>  STATIC_ASSERT_NO_POINTER_VALUE(var); /* all or nothing */

V>  type res = var-var2; /* valid if not pointer arithmetic */

V>  /* ... */
V>}


Вообще если type не производится от указателя, то при попытке передать указатель будет warning. Интрепретировать предупреждения как ошибки — хорошая практика.
Или имеется ввиду, что вместо type может быть любой тип, например void dummy(int var, int var2) компилироваться должно, а void dummy(int *var, int *var2) — не должно?

V>
#define STATIC_ASSERT_NO_POINTER_VALUE(var) ...
V>

V>Во что надо задефайнить макрос?

Для интегральных типов могу предложить что-то типа
#define STATIC_ASSERT_NO_POINTER_VALUE(var) (((void *)0)[var] == ((void *)0)[var])

Eсли var — указатель, ошибка компиляции обеспечена. Но не вижу гарантии, что любой компилятор выбросит разименование указателя.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[2]: C - Проверить тип (перенную) на указатель
От: Vain Россия google.ru
Дата: 08.07.11 00:19
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

ДД>Или имеется ввиду, что вместо type может быть любой тип, например void dummy(int var, int var2) компилироваться должно, а void dummy(int *var, int *var2) — не должно?

Да

V>>
#define STATIC_ASSERT_NO_POINTER_VALUE(var) ...
V>>

V>>Во что надо задефайнить макрос?
ДД>Для интегральных типов могу предложить что-то типа
ДД>
ДД>#define STATIC_ASSERT_NO_POINTER_VALUE(var) (((void *)0)[var] == ((void *)0)[var])
ДД>

ДД>Eсли var — указатель, ошибка компиляции обеспечена.
Почти угадал, только здесь будет лишняя ошибка — void* нельзя разъименовывать.

ДД>Но не вижу гарантии, что любой компилятор выбросит разименование указателя.

Скомпилировать выражение и выдать ошибку (или не выдать) должен независимо от того выбросит он выражение из рантайма или не выбросит.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[3]: C - Проверить тип (перенную) на указатель
От: ДимДимыч Украина http://klug.org.ua
Дата: 08.07.11 00:44
Оценка:
Здравствуйте, Vain, Вы писали:

V>Почти угадал, только здесь будет лишняя ошибка — void* нельзя разъименовывать.


Ок, меняем void* на int* или char*

V>Скомпилировать выражение и выдать ошибку (или не выдать) должен независимо от того выбросит он выражение из рантайма или не выбросит.


Синтаксический анализ произведется в любом случае. Я опасался, что компилятор может таки сгенерировть код, обращающийся к 0[var], в таком случае возможна runtime-ошибка доступа к памяти.
Такая модификация должна решить пробоему:
#define STATIC_ASSERT_NO_POINTER_VALUE(var) (&((char *)0)[var] == &((char *)0)[var])
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[4]: C - Проверить тип (перенную) на указатель
От: dilmah США  
Дата: 08.07.11 04:43
Оценка:
ДД>Синтаксический анализ произведется в любом случае. Я опасался, что компилятор может таки сгенерировть код, обращающийся к 0[var], в таком случае возможна runtime-ошибка доступа к памяти.

так обернуть его в if(0) { ... } что в рантайме его вообще не было
Re: Проще надо быть, проще... ;)
От: Erop Россия  
Дата: 08.07.11 05:02
Оценка:
Здравствуйте, Vain, Вы писали:

V>Не знаю даже куда это больше подходит, сюда или в этюды..

V>Вот надо было мне проверить перед арифметикой над переменной ,что переменная не указатель, иначе — ошибка компиляции. Всё бы хорошо, только язык не плюсы — ни шаблонов тебе, ни перегрузки функций, да ещё и переменные объявлять нужно в начале блока функции. Вообщем нашёл решение не хуже шаблонов. Показалось интересным.

Я так тебя понял, что тебе надо проверить не то, что не указатель, а то, что тип -- число? То есть структуры тоже не канают, а вот плавучка -- вполне?

V>#define STATIC_ASSERT_NO_POINTER_VALUE(var) ...

V>[/c]
V>Во что надо задефайнить макрос?

#define STATIC_ASSERT_ARITHMETIC_VALUE(var) (2*(var))

Если компиллер ругается, что типа ненужный код, то завернуть его во что-нибудь нужное, по желанию
Например, так:
#define STATIC_ASSERT_ARITHMETIC_VALUE(var) do{ } while((var)*0)

надеюсь, что такое все оптимизируют в ничто и никто не ругается
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Проще надо быть, проще... ;)
От: Vain Россия google.ru
Дата: 08.07.11 08:42
Оценка:
Здравствуйте, Erop, Вы писали:

V>>Не знаю даже куда это больше подходит, сюда или в этюды..

V>>Вот надо было мне проверить перед арифметикой над переменной ,что переменная не указатель, иначе — ошибка компиляции. Всё бы хорошо, только язык не плюсы — ни шаблонов тебе, ни перегрузки функций, да ещё и переменные объявлять нужно в начале блока функции. Вообщем нашёл решение не хуже шаблонов. Показалось интересным.
E>Я так тебя понял, что тебе надо проверить не то, что не указатель, а то, что тип -- число? То есть структуры тоже не канают, а вот плавучка -- вполне?
float/double не обязателен был, но тоже можно убрать или добавить его к проверке.

V>>#define STATIC_ASSERT_NO_POINTER_VALUE(var) ...

V>>[/c]
V>>Во что надо задефайнить макрос?
E>
#define STATIC_ASSERT_ARITHMETIC_VALUE(var) (2*(var))

Тоже правильно, только зачем именно на 2 умножаешь?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[5]: C - Проверить тип (перенную) на указатель
От: ДимДимыч Украина http://klug.org.ua
Дата: 08.07.11 09:02
Оценка:
Здравствуйте, Vain, Вы писали:

V>Зачем так извращаться, есть же уже готовый подход — запихнуть в sizeof.

V>
V>(void)(sizeof(((int*)0)[var]));
V>


Тоже вариант. Правда оба варианта обломаются на float/double.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[3]: Проще надо быть, проще... ;)
От: Erop Россия  
Дата: 08.07.11 17:45
Оценка:
Здравствуйте, Vain, Вы писали:

V>Тоже правильно, только зачем именно на 2 умножаешь?

1) Какая разница? Этот код компилятор выкинет.
2) А на что надо?
3) Есть версия с умножением на 0, чуть ниже, но 0 в С перегружен, с 2 понятнее...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Проще надо быть, проще... ;)
От: Vain Россия google.ru
Дата: 08.07.11 21:15
Оценка:
Здравствуйте, Erop, Вы писали:

E>3) Есть версия с умножением на 0, чуть ниже, но 0 в С перегружен, с 2 понятнее...

Поясни
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[5]: Проще надо быть, проще... ;)
От: Erop Россия  
Дата: 09.07.11 00:58
Оценка:
Здравствуйте, Vain, Вы писали:

E>>3) Есть версия с умножением на 0, чуть ниже, но 0 в С перегружен, с 2 понятнее...

V>Поясни
int* p = 0;
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Проще надо быть, проще... ;)
От: Vain Россия google.ru
Дата: 09.07.11 02:16
Оценка:
Здравствуйте, Erop, Вы писали:

E>>>3) Есть версия с умножением на 0, чуть ниже, но 0 в С перегружен, с 2 понятнее...

V>>Поясни
E>
int* p = 0;

А при чём здесь умножение на 0?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[8]: Проще надо быть, проще... ;)
От: Vain Россия google.ru
Дата: 09.07.11 11:34
Оценка:
Здравствуйте, Erop, Вы писали:

V>>А при чём здесь умножение на 0?

E>Ну макрос же
Я не вижу связи, причём здесь какой-то макрос?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[9]: Проще надо быть, проще... ;)
От: Erop Россия  
Дата: 09.07.11 20:33
Оценка:
Здравствуйте, Vain, Вы писали:

V>>>А при чём здесь умножение на 0?

E>>Ну макрос же
V>Я не вижу связи, причём здесь какой-то макрос?

Плохо, что не видишь. Я же в следующих словах пояснял

Суть в том, что вместо var могут передать много чего. Имя типа, цепочку пунктуаторов, кусок какого-нибудь оператора...
В первом приближении, макросы работают на уровне подстановок текста, поэтому нет никаких гарантий на аргумент...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[10]: Проще надо быть, проще... ;)
От: Vain Россия google.ru
Дата: 10.07.11 22:01
Оценка:
Здравствуйте, Erop, Вы писали:

V>>>>А при чём здесь умножение на 0?

E>>>Ну макрос же
V>>Я не вижу связи, причём здесь какой-то макрос?
E>Плохо, что не видишь. Я же в следующих словах пояснял
E>Суть в том, что вместо var могут передать много чего.
Не может, я же указал, что туда только имя переменной передаётся.
E>Имя типа, цепочку пунктуаторов, кусок какого-нибудь оператора...
Я так и не понял чем умножение на 2, а не на 0, должно от этого спасти.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[11]: Проще надо быть, проще... ;)
От: Erop Россия  
Дата: 11.07.11 03:08
Оценка:
Здравствуйте, Vain, Вы писали:

E>>Суть в том, что вместо var могут передать много чего.

V>Не может, я же указал, что туда только имя переменной передаётся.
А это как гарантируется? Или это типа этюд?
Ты, в принципе и про плавучку забыл указать, например.

E>>Имя типа, цепочку пунктуаторов, кусок какого-нибудь оператора...

V>Я так и не понял чем умножение на 2, а не на 0, должно от этого спасти.

Тем, что 2 намного меньше перегружено.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[13]: Проще надо быть, проще... ;)
От: Erop Россия  
Дата: 11.07.11 03:42
Оценка:
Здравствуйте, Vain, Вы писали:

V>Примерно также гарантируется как для других макросов. У тебя ведь не вызывает вопросов что, к примеру, в assert любой может передать любой мусор, непонятно почему здесь возникает.


А ты попробуй передать в assert любой мусор и посмотри, что будет
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[13]: Проще надо быть, проще... ;)
От: Erop Россия  
Дата: 11.07.11 03:43
Оценка:
Здравствуйте, Vain, Вы писали:

V>Ничего не понял, какая ещё перегрузка?


В С литерал 2 -- это точно целое. А 0 -- это тчо угодно, в зависимости от контекста.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[14]: Проще надо быть, проще... ;)
От: Vain Россия google.ru
Дата: 11.07.11 09:33
Оценка:
Здравствуйте, Erop, Вы писали:

V>>Ничего не понял, какая ещё перегрузка?

E>В С литерал 2 -- это точно целое. А 0 -- это тчо угодно, в зависимости от контекста.
Пример этой зависимости можно?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[15]: Проще надо быть, проще... ;)
От: Erop Россия  
Дата: 11.07.11 12:55
Оценка:
Здравствуйте, Vain, Вы писали:

V>Пример этой зависимости можно?


Я уже приводил тебе пример.
То, что ты не хочешь понимать то, что тебе пишут, это твоя особенность такая. Суть-то не в том, чтобы самоутвердиться, а в том, что бы предложить хорошее решение, КОТОРОЕ МОГЛИ БЫ ИСПОЛЬЗОВАТЬ другие посетители КЫВТа...

Мне больше нравится решение с 2, на крайняк с 1, так как оно на мой взгляд читабельнее и надёжнее. Если тебе больше нравится 0, то ради бога, используй 0.
Главное не надо юзать ваши построения с указателями в квадратных скобках...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[16]: Проще надо быть, проще... ;)
От: Vain Россия google.ru
Дата: 11.07.11 20:13
Оценка:
Здравствуйте, Erop, Вы писали:

V>>Пример этой зависимости можно?

E>Я уже приводил тебе пример.
Ты привёл свои догадки, но ничего конкретного.

E>То, что ты не хочешь понимать то, что тебе пишут, это твоя особенность такая. Суть-то не в том, чтобы самоутвердиться, а в том, что бы предложить хорошее решение, КОТОРОЕ МОГЛИ БЫ ИСПОЛЬЗОВАТЬ другие посетители КЫВТа...

Ну так обоснуй это решение, почему ноль нельзя использовать? Конкретного примера пока что я от тебя не услышал.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: C - Проверить тип (перенную) на указатель
От: ДимДимыч Украина http://klug.org.ua
Дата: 21.07.11 01:25
Оценка:
Здравствуйте, Vain, Вы писали:

V>Во что надо задефайнить макрос?


Еще вариант, работает и на double/float:
#define STATIC_ASSERT_NO_POINTER_VALUE(var) ((var) + (var))
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.