powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Изврат с шаблонами. Часть 2 (последняя)
20 сообщений из 20, страница 1 из 1
Изврат с шаблонами. Часть 2 (последняя)
    #38904427
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжение той же задачи, но ситуация обратная: все работает, но вопрос не накосячил ли я с приведениями типов?

Суть такая: передаю в другой трэд: или структуру, или указатель на нее, или int, и функцию для обработки, которая потом вызывается. Функция должна быть объявлена так:
Код: plaintext
1.
void my_worker(my_type_t& x)



Изврашаюсь чтобы не писать везде void* в параметрах, а потом приводить. Вобщем чтобы спрятать порнографию поглубже, т.е. в set_value() и izvrat().

Получилось вот что (упростил как смог):
Код: plaintext
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.
typedef void (*worker_t) (int*& x);

int* value;

template< typename T >
void set_value(T& v)
{
	if(sizeof(T) == sizeof(int*)) {
		*(T*)&value = v;
	} else {
		value = (int*)malloc(sizeof(T));
		if(value) memcpy(value, &v, sizeof(T));
	}
}

template< typename T >
void izvrat(T worker_func, bool is_ptr)
{
	worker_t worker = (worker_t) worker_func;
	if(is_ptr) {
		worker((int *&)*value);
		free(value);
	} else {
		worker(value);
	}
}

void print_int(int& x) {
	printf("%d\n", x);
}

void print_double(double& x) {
	printf("%f\n", x);
}

void  main(){
	int i = 1;
	set_value(i);
	izvrat(print_int, false);
	double j = 2;
	set_value(j);
	izvrat(print_double, true);
}



Понятно что если левую функцию подсуну, то компилятор не заметит, но оно сразу вылезет при отладке. Интересует не вылезет ли чего на другом компиляторе.
...
Рейтинг: 0 / 0
Изврат с шаблонами. Часть 2 (последняя)
    #38904431
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tвопрос не накосячил ли я с приведениями типов?
в коде столько косяков и очепяток, что искать среди них "с приведениями типов" как-то даже лениво )))

совершенно не понятно, почему вместо употребимого (void *) используется (int *). Лично мне, это взрывает глаза и мозг

Ну и Анатолий был фактически провидцем:
Anatoly MoskovskyDima T,

Я надеюсь в реальном коде нет присвоения из функции в глобальную переменную?
совместно с
Dima Tпередаю в другой трэд
это ставит в ступор и повергает в шок
...
Рейтинг: 0 / 0
Изврат с шаблонами. Часть 2 (последняя)
    #38904439
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИнтересует не вылезет ли чего на другом компиляторе.
IMHO не должно. Совершенно нормальное C-ное приведение типов через указатель.

Для меня через чур сложно, из за reference. Но в целом, раз работает, значит корректно.
...
Рейтинг: 0 / 0
Изврат с шаблонами. Часть 2 (последняя)
    #38904443
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevв коде столько косяков и очепяток, что искать среди них "с приведениями типов" как-то даже лениво )))
Просто покажи где и почему, разжевывать не надо, сам погуглю

Leonid Kudryavtsevсовершенно не понятно, почему вместо употребимого (void *) используется (int *). Лично мне, это взрывает глаза и мозг
потому что нет просто void, только void*, никак не компилировалось пока на int не заменил. Подскажешь как - верну обратно. Мне тоже тут int не нравится.

Leonid KudryavtsevНу и Анатолий был фактически провидцем:
Anatoly MoskovskyDima T,

Я надеюсь в реальном коде нет присвоения из функции в глобальную переменную?
совместно с
Dima Tпередаю в другой трэд
это ставит в ступор и повергает в шок
Глобальная переменая для наглядности (в реале std::queue<int*>), чтобы пример кода был рабочий и короткий. В реальном коде ее нет. Если я вывалю сюда всю поделку ее вообще никто читать не станет.
...
Рейтинг: 0 / 0
Изврат с шаблонами. Часть 2 (последняя)
    #38904445
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПросто покажи где и почему, разжевывать не надо, сам погуглю
Очепятки. Надеюсь, в рабочем коде их нет. (например is_ptr, который проверяется, но нигде не присваивается и т.д.)

Dima TLeonid Kudryavtsevсовершенно не понятно, почему вместо употребимого (void *) используется (int *). Лично мне, это взрывает глаза и мозг
потому что нет просто void, только void*, никак не компилировалось пока на int не заменил. Подскажешь как - верну обратно. Мне тоже тут int не нравится.

А какая компилятору разница?

Если я правильно мысль уловил. Пошел поэкспериментирую. Но будет без reference, я их плохо знаю и не люблю ))).
...
Рейтинг: 0 / 0
Изврат с шаблонами. Часть 2 (последняя)
    #38904448
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, ступил. Is_ptr ты в качестве параметра кидаешь (не понятно зачем, т.к. по sizeof ты же все равно знаешь, поместилось в указатель или нет).
...
Рейтинг: 0 / 0
Изврат с шаблонами. Часть 2 (последняя)
    #38904459
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да... еще очень веселая ошибка: error C2664 в MS VC

1) с (int*) код перестает быть универсальным. Кроме int, ничего другого (например bool) передать через указатель не получится. То есть, не понятно, нахрена козе баян.
2) зачем везде reference ? почему не использовать вместо этого ООП убожества нормальные C-ные ссылки?
...
Рейтинг: 0 / 0
Изврат с шаблонами. Часть 2 (последняя)
    #38904470
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevСорри, ступил. Is_ptr ты в качестве параметра кидаешь (не понятно зачем, т.к. по sizeof ты же все равно знаешь, поместилось в указатель или нет).
Это не ключевой момент в данном случае, надо было выкинуть, копипастил с рабочего кода. Is_ptr рождается динамически, true - указатель, надо освободить память.

Leonid KudryavtsevДа... еще очень веселая ошибка: error C2664 в MS VC

1) с (int*) код перестает быть универсальным. Кроме int, ничего другого (например bool) передать через указатель не получится. То есть, не понятно, нахрена козе баян.
2) зачем везде reference ? почему не использовать вместо этого ООП убожества нормальные C-ные ссылки?
MS VC 2008 Express никаких ошибок. на *(T*)& есть warning C4739: reference to variable 'value' exceeds its storage space, это понтно. Почему и спрашивал что не сглючит. У тебя какой MS VC? Текст ошибки желательно.

1. Как уже написал: указатели, структуры или индексы массивов. 4 байта во всех случаях. Я же для себя, bool на int можно заменить, все равно выравнивание до 4 байт.
2. Не совсем понял о чем речь. Стремился вот к чему:

Обычный подход: если одно и тоже написано дважды, то на третий раз надо обобщать. Дважды уже написано, надо третий, вот и занялся. Создание потока, эвенты и критические секции для межпотоковой синхронизации, цикл с ожиданием, куча хрени которую надо спрятать.

Убил день вместо копипаста за полчаса, но не жалею. В итоге:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#include "izvrat.h"

void int_worker(int& task)
{
	printf("work %d\n", task);
}

int main(int argc, char* argv[])
{
	my_worker_t mw = {0};
	thread_worker_create(mw, int_worker);
	for(int i = 1; i < 10; i++) {
		worker_add(mw, i);
	}
	thread_worker_stop(mw);
}


Красота :)
...
Рейтинг: 0 / 0
Изврат с шаблонами. Часть 2 (последняя)
    #38904481
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TКрасота :)
Мне указывать * при обращении к данным, не напрягает
Т.ч. вообще не вижу смысла использовать reference и получать кучу дебильных ошибок и не очевидный код. IMHO
...
Рейтинг: 0 / 0
Изврат с шаблонами. Часть 2 (последняя)
    #38904497
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TУ тебя какой MS VC? Текст ошибки желательно.
Текст нагуглил, видно компилятор MS VC поумнел и начал пресекать такие извраты. Печалька вообще пофиг, лет на 10 хватит, недавно с VC6 перешел. Затестил в линуксе - собирается.
...
Рейтинг: 0 / 0
Изврат с шаблонами. Часть 2 (последняя)
    #38904498
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то мне

typedef void (*worker_t) (int*& x);

не нравится. Для типов < 4 байт, может работать не корректно. Будет помещать в стек int, а дальше... как ляжет порядок байт в машинном слове.... Я бы тогда через union делал. Что бы привести указатель к reference. Если ОЧЕНЬ хочется использовать reference. Если не хочется, нафиг их вообще. Зачем они нужны? )))
...
Рейтинг: 0 / 0
Изврат с шаблонами. Часть 2 (последняя)
    #38904502
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а не, глючу. Оно же всегда указатель. Все нормально.
...
Рейтинг: 0 / 0
Изврат с шаблонами. Часть 2 (последняя)
    #38904510
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevDima TКрасота :)
Мне указывать * при обращении к данным, не напрягает
Мне тоже. Напрягает -> со структурами. Просто бесит, тут точка, там ->. Хочется однообразности.
Leonid KudryavtsevТ.ч. вообще не вижу смысла использовать reference и получать кучу дебильных ошибок и не очевидный код. IMHO
Не буду спорить. Опыта нет, вот и спрашиваю всякую ерунду. На С/С++ пишу мало, только то что нельзя сделать на других языках. В студенчестве маленько изучил, написал пару поделок, 10 лет прошло, надо переписать, сделаю dll-ку, обкатаю и еще на 10 лет забуду.
...
Рейтинг: 0 / 0
Изврат с шаблонами. Часть 2 (последняя)
    #38904511
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev Для типов < 4 байт
типы не 4 байта я к указателям привел
Код: plaintext
1.
2.
3.
4.
	if(sizeof(T) == sizeof(int*)) {
		*(T*)&value = v;
	} else {
...


вдруг забуду и char подсуну, станет char*, непрактично, но не сглючит.
...
Рейтинг: 0 / 0
Изврат с шаблонами. Часть 2 (последняя)
    #38904520
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevЧто-то мне

typedef void (*worker_t) (int*& x);

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

Спасибо за помощь.
...
Рейтинг: 0 / 0
Изврат с шаблонами. Часть 2 (последняя)
    #38904557
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevТ.ч. вообще не вижу смысла использовать reference и получать кучу дебильных ошибок и не очевидный код. IMHO
Уже знаю про религиозную войну C vs C++. Лично мне не до кошерности, ну нет ссылок в С, что теперь? Ну нравится мне синтаксис ссылок (не надо на NULL проверять, точку писать вместо -> для элементов структуры по указателю), проблем не вижу, возможно не понимаю по неопытности, поищу в инете какие подвохи могут быть, разве что & забыть в параметрах указать.
Нужен STL так на С вообще не писать? Классы аля С++ тоже нафиг не нужны, надоели, слишком много лишних букав из-за них. Есть структуры, много где их нет, поэтому приходится делать классы ради одного единственного экземпляра. Нафиг он нужен в единственном экземпляре? В итоге получается та же самая глобальная переменная, только кошерно оформленная.
static вообще супер фишка.

PS Сугубо ИМХУ человека малознакомого с С/С++, просьба несогласных не начинать религиозную войну :)
...
Рейтинг: 0 / 0
Изврат с шаблонами. Часть 2 (последняя)
    #38904596
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tпросьба несогласных не начинать религиозную войну :)
Ну что ж, вы сами попросили
...
Рейтинг: 0 / 0
Изврат с шаблонами. Часть 2 (последняя)
    #38904697
asdasdfasdf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaTпроблем не вижу
1. ну в данном случае, не возможность сделать ссылку на тип void. Указатель можно
2. обязательно инициализировать ссылку даже в union. Указатель и другие типы можно не инициализировать
3. по коду программы не видно, как осуществляется передача по значению или по ссылки. Может C синтаксис чуть чуть и переусложнен (на один символ, вместо . нужно ->) но зато там сразу видно, что происходит.
и так далее

в общем, IMHO сильно не доделано, не додумано и половинчато. Очень много ООП вещей в C++ сделано не подумавши, как-то костыльно и без логики. Ваша же тема это замечательно и показывает. Когда в принципе нормальное, здоровое желание... реализуется через одно место.
...
Рейтинг: 0 / 0
Изврат с шаблонами. Часть 2 (последняя)
    #38904703
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asdasdfasdfОчень много ООП вещей в C++ сделано не подумавши, как-то костыльно и без логики. Ваша же тема это замечательно и показывает. Когда в принципе нормальное, здоровое желание... реализуется через одно место.
Данная тема показывает, что какой бы ни был язык всегда можно простые вещи сделать через одно место.
Больше ничего не показывает.
И ничего связанного с ООП в этой теме нет.

Касательно того как правильно делать в C++, то все велосипеды давно изобретены - std::thread, std::bind, std::function (или аналоги из boost).
...
Рейтинг: 0 / 0
Изврат с шаблонами. Часть 2 (последняя)
    #38904768
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyКасательно того как правильно делать в C++, то все велосипеды давно изобретены - std::thread, std::bind, std::function (или аналоги из boost).
Доберусь до них когда-нибудь.
ИМХУ Любое изучение надо начинать с изобретения своего велосипеда, а потом можно готовый пересесть. Иначе много пробелов в знаниях получается, в устройство чужого велосипеда глубоко не полезешь, т.к. просто непонятно.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Изврат с шаблонами. Часть 2 (последняя)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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