Алексей Ярков: но если ты одну функцию написать не можешь нормально, то о части программы и речи быть не может, а уж о всей программе - тем более. Так что всё начинается с малого.
Алексей Ярков: читай, копируй напрямую стиль, чтобы понять, прочувствовать его, зачем он такой. Потом будешь читать по программированию уже что-нибудь (без привязки к языкам, на псевдокоде). У тебя много таких ошибок алгоритмических, всё это из-за того, что ты взялся за код без теоретической подготовки. Такое можно делать только ради мотивирования себя на дальнейшее обучение (нужна мотивация, так как это нелёгкое дело - 25 часов в сутки надо кодить и стирать, кодить и стирать), но не для создания хороших программ. Для создания хороших программ нужно изучать парадигмы программирования, плюсы и минусы этих парадигм. Тоже немало всё это времени займёт. Но зато потом, когда ты будешь знать уже, программы сами будут получаться и, главное, будут делать что-то, что ты руками уже выполнить физически не сможешь, так как не хватит времени. Но чтобы написать такие программы, нужно уметь писать их части, а потом соединять эти части друг с другом. А потом ты будешь соединять такие программы друг с другом, получая программные пакеты или комплексы, которые уже много всяких сложных действий будут прокручивать. Там уже руками нереально выполнить это всё.
Если тебе надо что-то проверить, пиши функцию.
Если тебе надо что-то ввести, пиши функцию.
Если тебе надо что-то создать, пиши функцию.
Пока что у тебя всё навалено в кучу и при любой ошибке ты даже не знаешь, где искать её корни. Просто не читал ты K&R2, и это чувствуется, а потому и не знаешь хорошие практики, используемые при написании кода.
Можно ещё и специальный документ сформировать, который без всяких макросов просто проэксплуатирует дыру в самой программе. Но для этого надо знать дыры приложения - то есть быть специалистом по информационной безопасности и постоянно в этом ковыряться каждый день, отслеживая работу других специалистов, которые тоже их ищут.
CityCat4: так что не думай, что если ты макросы отключил, то ты в шоколаде :) Раньше была дыра такая в ворде, где просто в документе набираешь ряд символов и из-за этого он сразу вываливался с ошибкой access violation или что-то в этом роде.
Ты бы прочитал какую-нибудь нормальную книгу с точно правильным кодом и стандарт языка. Наугад в этом деле делать нечего, ты просто будешь всё время пропираться в чём-нибудь. А так как в нём многие вещи разрешены, то об ошибках ты даже не узнаешь, они просто будут вылазить постепенно в рабочей программе посреди её выполнения. C - это мощный инструмент и он работает точно, но это не значит, что его нельзя абсолютно неправильно применить.
Ну, в общем случае да, но обычно через множество typedef он приходит к int32
Тут догадки лучше не строить, а надо прочитать стандарт, там всё сказано. Поэтому ты можешь пропереться - написать программу, которая потом неправильно соберётся на каком-нибудь компе и ты даже не поймёшь этого. Только в процессе работы станет ясно, что что-то не так.
В данном случае ты не прав в том, что он четырёхбайтовый. По стандарту сказано, что int не может быть короче short int и не может быть длиннее long int - это всё, что известно про int. Никаких 32 бита там нет и я видел обычный int как на 16 бит, так и на 64 бита, но это тоже не крайние ограничения.
Rsa97: Эндианство не учитываешь. Где-то оно окажется таким, а где-то другим. Получится, что на одном компе программа будет правильно работать, а на другом - нет.
Алексей Ярков: всё, теперь засунь это в функцию. Потому что сегодня оно простенько выглядит, а завтра начнёт расти. Чтобы оно код не запутало, оно должно расти в своей личной функции.
sim3x: я не понял, что ему надо, поэтому как бы десять кодов ему писать, а потом выяснить, что они все неправильные, как-то не хочется.
Зайди сюда, там можно подучиться правильной рекурсии.
Если же исправлять твой код вот этот с созданием среза (будем считать, что мы знаем, что пишем ему). Ну, во-первых, рекурсия в питоне ограничена через лимит
>>> sys.getrecursionlimit()
1000
>>>
то есть это, считай, в функцию должны подаваться уже только короткие строки или же надо лезть в настройки рекурсии, что обычно не делают. А во-вторых, если и делать рекурсию, то она должна принимать текущий индекс в строке и просто его менять, а он много не жрёт, потому что это просто число одно. Если же полностью переделывать твой код, то это нужно сделать обычный цикл, тогда он не будет память жрать и не будет ограничен короткими строкам (то есть любые можно будет подавать).
Алексей Ярков: а, ты не можешь функцию декремента даты написать. Ясно. Если можешь, пиши, если не можешь, я могу тебе написать. Могу и подсказать просто, если тебе самому интересно написать. Всё-таки, лучше самому развиваться.
sim3x: считай, что он есть в будущем и твой код выполняется на нём. Он и даже не в плане рекурсии затратен. Можно просто представить, что эта строка будет на сотню мегабайт и что? ты будешь на каждом шаге генерить ещё сотню мегабайт. И так у тебя просто программа съест оперативку и система начнёт юзать свап, а это всё очень тормозное.
Алексей Ярков: пиши всё на функциях, тогда когда что-то надо будет поменять, ты не будешь весь свой код выбрасывать, а будешь переписывать лишь маленькую функцию какую-нибудь. Причём этих функций может быть сотня, но при этом они все будут понятны и легко меняемы и заменяемы.
MiiNiPaa: так это стандарт такой. Главное, чтобы стандарт был точно определён. А это всё, что нужно точно, можно сделать другим способом. А вот %c отлавливает. Да там много нюансов, но всё можно отследить в точности.
Alex Solomaha: короче, смотри, все эти хакеры ищут это всё первым делом, причём не руками, а программами - то есть это всё очень быстро и легко делается. А то мне как-то один заявил "да кто будет иконку вордовского документа вшивать в программу, это же так сложно и долго", он просто реально не знал, что есть программы, в которых всё это делается за секунду, так как он этим не занимался никогда.
Это не хвостовая рекурсия, если что. При хвостовой рекурсии все фреймы вызовов имеют постоянный размер в памяти. Таким образом компилятор может оптимизировать их, переписывая их поверх друг друга. А тут на каждом якобы хвостовом вызове генерится новая строка.