Про проектирование

Не, дружище, у тебя прокол так себе... У нас главный проектировщик на объекте опоздал на 20 минут на совещание из-за того, что заблудился на развязке (барабанная дробь), которую сам и проектировал! Уже 2 года ржём. В байку переросло.

Вы смотрите срез комментариев. Показать все
51
Автор поста оценил этот комментарий

Мне кажется, все дело в указателях. Развязка может быть сложной, но если их грамотно расставить, не заблудишься

раскрыть ветку (21)
43
Автор поста оценил этот комментарий

(**(void (__thiscall ***)(_DWORD))ptr1)(ptr1);

раскрыть ветку (20)
15
Автор поста оценил этот комментарий

Так, а можно разъяснить для разбалованного сборщиками мусора человека?

раскрыть ветку (17)
43
Автор поста оценил этот комментарий

Да я сам этот кусок не понимаю

раскрыть ветку (6)
6
Автор поста оценил этот комментарий
Какая разница, лишь бы работало
1
Автор поста оценил этот комментарий
ты на продоте, случайно, не сидел?
раскрыть ветку (4)
2
Автор поста оценил этот комментарий
С неё
раскрыть ветку (3)
Автор поста оценил этот комментарий
Ссылку плиз
раскрыть ветку (1)
Автор поста оценил этот комментарий
помню, помню, как ты хотел мирана варс мои на джасс переписать
7
Автор поста оценил этот комментарий

это каст, двойное разыменование указателя и вызов функции.

ptr1 указывает на указатель на указатель на на метод объекта принимающий один параметр типа _DWORD и не возвращающий ничего.

void (__thiscall *)(_DWORD) - указатель на метод объекта;
void (__thiscall ***)(_DWORD) - указатель на указатель на указатель на метод объекта;
(void(__thiscall ***)(_DWORD))ptr1 - каст ptr1 к вышеназванному типу.
(**(void(__thiscall ***)(_DWORD))ptr1) - двойное разыменование (получается указатель на метод объекта);
(**(void(__thiscall ***)(_DWORD))ptr1)(ptr1) - вызов функции передавая в качестве аргумента ptr1

__thiscall - указывает, что это метод объекта и первый параметр (this) следует передавать соответсвующим образом (если память не изменяет, то через ecx)

раскрыть ветку (9)
Автор поста оценил этот комментарий

Мне тут упорно представляются создания Бездны и их Призыватели...

раскрыть ветку (1)
Автор поста оценил этот комментарий

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

Автор поста оценил этот комментарий

А почему в функцию передаётся она же сама как аргумент?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

видимо ptr1 - указатель на базовый абстрактный класс (он не содержит ни данных, ни функций с имплементацией), потому с самого начала лежит указатель на vptr (таблицу виртуальных методов), что и является его же this. как автор комментария, на который я отвечал заметил, что это декомпилированный код это похоже на то как конструирует объекты msvc.

DELETED
Автор поста оценил этот комментарий

Вот из-за такой мозгоебли я этот язык и не изучал:)

раскрыть ветку (4)
5
Автор поста оценил этот комментарий

написать хуиту можно на любом языке. это видимо что-то связанное с самописными полиморфными классами (как раз вызов метода по двойному указателю похоже на какие-то таблицы виртуальных функций), но это далеко не то что люди видят каждый день)

раскрыть ветку (3)
2
Автор поста оценил этот комментарий

Так точно, в проге активно используется vt, и это код после декомпиляции, так что он полон таких свёрток

1
DELETED
Автор поста оценил этот комментарий
Я сейчас на дотнете говнокожу, студия с решарпером.

Во время дебага у меня расширение инлайнит значения переменных прямо в редактор.

При наведении кнопкой мышки на переменную, почти всегда я могу узнать все о вложенных классах/объектах на текущем бряке, через всплывающую подсказку. При нажатии f2 у меня переименовывается нужная переменная/класс во всём проекте. Каждая строчка кода, за некоторыми исключениями, предельно понятна и очевидна даже с бодуна.

И вот тот код, что выше - это просто адовый даунгрейд в плане удобства и комфорта, как в каменный век с палками-копалками спускаешься. Конкретные задачи ты может и решишь, но на каждом шагу подстерегает мозголомная магия, времени затратишь вагон. Если нужно поддерживать легаси (а очень часто это большинство работы программиста), чтение вот таких чужих исходников и попытки разобраться как это не сломать - это особенная форма извращения, на ценителя:)

Иллюстрация к комментарию
раскрыть ветку (1)
2
Автор поста оценил этот комментарий

ну, если не знать языка, то да не очевидно что это. если бы у ptr1 сразу был правильный тип, то запись была бы:
**ptr1(ptr1).
p.s. я этот код и распарсил с бодуна, ничего страшного я не вижу.

2
Автор поста оценил этот комментарий

Тут по-эльфийски, я не могу. Или кэп нужен

1
Автор поста оценил этот комментарий

А в конце сегфолт

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку