С++ и муки проникновения
Всем известно, что дехканину доступны три пути: вебкам, закладки и айти.
Давненько подумывал о том, чтобы сбросить задницу с дивана и попробовать последний вариант, но все как-то было недосуг.
Интереса ради, решил хотя бы составить хотя бы первичное приблизительное представление о таком всем известном монстре, как С++, и для начала рискнул перевести на него имеющийся мини-проект пазлов, реализованный в старом добром Дельфи.
Выбрал естественно эмбаркадеровскую IDE, благо она процентов на 99 идентична их же дельфийской. Соответственно оказалось достаточно просто скопировать форму со всей мешаниной контролов на ней, и вставить в новый проект, не прибегая к утомительному растаскиванию кнопок и других компонентов.
Неделя страданий и вуаля:
Имею два идентичных ехешника разного размера, скачать которые можно по ссылкам:
С++ вариант:
https://mega.nz/file/ZEEzGLJQ#3htC3RMzhlbw0-xS9DZ0SwtyqPOhXV...
Delphi:
https://mega.nz/file/RVl1wKQI#frhBOl5nGsrT_dVGbPYM3e7dOg4rMp...
Каких-то особых отличий в эффективности и скорости и не заметил. По-моему вариант на Delphi более стабилен и работает чуть быстрее. С другой стороны С++ вариант весит меньше, но не критично.
Осталось еще попробовать зафигачить алгоритм на Яве, чтобы сделать браузерный вариант игры.
Сам перевод с одного языка не оказался прям уж сложным, но в паре мест, пришлось даже обратиться за помощью к старшим товарищам, которые сходу стали предлагать многокилометровые варианты решений.
Ну и собственно немного размышлений на тему.
Первое впечатление - C++ это неудобный и отвратительный язык, непонятно зачем существующий. Он не является достаточно низкоуровневым, и при этом неудобен для конечного пользователя.
При переводе с обычного Паскаля на си, возникло множество явных трудностей, начиная с невозможности напрямую обращаться ко многим используемым в библиотеках объектах, и заканчивая идиотским компилятором (ну это скорее вопросы к Эмбаркадеро), который запросто пропускает недостачу знака "=" в результате чего алгоритм начинает работать просто непредсказуемым образом.
Что выбесило:
Опять же, невозможность использовать многие нужные классы и методы напрямую, только через указатели, причем опытные сиплюсплюисты рекомендовали использовать умные указатели, из-за которых код начинает превращаться в какой-то маловразумительный гипертекст
Отсутствие динамических массивов - не, ну так-то по факту они есть, но объявляются опосредованно, по типу:
int a[lenght]; где lenght требуемая длина из переменной, но по факту это все то же самое статическое объявление в процедуре, поскольку не зная конкретно значение, объявить массив глобальным, доступным для других процедур не получится. Для Дельфи - это вообще не проблема. Можно объявлять когда угодно и где угодно.
Исключение векторы - но с ними опять же заметно усложняются самые простые вещи.
Массив, тем более многомерный, вообще является одним из основных элементов любого языка, поскольку на практике приходится их часто использовать в самых разных задачах.
Такое отношение к нему считаю недопустимым.
Далее циклы:
Тот же for по сути является все тем же while, для которого просто вынесена в заголовок операция изменения условия (счетчика цикла).
Цикл от нуля до десяти:
for (i==0;i<=10;++i) {}
это все то же самое
while (i<=10) с заранее заданным значением i, у которого операция со счетчиком осуществляется внутри тела.
Отвратительное сравнение ==. Я потратил почти целый день, не понимая почему программа вдруг стала вести себя непредсказуемым образом. Оказалось, пропустил одно "=" в условии.
Смешение типов. То, что является вполне себе реализуемым в других языках, здесь превращается в пляски с бубном.
Если разделить целое i на вещественное j, есть шанс получить округленное значение (в моем случае до нуля). Приходится сначала приводить целое к вещественному типу, а только потом уже делить его.
Отвратительный синтаксис. Как же осточертело вместо точек рисовать стрелочки. Тем более, что для некоторых объектов нужно все-таки использовать точки. Это невозможно понять, это нужно запомнить. Вообще в этом языке отсутствует логика. Если в Дельфи ты точно знаешь, как работать с методами, то тут возможны варианты - в некоторых случаях так, в других этак, в третьих вообще никак, ну или через дядю Васю из соседней деревни.
А еще повсюду указатели, указатели на указатели, указатели указателей, разыменование указателей с указанием разыменованного указателя, указание разыменования с указанием указателя на указатель и так до бесконечности...
Короче, С++, давай до свидания. Чувствую не выйдет из меня айтишника. Уже подумываю о покупке вебки.