Чувак, бери C++ и не парься.
Аргументы:
1. C++ может дать понимание сразу о двух концах: высокий уровень и низкий уровень программирования. Так как этот язык является некой солянкой из того, что есть в классическом C, и более современных, "высоких" языках программирования.
2. Со знанием С++ перейти к C# не составит особой проблемы. Языки очень близки в плане синтаксиса и подхода в целом. Про переход с C++ на C# для unity говорю на своём личном опыте.
event
Спасибо, но я уже выбрал свой, возможно более тупой, путь, поэтому ты опоздал. Но всё равно спасибо, так как вы тут все приводите аргументы в пользу какого-либо варианта без тупого "мой варик лучше и точка". :з
Der FlugSimulator
> Так если нет памяти, то тем более нужно линукс ставить.
А гайды ?
Ты ведь представляешь объём изучения линукса после винды ? Это пипец.
Лучше сначала выучить ЯП что бы можно было читать исходники линукса потому что в гайдах по линуксу нифига нет нужного, а есть только поверхностная инфа в которой не объясняют как это всё устроено, т.е. они показывают простыню с терминальными командами но не объясняют как это работает под капотом.
Соответственно с гайдами по gamedev могут возникнуть ещё большие траблы.
event
> Языки очень близки в плане подхода в целом
яб не был бы настолько катигоричен
skalogryz
> + Показать
прикалываешься? Её ещё найти нужно было. А документацию искать не надо было + примеры все были, не надо было и английский знать.
Самый трушный путь: Basic/Pascal -> ASM -> C -> C++ -> C#
В 15-16 лет лучше учить C, с рассчетом сдать ЕГЭ по информатике именно на нем. И по результатам попробовать пройти в вуз посильнее в Мск или Питере.
Игроделом может и не станешь, а вот получить денежную должность шанс выше точно станет. Правда ChatGpt может за 5-7 лет всё изменить.
Zoobastik
Я не за деньгами -_-
gamedevfor
> Самый трушный путь
Мой начинался с асма (правда не для PC-совместимых компов, а для радиолюбительских), что в дальнейшем позволяло сразу понимать, что находится за кулисами всяких массивов/указателей/строк в Си, и не путаться с тем, что получится в результате sizeof в том или ином случае.
Yonfain, у тебя путаница с переменной nickname. В одном случае это у тебя массив длиной 10 байт (sizeof к нему дал бы 10), а в другом случае - указатель на char (его sizeof зависит от разрядности проца/программы, поскольку это всего лишь размер переменной, содержащей адрес). Поэтому у тебя и "сокращается" в функции hello, поскольку в ней nickname это лишь указатель, его sizeof - это лишь размер указателя, а не исходного массива nickname из функции main (хотя этот указатель и указывает на ту область памяти, которую использует массив nickname в main).
Тебе надо либо явно передавать размер массива в функцию hello, либо завести глобальную константу для длины массива под ник.
Вообще с массивами в Си надо быть очень осторожным, т.к. во многих случаях массивы рассматриваются как просто указатель, и, соответственно, компилятор ничего не знает о размере массива, например, позволяя индексировать массив за его пределами (что легко может привести к очень трудно обнаруживаемой ошибке из-за порчи других переменных и легко создать "дырку" для различных хакеров). И к тому же массивы, выделенные внутри функций, нельзя возвращать как результат функции (хотя компилятор позволяет вернуть его как указатель, но память по этому указателю станет невалидной, как только завершится функция).
В Си++ с массивами ситуация не намного лучше, просто в Си++ сырые массивы использовать очень не рекомендуется - там вместо этого есть различные варианты (для массивов фиксированного размера, для массивов переменного размера)
Dmitry_Milk
Ага, понятно, а это уже для меня удивительно. Я так понял, что массивы в C/C++ это такая штука, что с ней, если неправильно воспользоваться, можно угодить в яму, да? А учиться, как ими пользоваться, трудно, так как там нужен большой контроль и внимательность. Надеюсь правильно всё понял. •-•
Dmitry_Milk
> Мой начинался с асма
Это слишком экстремально, сначала нужно хотя бы увидеть как выглядят основные конcтрукции языка, освоить так сказать процедурное программирование на Basic/Pascal без ООП.
А в ASM-e все эти jmp, jnz сходу хорошему не научат.
Yonfain
> Я так понял, что массивы в C/C++ это такая штука, что с ней, если неправильно
> воспользоваться, можно угодить в яму, да?
В С++ можно (и даже нужно) не пользоваться т.н. сырыми массивами, указателями, итд. Есть соответствующие абстракции для любых типов данных. Совсем уж низкий уровень нужен, когда программа пишется под ограниченные ресурсы, типа микроконтроллеров.
Yonfain
> А учиться, как ими пользоваться, трудно, так как там нужен большой контроль и
> внимательность. Надеюсь правильно всё понял. •-•
Нет, не трудно, достаточно внимательно прочитать книжку "Язык программирования Си", авторы Брайан Керниган, Деннис Ритчи. Ну и немного самодисциплины, типа выделил память, сразу напиши парный вызов её освобождения (это снимает 98% проблем с управлением памятью).
gamedevfor
> Это слишком экстремально
Ничуть, мне оказалось достаточным понять, как делается цикл (условный переход назад), чтоб дальше понять, что так (в совокупности с альтернативными переходами вперед) можно сделать что угодно.
gamedevfor
> А в ASM-e все эти jmp, jnz сходу хорошему не научат
Третьим (после второго бейсика) был Паскаль, циркулем мозг под структурное программирование форматировать не пришлось (а бейсик был старый, на номерах строк, так что там было ближе к тому, как на асме).
Yonfain
> Я так понял, что массивы в C/C++ это такая штука, что с ней, если неправильно
> воспользоваться, можно угодить в яму, да?
Проблемы с массивами вообще из-за того, что фактически в компьютерах нет ни массивов, ни строк - есть только отдельные числа и адресуемая память. Массивы и строки делаются просто путем расположения данных подряд в памяти. Разные языки эту реализацию массивов и строк делают по-разному:
- ассемблер/маш.коды - вообще никак не реализуют, программист сам должен думать, где и сколько он зарезервировал памяти под массив или строку.
- Си - умеет автоматически выделять память под константные строки и массивы неизменяемого размера, в большинстве случае оперируя просто указателем на выделенный кусок памяти. Для изменяемых строк и массивов переменного размера - программист должен вручную выделять (и не забывать потом освобождать) в куче с помощью malloc/free.
Никак не предотвращает от возможности обратиться за пределы массива/строки.
- Си++ - в дополнение к Си имеет механизм классов и библиотечные конструкции, которые позволяют в большинстве случаев не думать о выделении/освобождении памяти (хотя она и происходит), а вручную работать с выделением/освобождением памяти хоть и возможно, но не рекомендуется. В библиотечных конструкциях умеет предотвращать обращение за пределы массива/строки (естественно, ценой проверки во время исполнения). Но в общем случае возможность ошибиться и обратиться к неверной памяти остается.
- С#/Java и прочие подобные языки со сборкой мусора - позволяют не думать об освобождении памяти и практически полностью предотвращают возможность обратиться к неверной памяти, но за это приходится платить заметным снижением производительности
- Rust - также позволяет не думать об освобождении памяти, но использует не сборку мусора, а учет владения/заимствования во время компиляции. Работает шустрее языков со сборкой мусора, но при программировании приходится сильно изворачиваться, чтоб не нарушать требования владения/заимствования.
Dmitry_Milk
0iStalker
Сегодня значит у меня выходной в программировании - мозг начинает уже кипеть. Спасибо за объяснение!
Yonfain
> чтобы лишь научиться программировать
выбрось Си.
бери
С++ и библиотеку SFML(библа очень проста и за счет этого мощна)
что в итоге можно получить:
https://sfmlprojects.org/games
80% того что есть в языке С++ можно не юзать,
а значит можно и не знать.
а раз можно и не знать, то можно и не учить.
как узнать что можно не учить?
для этого нужно начать сразу делать игру.
шарп хорош, но несовместимости версий языка могут на этапе обучения
(по чужим разным сырцам) зачпокать моски...
Тема в архиве.
Тема закрыта.