24 декабря Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!
Второй тред, посвященный прародителю всех С-подобных языков и по совместительству единственным идеальным и всесторонне годным средством программирования как на системном, так и на прикладном уровне.
>>579550 (OP) Доброго времени суток, помогач, надеюсь ты достаточно ночной.
Суть такова - потихоньку учусь основам C (привожу в порядок институтские знания) и гляжу в сторону открытого ПО. Решил поизучать чужие исходники, и взял самое простое, что только смог придумать - утилиту yes.
Склонировал репозиторий с Savannah, открыл и офигел от непонимания. Спрашиваю советов мудрых.
59main (int argc, char argv) Во всех учебниках я видел *argv[] вместо argv. Второй вариант это синтаксический сахар? Или это указатель-на-указатель, но почему?
66set_program_name (argv[0]); ЗАЧЕМ? Они же в самом начале написали #define PROGRAM_NAME = "yes"
Дальше вообще пошла какая-то свистопляска с буферами (!?) и т.д. Я, конечно, попиздовал учить основы UNIX, ибо там найду многие ответы, но я совершенно не понимаю для чего так накручивать было, неужели нельзя корочи и понятнее для мимодилов?
>>580127 char argv и char* argv[] это одно и тоже. Двумерный динамический массив - это массив из указателей на указатели. Сначала ты выделяешь память на массив из указателей на указатели, и это будет твоим числом строк, затем ты идёшь по этим строкам и запихиваешь в них твои динамические массивы, которые и будут этими строками, а их длины будут кол-вом столбцов.
>>580127 >эти переносы Ядро-то Маяковский писал, не иначе.
59: при передаче в функцию массив преобразуется к указателю на тип элементов массива в крестах это называется std::decay, поэтому разницы между такими записями в данном случае нет.
66: это разные вещи. Если я не ошибаюсь, это какая-то системная функция, которая вызывается для порядка, чтобы обеспечить корректное окружение для программы.
Вообще, большая часть этого кода потому и присутствует как ритуалы, направленные на выполнение многочисленных соглашений, которым должны следовать утилиты.
>>580127 > set_program_name (argv[0]); ЗАЧЕМ? > Они же в самом начале написали > #define PROGRAM_NAME = "yes" В дефайне "официальное" имя приложения. А вот если ты сделаешь симлинк oui для yes, это имя попадет в argv[0], и будет использоваться в usage() глобальная переменная program_name (или это макрос?) вроде оно и где-то там еще, чтобы юзер не охуел, как это, он запускал oui, а ему предлагают yes вызывать.
Буду искать для анализа какой-нибудь проект не так замороченный на конвенции.
Кстати, посоветуйте дебилу какую-нибудь хорошую книжку по документированию программного обеспечения (как правильно оставлять комментарии, как написать простенький man), можно на английском.
пишешь исходный код функций, компилишь его в обжект файл, пакуешь в формат либы, кладешь в директорию поиска какого хуя тебе еще требуется ? гайд как написать полезную и нужную либу что ли ?
>>585345 Нет, просто как в формат либы запаковать не знаю. Содержимое либы я в целом напридумывал (она мне для личного пользования все-равно нужна, да и в целях обучения). Разве что один вопрос: внутри либы нужно подключать другие нужные для неё либы?
>>585355 >формат динамической либы указывается в опциях компилятора ой ни пизди, динаму нуно подгружать хитровыебонами в коде, статика впердоливаеца в архив по желанию, можно и не архивить
В общем у меня вопрос уровня просто интересно. Пускай есть 2 интовые переменные, которые имеют максимально допустимое значение для интовых переменных, берем их, складываем и через указатель запихиваем в память. Что произойдет? 1) Нихуя, вернет ошибку переполнения еще на моменте складывания 2) Нихуя, вернет ошибку на моменте попытки запихнуть в память 3) Запихнет в память первую половину разрядов 2 представления нового числа 4) Запихнет в память вторую половину разрядов 2 представления нового числа Честно говоря склоняюсь к первому, но все же
Вот теперь я официально нихуя не понел. Как это вообще работает? Вайл вообще не разу не сработает, т.к. уже после первой итерации s!=-128, в итоге она прекращает выполнение только из-за того, что чар тупо заканчивается на 127 что ли?
>>585602 Вообще undefined behavior, но обычно ещё на этапе сложения у тебя результат должен поместится в int и поэтому старшие биты, не влезающие в int просто отбросятся. https://ideone.com/NVLaHx
Пытались ли создать в Си аналог крестовой STL? Чтобы не городить каждый раз велосипед для распространенных структур данных. Алсо, были ли попытки реализовать обобщенное программирование до C11?
>>586685 Майкрософтовские говнофункции не нужны, они создают больше проблем, чем решают. Алсо, они стали необязательными в C11, т.е., их использование - это еще и геморрой с переносимостью ко всему прочему. А >>586492 лучше использовать fgets(..., stdin), в которую можно передать лимит.
>>586950 Но зачем, если в никсах fgets получит UTF-8, в винде ввод UTF-8 тоже когда-нибудь обязательно починят, а как хранить внутреннее представление, я сам решу, в зависимости от задачи.
>>586926 >Майкрософтовские говнофункции не нужны ну что за чушь в стандартная библиотека си открывались со временем почти все проблемы, что случаются с устаревающими библиотеками - а именно безопасность некоторых функций ввода-вывода, неприспособленность некоторых функций (сохраняющих глобальное состояние) к многопоточному программированию, приходилось делать переход от 8- 16 - 32 - 64 разрядности, делать переход от анси к юникоду, также была парочка концептуально неправильных функций (например, возвращающих результат работы через return) и в юникс окружении (линукс) и в майкрософт поступили правильно - вместо того, чтобы резать на корню, попытались по максимуму сохранить совместимость, иногда поэтому приходилось добавлять замещающие-расширяющие функции, добавлять предупреждения и анализы небезопасных и устаревших функций в компиляторы, либо решать эти проблемы на уровне рантайма языка и системных библиотек (например, tls в винде)
>>585808 >попытки реализовать обобщенное программирование что значит попытки? тут два способа - первый, это ты запиливаешь на макросах, плюс - получаешь type safety, но проблемы с отладкой второй - запиливаешь на void*, плюс - нет проблем с отладчиками, минут - выключенная type safety с другой стороны, никто не мешает импользовать шаблоны, но писать в олдскульном си-стиле, по большей то части - шаблоны, это самое охуенное что в крестах запилил
>>587226 Проблемы с безопасностью стандартных функций действительно имеются, но решение от Microsoft - худшее из возможных. Одного constraint handler достаточно, чтобы от этого говна отказаться.
>>587217 > второй параметр указывает количество символов Байтов. Да, строка в UTF-8 может обрезаться посреди символа, так же как ввод может просто не влезть в буфер. Все об этом знают.
>>587292 Там жопой написано, читай раздел полностью. Но суть в том, что getc читает один char, даже если он является только частью mbcs-символа. Соответственно, и в fgets речь идет о количестве char в массиве, а не о символах, которые code point и которые в UTF-8 могут состоять из нескольких байтов.
>>587534 Насколько я знаю, большинство функций ввода/вывода используют ferror, так что использование возвращаемого значения для чего-нибудь еще вполне оправдана.
>>587587 >1. Что я должен ей подавать на вход в качестве второго аргумента? Указатель на функцию, которая принимает указатель в качестве аргумента. >2. Еще бы подробно понять что вообще она делает и как Вызывает функцию для каждого элемента массива, находящегося в структуре cpArray.
>>587540 google: ISO/IEC 9899:2011, Annex K, алсо можно по TR 24731-1 гуглить. constraint handler - функция, которую предлагается вызывать в рантайме, когда _s-функция считает, что все плохо подумай, как весело обрабатывать такое в библиотечном коде. _s-функции в стандарт пропихнула потому что могла Microsoft и до сих пор активно спамит угрозами при компиляции кода, который их не использует.
>>587534 > код ошибки/код успешного завершения должен возвращать Есть "переменная" errno, ее достаточно для кодов ошибок (на самом деле она макрос с незапамятных времен, что решает возможные проблемы с многопоточностью). А функции должны возвращать вменяемые результаты.
>>587721 Написано. Но прочитай также и про shift state. Алсо \n в mbcs встретится только в виде себя самого, но никак не в виде части mbcs-символа. Например, в UTF-8 все continuation bytes >= 0x80. Поэтому проблемы тут нет.
>>587922 Да. И эта альтернатива - использовать 3rd party либы или писать свои либы под крупные проекты. Брат жив, зависимость есть, Microsoft не нужен.
Планирую пилить небольшие игори для собственного развлечения, учу питон, нравится, получается, имеет смысл повозиться с сишкой и где она может пригодиться? Или возможно лучше обмазаться крестами?
>>589547 Вангую, она юзает WinApi для доступа к памяти другого процесса. Тем более это виртуальная память, не имеющая ничего общего с реальной адресацией.
>>589542 ОС какбе говорит тебе, что по адресу 0 памяти нет есть способы смапить, но по умолчанию некоторый кусок адресного пространства от 0 и выше не мапится, чтобы ловить нулевые указатели. В винде используй VirtualQuery(Ex), чтобы узнать, на какие регионы адресного пространства смаплена память, а какие из них пустые. Можешь также взять утилитку vmmap от sysinternals для наглядности.
>>589616 Да, ты прав. Объектный файл содержит определенные (defined, public) символы и не определенные (undefined, extern) символы. Символ - это имя, технические данные и какая-то сущность - переменная (кусок памяти в сегменте данных) или код (функция). Линкер (редактор связей) связывает extern с public. В исполняемом файле выполнено статическое связывание, а динамическое (для разделяемых библиотек) делает загрузчик при запуске. Алсо, в объектниках тоже все разрулено по сегментам, причем сегментов может быть намного больше. Некоторые служебные, и не попадают в бинарник, некоторые схлапываются в один сегмент.
>>589616 Чтобы все самому заценить можешь заюзать утилитку dumpbin.exe с вижуал студио (с параметрами /ALL /OUT:"D:/hui.txt" "полный путь к файлу обьектов" )
Что это за ? Указатель на указатель что ли? Портирую одну С библиотеку на язык PureBasic, но в нем нет такой штуки с двойным , так что я просто заменил на , но это привело к ошибке доступа к памяти при обращении к этому полю структуры.
>>590086 Ну вот, в cpArray максимальное количество элементов в arr, текущее количество элементов, и сам arr, который по сути void ∗arr[max], в котором хоранятся указатели на объекты. При такой структуре указатель на массив не изменяется при изменении размера массива.
Суток времени доброго. Программач, хочу вкатиться в iOS разработку, но опыта нет никакого в программировании вообще. Собственно хотелось бы начать с Си, да алгоритмами заняться. И что выбрать в таком случае гумманитарию (ну или просто лентяю, который пропинал балду на уроках математики)?
>>590233 Бозарю С это не тот язык который потерпит чью-то лень. Если не хочешь задротствовать по-хардкору лучше сразу иди на какое-то обьектное говнецо типа Сишарпа. А математика это такое, достаточно основ (все равно же в играх будешь в основном готовые движки/решения использовать и т.д, а не писать свои с 0)
>>590428 Двачую. Си - самый простой язык после ассемблера, если не считать undefined behavior вот для развития способности учитывать undefined behavior нужо время.
>>590518 Ты не прав. Например, я отлично знаю, что случится на x86, если переполнить знаковый int. Я знаю, что могу скастить на x86 указатель на int к указателю на short, и я знаю, что по нему прочитается. Но стандарт не ограничивается x86, он объединяет множество частично несовместимых архитектур. Например, на машине с big endian я по вышеупомянутому указателю на short прочитаю не то, на что расчитываю. Все, для чего нельзя задать разумное консистентное поведение - undefined (или иногда unspecified) behavior. Вторая причина наличия UB - простор для оптимизаций - если ввести правила, чтобы какой-нибудь ++i + i++ имел смысл, компилятор потеряет множество возможностей для выбора оптимального порядка вычисления выражений и т. д.
Компиляторы, особенно какой-нибудь GCC, по-максимуму используют UBдля порчи рабочего кода, и чтобы не спотыкаться об это постоянно, нужен опыт. А сам язык, повторюсь, очень простой и логичный.
>>590566 objdump, readelf, pmap если у тебя линуксы.
>>590575 >Я знаю, что могу скастить на x86 указатель на int к указателю на short и соснуть из-за нарушения strict aliasing rule когда компилятор соптимизирует все чтения из указателя на int потому что посчитает что указатель на short с ним не пересекается.
Я вот даже в душе не ебу, что такое strict aliasing, где вы блядь это находите? Даже не поленился и погуглил: int a = 0x12345678; short \b = (short \)&a; Это оно? Что афтар-еблан ожидает получить укорачивая адрес до short? А если на моем пылесосе размер short == int?Звезда в шоке.
>>590611 Я-то буду знать, но моя программа более переносимой от этого не станет. Я не могу знать все про все возможные архитектуры. Сишечка с его UB как раз и определяет "безопасный" способ писать переносимые программы за счет потери некоторой части свободы.
>>590610 Ну все не так просто. Допустим, у тебя два указателя на short и int (а лучше int16_t и int32_t соответственно), которые указывают на одну и ту же область памяти. Ну например ты со звуком работаешь, и тебе удобно иногда брать и обрабатывать оба канала (два short) в виде одного числа. Пример притянут за уши, ну да и похуй.. В ходе обработки ты пишешь и читаешь по обоим указателям. Со striсt аliаsing компилятор может иногда откладывать запись до следующего чтения (или решить вообще не писать даже, если потом значение затрется чем-то еще), и если ты прочитаешь по другому указателю после того, как записал, ты будешь долго и мучительно искать баг. К счастью, в gcc есть -fnо-striсt-aliаsing, который рекомендуется к использованию всеми, кому нужно обрабатывать бинарные данные сложной структуры сложнее, чем пример со звуком без НEОЖИДАННОСТЕЙ. К сожалению, это ограничивает компилятор в оптимизациях. Многие не готовы терять возможность байтoeбли в обмен на полпроцента скорости, поэтому пользуются -fnо-striсt-aliаsing и явным rеstriсt из C99, чтобы сказать компилятору, что указатели не пересекаются (у нас в первом тредике про rеstriсt дискуссия была, поищи).
>>590610 >Что афтар-еблан ожидает получить укорачивая адрес до short?
Не адрес. Афтар-еблaн знает, что в х86 little-endian, и 0x1234 5678 хранится как 78 56 34 12. Афтар-еблaн читает нижние 16 бит по бэ[0] и получает 0х5678, читает верхние 16 бит по бэ[1] и получает 0х1234.
"в сообщении присутствует слово из спам-листа". Ебучая макаба.
>>590614 Два указателя на одну область памяти и какие тут проблемы? Т.е. последовательность чтения/записи в эту память зависит от параметров оптимизации? Это проблема компилятора, я считаю.
>>590670 > Это проблема компилятора, я считаю. А вот авторы стандарта языка считают иначе и разрешили компилятору поступать так в некоторых случаях. Тебе выше написали, гугли C strict aliasing rules.
>>590735 > разрешили или обязали Программистов обязали, компиляторам разрешили считать, что код следует правилам.
> нехуево добывать к си классы Я бы от плюсового наследования структур не отказался, например, но с анонимными структурами из C11 уже более-менее ок.
>>590718 > как учить Как и любой другой язык. Берешь любой учебник (K&R, например), читаешь и пишешь код до просветления. Для понимания указателей, рисуешь содержимое памяти на бумажке, если не можешь представить мысленно, затем закрепляешь понимание просмотром памяти в отладчике.
>>590616 Я с утреца понял в чем проблема и почему я подобное не встречал. Объявить структуру u32, в ней два поля l,h u16 ну можно и еще однин юнион на 32, затем эту структуру накинуть на искомый адрес, только вот зачем делать через жопу как в примере, непонятно.
Во-первых, через union тоже UB (разработчики стандарта перестраховались по поводу выравниваний и представления значений). Во-вторых, попробуй пропарсить какой-нибудь сложный формат файла, и ты охуеешь от количества требующихся union при таком подходе.
>>590918 а как ему сказать о символах в сгенерированном коде? всмысле который в mmap-нутую память в рантайме написан. >>590920 у меня на vtune денег нет.
>>591236 Бля, скомпилируй и проверь. Компилятор будет ругаться, если у тебя поебень с типами.
Это блядь уже, очевидно, что будет ругань >current_word = abs_word; т.к. разные типы >int8_t current_word; >int8_t abs_word[]
А здесь ты получаешь ссылку на элемент массива >current_letter = ¤t_word[0]; Я не знаю, является ли это "содержимым буквы", лол. Честно сказать, я не понял, что ты хочешь получить.
Бля, скомпилируй и проверь. Компилятор будет ругаться, если у тебя поебень с типами.
Это блядь уже, очевидно, что будет ругань [CODE]current_word = abs_word;[/CODE] т.к. разные типы [CODE]int8_t current_word; int8_t abs_word[] [/CODE]
А здесь ты получаешь ссылку на элемент массива [CODE]current_letter = ¤t_word[0];[/CODE] Я не знаю, является ли это "содержимым буквы", лол. Честно сказать, я не понял, что ты хочешь получить.[/CODE]
>>591236 У тебя там не няшная, т.к. в няшной все объявления переменных должны быть в начале. А если записать, как у меня на пикче, то будет сишка. >//Ссылка на этот многомерный массив. Верно ли?? >int8_t \current_word; >current_word = abs_word; Нет, надо две звёздочки int8_t \\current_word. >//Получение содержимого буквы. Верно ли? >int8_t \current_letter = ¤t_word[0]; Тут у тебя получение адреса массива o_letter, а содержимое (первый элемент) получается строчкой ниже >int8_t current_sign = current_letter[0];
>>591245 >не слишком перегруженное, но интересное Сейчас не получится что-то интересное. Если не перегруженное, попробуй чтение текстового файла с диска и вывод его в консоль. Потом можешь усложнить, разбив на отдельные слова. Далее, отсортируй слова в алфавитном порядке по убыванию.
>>591025 Перловый pack я очень уважаю, но писать нормальное решение, а не одноразовый скрипт на перле я бы не стал.
>>591222 Ben Klemens, 21st Century C Stephen G. Kochan, Programming in C На почитать сгодятся, но я бы не сказал, чтобы они оче годные были.
>>591327 > в няшной все объявления переменных должны быть в начале Ты как-то медленно размораживаешься. Прошло уже 16 лет с тех пор, как можно объявлять переменные там, где тебе нужно, а не там, где было бы удобнее компилятору. Алсо, *∗ - выбирай любую. int test = testtest
Короче надоело искать направление, решил просто базово вкатиться в программирование изучая фундамент. В общем в дальнейшем либо уеду в бэкэнд, либо в мобайл, либо во фронт. Вопросто только в том, что кроме самого Си и алгоритмов мне можно выучить, чтобы это было полезн в мобайле или вебе (допустим мне на данном этапе нафиг не надо знать, как устроен процессор или как устроена память (точнее больше, чем будет написанно в книгах по си))?
>>591394 В VS 2015 "почти" C11 (официально не поддерживается, но фактически проблемы только с некоторыми библиотечными функциями - если что, я не с дивана, у нас проект на C11, и уже год как сборка под VS рабочая и почти без костылей). Что касается деклараций переменных в любом месте функции то они, как и однострочные комментарии, были уже очень давно.
>>591404 У меня древняя VS2005, однострочные комментарии поддерживает, а объявления нет. Тем не менее, gcc вполне поддерживает этот стандарт, т.к. мне пришлось править все объявления, чтобы скомпилировать тот проект в VS.
>>591393 >Вопросто только в том, что кроме самого Си и алгоритмов мне можно выучить, чтобы это было полезн в мобайле или вебе Чтобы быть полезным в мобайле и вебе, тебе не нужно учить ни Си, ни алгоритмы. Это я тебе заявляю как бывший веб-разработчик (Perl, PHP, JS) с опытом работы около 7 лет.
>>591245 > А что написать для практики? Чтобы не слишком перегруженное, но интересное? Например начни писать то что писал бы если бы уже знал язык. А осиливать будешь по ходу. Так у тебя точно будет максимальная мотивация, а это гарантирует успешное изучение.
Задам платиновый вопрос, наверное. Что сейчас с заработками у кодеров на Си? Например, на Java/C#/C++ более-менее обучаемая макака может довольно быстро начать получать 100к+. Некоторые знакомые Java-кодеры загребают чуть ли не по 300к в JetBrains. Няшная позволяет примерно похожие деньги зарабатывать?
Сап, программач, помоги ньюфагу с одной задачкой. На пике 1 формула полинома Тейлора для вычисления логарифма числа, на пике 2 моя имплементация этой формулы. Где-то тут ошибка, так как результаты выдает слишком уж отклоненные от реальных. Где? Целый день понять не могу. С меня как обычно нихуя.
>>591567 > ) { Вот в чём удобство такой записи? > i ∗ 1.0 (double)i Но, т.к. там уже X double, то и этого не требуется. >s += t Но там же надо вычитать. А где возведение в степень?
>>591417 На дворе был 2012 год. В Microsoft обратили внимание, что их стандарт C99 несколько отличается от принятого стандарта C99 и поправили свою реализацию. Спустя каких-то 13 лет.
>>591567 Дополню, что в рядах с быстрым убыванием члена, при заранее известной границе суммирования(как у тебя) лучше инвестировать сумму - скрадывать от меньшего к большему.
>>591645 Сука, хуле ты такой трудный. Тот же HTTP, AJAX, WebSocket, пресловутый MVC паттерн, JS (без него никуда в вебе). Попробуй настроить Web-сервер (например, Apache, Nginx), субд (наприме, MySQL). И, собственно, определись с языком, на котором хочешь писать.
>>591589 >Вот в чём удобство такой записи? мне, как джависту, такое гораздо удобнее и привычнее, чем все эти пердолинги с нижними подчеркиваниями и скобками на новой строке.
>>591678 Ляль, верблюдребство тоже нинужно, хотя в ООП поеботе смотрица норм. Вот простой пример, есть переменная age, нужно вьебенить например еще парочку, minAge и averageAge так вот Age нихуя не равен age, префиксы вводят в замешательство, логичнее ageMax, ageAvarage, а с max_age и avarage_age все збс.
>>591663 Какие ещё подчёркивания? if (...) { ...... } else if (...) { ....... ....... } else { ...... ...... }
Вот зачем так некоторые пишут? Всё сливается, визуально не отличишь, где заканчиватеся один блок данных и начинается другой. Или место экономят?
if (...) { } else if (...) { } else { } Мне так вот больше нравится. Может быть, есть какой-то толк, объясните, кто ту запись использует.
Или вот ещё: if (...) ......... Без фигурных скобок. Понятно, что следующий оператор после if можно не заключать в скобки, а с ними получается громоздко. Но визуально отделяется if.
>>591788 Если про стиль именования переменных еще можно поспорить, то вот скобки - это 100% вкусовщина. Возьми astyle или аналог и переформатируй под себя, если у тебя ВИЗУАЛЬНЫЕ ПРОБЛЕМЫ. Можешь даже IDE настроить, чтобы автоматически все форматировалось.
>>591636 Сегодня посмотрел hh, для чистого С вакансий нет почти в ДС-2. Либо требования какие-то ебанутые. Для жаба/c# макаки работы на порядок больше. И денег в среднем больше. Печально это всё, конечно.
>>591743 Сорта говна, на самом деле. Тут дело привычки. Я частенько делаю обёртки для С-либ на C#, так мне уже абсолютно поебать на эти стили.
>>591788 >Вот зачем так некоторые пишут? Прост читают код по отступам, нормальные же люди цепляются по скобкам(причем парные скобки находятся оче удобно друг над другом).
>if (...) { Сколько раз видел, что при таком формате код превращается в монолитную дрисню без чистых строк для разделения логики. С чистыми строками читать код по отступам намного труднее.
>>592220 Начни просто с работы с различными вендовскими апи выполняющими всякое системное барахло, как уловишь их суть и как устроены можешь перебираться на более низкий уровень - шиндовс driver kit/написание своих драйверов/недокументированные функции и структуры ядра. Ну или аналогично на линуксе.
Так же накачай системных утилит типа Process Hacker и прочей йобы вроде поделий Русиновича (sysinternals.com). Ну и можешь его книжку почитать. Утилиты нужны чтобы задрачивать их и понимать как работают (и пробовать написать свои аналоги), это норм даже если нет исходников.
Привет, двощеры! У меня тут промблемы. Поможет кто? Вот задание.
Создайте программу поиска заданного слова в текстовом файле: (а) обычный линейный поиск; (б) два процесса параллельно ищут текст в первой и второй половине файла; (в) два потока одного процесса параллельно ищут текст в разных частях файла. Во избежание ситуации гонки при доступ к файлу можно отобразить его в память. Сравните разные реализации по скорости выполнения и объемом памяти, что они потребляют.
>>592276 Загугли "windows DDK" под нужную тебе венду и вперед. Так-то ничего сложного, там и примеры должны быть насколько помню, но попердолиться придется.
>>592319 а не обращайте внимания, думал что capacitor4 и capacitor4 внутри array одно и то же, оказывается - нет. как будто array имеет собственный capacitor4.
>>592320 >как будто array имеет собственный capacitor4 Так и есть, при инициализации создаётся копия всех черырёх элементов. Если тебе нужны ссылки, надо писать так: struct Capacitor ∗array[4] = {&capacitor1, &capacitor2, &capacitor3, &capacitor4};
>>592280 под винду за последние 15 лет проделали огромную работу поэтому сейчас можно писать драйвера старым способом есть новая инфраструктура + есть отдельная инфраструктура для драйверов, работающих в пользовательском режиме с другой стороны, сама же майкрософт сделала все это ненужным, так как сама за эти же двадцать лет написала собственные драйверы почти подо все
>>593512 arr у тебя массив (не указатель), т.е. определение arr просто резервирует на стеке несколько char'ов и инициализирует их. При обращении к arr (без квадратных скобок), оно преобразуется в адрес первого char'а, и этот адрес как бы не хранится ни в какой переменной, и поэтому &arr это уже какой-то undefined behavior. Отсюда и сегфолты в общем.
>>593524 Дополню ещё. Короч &arr это не то чтобы undefined behavior, но просто ненужная хуйня, потому что &arr == arr. И они оба имеют тип указатель на char, и поэтому присваивание к ptest у тебя бы не прошло без каста, как бы намекая на то, что у тебя где-то есть ошибка. А у тебя в результате в ptest вместо указателя на указатель оказывается просто указатель на char. Отсюда вывод - нехуй кастовать если это не один из следующих случаев, в которых кастовать можно и иногда нужно: 1. каст указателя на void в указатель на другой тип 2. каст структуры в тип первого элемента этой структуры. 3. ну может еще что-то, что я не вспомнил, но вряд ли
Тогда еще вопрос: как в таком случае получить адрес arr? C использованием еще одной переменной выходит так: char *parr = arr; А какие варианты еще одной переменной?
>>593562 Никаких. У тебя массив, у него есть адрес (его начало). Если тебе нужен тип именно указатель на указатель на char, то создаешь переменную типа указатель на char (как в твоем последнем посте), присваиваешь ей arr или &arr[0] (одно и тоже), а затем берешь адрес уже той переменной. Т.е. адрес можно брать только у переменной (которая физически где-то лежит в памяти) и только один раз, т.е. &&var уже нельзя делать (может оно и скомпилируется, конечно, не проверял, но смысла это делать точно нет никакого).
>>593558 Короч, чтобы стало совсем понятно: arr это уже адрес массива (первого элемента), представь, что компилятор тупо подставляет число адрес вместо arr. Ты ведь не стал бы пытаться получить адрес числа (типа &1234)? Также и тут.
>>593607 Ну дык. В первом варианте переменная arr1 у тебя имеет тип указатель на char. Определение arr1 создаёт и инициализирует анонимный массив, а также дополнительно выделяет место под один указатель, в который записывает адрес этого безымянного массива. Т.е. arr1 это переменная, в которую уже записан адрес массива. И так как arr1 это пременная, и она тоже лежит на стеке, то соответственно можно получить её адрес, который и будет являться указателем на указатель на первый элемент массива (то есть на char). При объявлении arr же, создаётся только сам массив.
>>593624 Алсо. Если ты не покинул с концами этот тред, то вот ещё немного полезной инфы. Между определением arr1 и arr есть ещё одна существенная разница (если мне не изменяет память). В случае с arr, массив будет создан на стеке, и с ним (в пределах данной функции) можно делать что угодно. В случае с arr1 же, локально на стеке будет лежать только указатель (т.к. ты объявил указатель), а сама строка будет находиться в статической памяти, и, скорее всего, в её read-only области. Поэтому, попытавшись изменить символы в строке через указатель arr1, можно соснуть и словить ещё один сегфолт. Такие дела.
>>593664 Ты прав. С другой стороны, char arr[] = "" - это лишний memcpy в коде. Он не нужен иногда, если тебе только читать. И есть третий вариант - static char arr[] = "" - поместит массив в секцию данных (т.е., не будет копирования), массив будет доступен для записи, но функция перестанет быть реентерабельной.
>>593554 > что &arr == arr. И они оба имеют тип указатель на char Нет, &arr - указатель на (тип массива). Численно указатели равны, а типы различны.
>>593693 > Численно указатели равны, а типы различны. Да, тут походу я обосрался, хотя вроде как и знал об этом где-то в глубине памяти обидно сцук, но по факту помнить про такое особенно и не нужно, т.к. если типы не совпадут, то компилер выдаст ошибку. Да и вообще редко когда такой тип может пригодиться, как мне кажется.
Меня доебали уже вендопроблемы и пиздец с текстовым и графическим режимами в венде. Меня заебало уже выискивать что еще не нравится этой ебучей ОС.
Хочу поставить какой-нибудь простой дистр, чисто для изучения С.
В наличии: - 2 флешки, примерно по 1Gb каждая. - немолодая noname пекарня. - очень мало свободного времени. Его просто нет на поебки с ОС, нужен простой и проверенный инструмент.
Что хотелось бы в идеале: - гружусь с флешки в простенький дистр (с минимальным гуем, без йобаперделок), - захожу в приемлемый редактор (даже соснолечка и отстутствие IDE не пугает? GEdit???) - херачу упражнения, конпелирую и вот это вот все.
Что требуется: - Литература типа K&R, только желательно не раньше 2010. K&R конечно классика, но уж очень устарел, компиляторы ругаются практически на каждый пример из книги. - Желательно литература или сайт заточенные для изучения С под линуксом, для относительных новичков.
Начальные условия: - С программированием неплохо знаком, образование высшее техническое (инженер), курю параллельно SICP.
Помоги Даше найти дистр, литературу, редактор, ну и что еще я забыл, ибо нуб.
>>593774 Норкоман, с твоим набором требований можно поставить debian-netinst на ту самую флэху, добавить build-essential и сидеть в виме в соснолечке (или вообще с ssh планшета/другой пекарни). Канпюлять тем же gcc или шлангом. У последнего ошибки поинформативнее.
>>593774 Вдогон: Полностью пустой дебиан 7 версии весил 124 метра после установки, 8-systemd-гавно не ставил, но прозреваю что не больше 200. ssh-сервер и канпюлятор прибавят максимум ещё столько же.
>>593664 Да, про read only знал, да и гугл выдавал в основном это различие.
Сделал утром на свежую голову, чтобы подтвердить свою ошибку: char arr[]="intel"; arr++; Компилятор ожидаемо выдал: error: lvalue required as increment operand Думаю усвоил теперь, что массив не указатель.
>>594139 Назачем тебе USB? Воткни VirtualBox, поставь любой понравившийся дистр, не придется перезагружаться по 20 раз на дню. Алсо, что значит вот это? > пиздец с текстовым и графическим режимами в венде
>>594150 >Воткни VirtualBox Ахтыжблядь, даже не думал в эту сторону, спасибо!
> пиздец с текстовым и графическим режимами в венде Это когда вместо кириллицы говно, и никак это не лечится. Это когда conio.h, graphics.h и тому подобное практически невозможно заставить нормально работать, а упражнения делать надо. Это когда вместо сосредоточения на книге+упражнения пытаешься заставить работать очередной, монструозный и глючный спермо-IDE.
Может быть по отдельности это и преодолими, но как же меня это задрало. Для обучения нужен простой, предсказуемый, понятный и контролируемый инструмент. Мне, по-крайней мере.
>>594177 >Это когда вместо кириллицы говно, и никак это не лечится. Это лечится функцией chartooembuf. >Это когда conio.h, graphics.h и тому подобное практически невозможно заставить нормально работать, а упражнения делать надо. mingw возьми. >Это когда вместо сосредоточения на книге+упражнения пытаешься заставить работать очередной, монструозный и глючный спермо-IDE. И emacs.
>>594183 Не хочу разводить срачик, но emacs действительно не для нубов как я. И он никак не подходит под категорию "простой и понятный". Консольная графика с mingw работает примерно в 50% случаев, и связано это с Win7, смотри тред про С++. То же самое про chartooembuf.
>>594237 Тут от критериев все зависит. Если главное условие - это небольшой размер, то TinyCore это самый подходящий дистр. Там даже GUI есть. Но если надо, чтобы не было проблем с либами и зависимостями (мало ли, какую либу или тулкит захочется освоить), то есть смысл подобрать что-то посерьезнее.
>>594237 Если ты учишь Си для себя, а не для ВУЗа, то забудь про conio.h и graphics.h, это устаревшее говно никому уже не нужно, если ты не любитель писать под некроОС. Не факт, что оно заработает под Linux. Найди современные аналоги, они не только проще, но и надежней.
>>594248 >>594255 Учу для себя, просто начал учиться по K&R - а это крайне устаревшее. Нашел это: C How to Programm, Deitel Все, что я искал - Линукс с объяснениями, и не нужна консольная графика. Я считаю следует добавить в шапку. И убрать K&R.
>>594177 >>594291 > пытаешься заставить работать очередной, монструозный и глючный спермо-IDE Посмотри, например, Pelles C: IDE, компилятор с почти полной поддержкой C11 (включая стандартную библиотеку, этим сейчас мало кто похвастаться может), source-level отладчик, профилер какой-никакой. Весит все это счастье 10 МБ, ставится по Next-Next-Next, работает из коробки на Windows 7 и выше. Алсо, можно взять связку Sublime Text 3 + MinGW - проще некуда, пользуюсь, брат жив.
> conio.h, graphics.h Закапываешь это нестандартное дерьмо, а потом идешь и пиздишь того, кто тебе про это рассказал.
> Это когда вместо кириллицы говно, и никак это не лечится. Лечится четырьмя путями: 1) Кодировка исходника в CP866 (зашквар, зато один клик и отсутствие каких-либо проблем). 2) Кодировка консоли (одна команда: chcp 1251 или программно через локали, или SetConsoleOutputCP). 3) Обертка над CharToOem, которую тебе уже подсказали (некоторая ебля). 4) Юникодный ввод-вывод (средствами сишечки или средствами Windows API, похуй - потребуются свои обертки над принтф, но в любой серьезной программе ты этим закончишь). Для обучения достаточно 1 или 2. В Линуксе тебя ждет еще более увлекательный мир UTF-8, желаю успехов.
> убрать K&R Почитай прошлый тред, там был срачик про K&R. Вердикт: читай и не выебывайся, потом что-нибудь поновее прочитаешь, типа >>591362Ты изданием книги не ошибся?
>>594340 >Закапываешь это нестандартное дерьмо, а потом идешь и пиздишь того, кто тебе про это рассказал. >>594339
Второе издание K&R, ANSI C, по ссылке из шапки. Там же getch(), из той же оперы. Я не понял, я единственный, кто читает эту книгу? Все остальные только ее советуют?
>>594355 Кстати, "return 0;" в конце main таки можно не писать, т.к. в соответствии со стандартом, если выполнение программы доходит до закрывающей скобки функции main, то операционной системе возвращается код успешного завершения. А вот int, и только int, писать надо.
>>594393 >-Wall -Werror Тебя заставляют с этими опциями компилировать?
>Был по дефолту много лет назад. С тех пор прошло... 26 лет? И сейчас есть, не важно сколько лет прошло:
[CODE] % cc -Wall hello.c hello.c:3: warning: return type defaults to 'int' hello.c: In function 'main': hello.c:5: warning: control reaches end of non-void function [/CODE]
>>594393 Ну как-бы о том и речь. С безмерным уважением к Отцам, книга морально устарела, прежде всего потому, что их детище не стоит на месте, а развивается.
>>594399 > Тебя заставляют с этими опциями компилировать? Очевидно, что да (плюс -Wno-date-time из-за поклонников сиреневенького когтееда). И другим того же советую, чтобы потом не было мучительно больно.
>>594405 Там речь не про implicit int. Там написано про те случаи, когда тип ф-ции main совместим с int. Если тип функции не задан вообще, то это unspecified behaviour.
>>594402 >У тебя свой стандарт? у меня GCC >Кто сказал, что в других средах и у других компиляторов поведение будет таким же, как у тебя? Покажи мне компилятор, который с командой из пикрелейтеда не скомпилирует исходник, который соответствует стандарту ANSI C. Самое время его разработчикам сообщить о баге.
>>594403 Если посмотришь сюда >>594388, то увидишь, что ничего не словил, следуя прямым указаниям из книги.
>>594405 >Очевидно, что да. Кому очевидно? В книге про -Wall -Werror ни слова, там команда "cc hello.c", которая работает. Т.е. если следовать прямым инструкциям из книги, проблем не будет.
>>594401 >Книга устарела. Ты просто в неё не можешь. Пожалуй, тебе действительно стоит начать с какого-нибудь пособия для чайников.
>>594415 >Ты просто в неё не можешь А вот тут-то я и прихуел. Я значительную часть прошел, плюс SICP херачу, и, вдруг в нее не могу? Я, вообще-то, заебался на винде глюки ловить, к книге у меня претензий только одна - она старая. Просто есть уже поновее, где естьпро линукс.
Кроме того, там нигде не сказано, что в конце main можно не писать return, в отличие от C99. Зато там написано это:
"Program termination"
A return from the initial call to the main function is equivalent to calling the exit function with the value returned by the main function as its argument. If the main function executes a return that specifies no value, the termination status returned to the host environment is undefined.
Но сама книжка хорошая, да. И в случае данной простой, учебной программы раскхождения со стандартом несущественные и врядли повлияют на работоспособность. Но мы же не о работоспособности того или иного кода говорим, а о его соответствии стандарту. C - стандартизированный язык. И если книжка расходится со стандартом, то прав стандарт. И я считаю, что новичкам полезно знать о таких особенностях, как обязательность типа int у функции main. Потому что одно дело написать main без int, и совсем другое написать main с void.
>>594433 Какой стандарт, лалка? Их дохуя было в истории C. В соответствии с C89 всё корректно. Я не говорю, что нужно писать с оглядкой на C89. Стандарты меняются, это нормально. Книга от этого хуже не становится.
>>594457 А ты перечитай цитату. C behavior все будет ок, а вот какой код возврата получит ОС, зависит от фазы луны (в принципе, ничего страшного - если автор не озаботился что-то вернуть, то и похуй, что вернулось).
>>594463 Я это и имел в виду: если неизвестно, какой код получит система, то это же подпадает под определение UB?
Undefined behavior --- behavior, upon use of a nonportable or erroneous program construct, of erroneous data, or of indeterminately-valued objects, for which the Standard imposes no requirements.
>>594469 UB - более эээ... всеобъемлющее понятие. При наличии UB поведение компилятора, программы или окружения могут быть абсолютно любыми, а тут проблема только с кодом возврата.
>>594472 Это показывает только различие в уровне предупреждений. С -Wall будет предупреждение.
И вообще, какой смысл второй тред подряд продолжать K&R срач? Кто-то как выяснилось считает нормальным собирать с минимальными предупреждениями, для кого-то не проблема исправить некоторые особенности кода в книге, а кто-то найдет что-нибудь более свежее.
>>594475 >Это показывает только различие в уровне предупреждений. Это показывает, что не было никаких предупреждений о return для обоих стандартов, включая ANSI C. Значит, отсутствие return стандартам удовлетворяет.
>>594495 3.6.6.4 The return statement ... If a return statement without an expression is executed, and the value of the function call is used by the caller, the behavior is undefined. Reaching the } that terminates a function is equivalent to executing a return statement without an expression.
>>594505 >Reaching the } that terminates a function is equivalent to executing a return statement without an expression.
If the main function executes a return that specifies no value, the termination status returned to the host environment is undefined.
То есть, получаем неопределенный код возврата. Да, не очень критично. И в GCC, наверняка, есть на этот случай свое решение. Но как-то это все мутно. Проще написать int перед main и получить полностью совместимый с C99 код.
>>594415 >Т.е. если следовать прямым инструкциям из книги, проблем не будет. лол. а писать программы на сишке тоже потом строго по книге будешь? см. пик. >Покажи мне компилятор, который с командой из пикрелейтеда не скомпилирует исходник, который соответствует стандарту ANSI C. а еще в древнем стандарте ansi c можно объявлять функции вот так. http://ideone.com/xucDTh и что теперь? покажи хоть одного нормального человека, который так делает.
пиздос, набралось петухов, которые думают программирование это слово в слово из книги скопипастить, а потом получаются коммиты уровня https://lkml.org/lkml/2015/11/19/454
>>594522 Дискуссия началась с того, что было заявлено, что книга устарела и её надо убрать. Я лишь показал, что она пригодна к использованию, не зависимо от того, что код из примеров удовлетворяет только ANSI. А те, кто не может скомпилировать hello world, унтерменши, которые поставили себе ИДЕ, в которой не понимают, чё как происходит, и запускают программу по F5, а потом кричат, что у них не работает ничего и книга плохая.
Также я не утверждал, что нужно замкнуться исключительно на одной этой книге. Очевидно, что необходимо черпать информацию из различных источников. Если придерживаться этого правила, то никаких проблем с K&R вообще не возникнет, каким бы компилятором в какой бы то ни было среде ты не компилировал.
>>594539 >А как ты рекомендуешь учиться по книге петух? A? никак. книги по программированию это удел говноедов. >>594540 >Дискуссия началась с того, что было заявлено, что книга устарела и её надо убрать. правильно заявлено. сам же пишешь: >код из примеров удовлетворяет только ANSI добро пожаловать в 90-е. про с11 слышал? >А те, кто не может скомпилировать hello world, унтерменши, которые поставили себе ИДЕ, в которой не понимают, чё как происходит, и запускают программу по F5, а потом кричат, что у них не работает ничего и книга плохая. или разумные люди, которые знают, что компиляция с -Wall -Wextra -Werror позволяет отловить много ошибок. а советуют убрать эти опции (вместо того чтобы либо исправить код) только мудаки с картинки выше. ворнинги в компилятор не от хорошей жизни добавили.
впрочем, тут возникает логичный вопрос: если код надо исправлять, то нахуй такая книга вообще нужна? ответ: не нужна. >>594541 очевидно же, целью было хоть какой-нибудь коммит в ядро отправить. линтер сказал там где data != NULL написать "!data", значит надо написать "!data". "!data" != NULL.
>>594517 С void ты язык перепутал. В exit() смысл есть.
>>594560 > нахуй такая книга вообще нужна? ответ: не нужна. Для понимания, что код не всегда бывает красивым и правильным, для развития навыка выяснения хотя бы в /pr/, хули оно ругается на код из книги, для получения мысленной ачивки "я поправил код ВЕЛИКИХ, и теперь компилятор не ругается".
>>594562 >С void ты язык перепутал. Не совсем понял про "перепутал", но да, по логике вещей main() должен возвращать код возврата даже с помощью exit(), так что нужен int, каюсь.
>>594673 >>594631 А вот по ссылке из шапки http://c.learncodethehardway.org/book/ чувак не рекомендует пользоваться IDE вообще, говорит - отупляет. Что он имеет ввиду конкретно? Что надо понимать весь процесс генерации от исходников до исполняемого кода?
>>594888 Стоит хотя бы мейкфайлы научиться писать. Или build.sh. К тому же сишечка не кресты, для навигации по коду хватает тэгов, которые есть в любом редакторе.
>>595153 Так я и так знаю, что переменная - указатель. Может мне еще foo_const_int_ptr_const_dynamic_buffer_of_2048_bytes писать? Абсолютно ненужная информация, которую приходится повторять каждый раз при использовании переменной. Нахуй?
>>595146 >Покажи, в каких случаях суффикс (или префикс, похуй) ptr имеет смысл? Ну а в каких случаях мелкомягкие пидоры форсили Венегрскую Нотацию, у них все винапи этим говном абляпано? Такая же поебота, дело личных предпочтений.
>>595166 А кто сказал, что в Microsoft были правы? В общем-то, дело предпочтений, но в век IDE о переменной можно узнать все одним хоткеем.
>>595169 > Как ты знаешь что эта переменная - указатель? Особенно в чужом коде? Она либо локальная (или параметр функции), и я просто посмотрю. Или она из немногочисленных глобальных переменных. В худшем случае есть тултип с информацией о типе или goto definition.
>>596061 2 чаю, хуёво переведено. С этого охуел >ваши глаза научатся это видеть, точно так же как рабочие пекарни научились смотреть на гигантскую фабрику хлеба
>>595994 Статья ни о чём, даже переводчик опровергает автора в своих комментариях. Ключевой вопрос, даже если нужно делать префиксы к переменным с обозначением, что за вид данных они хранят, почему их обязательно нужно обозначать как refAlloYoba, а не ref_allo_yoba или даже так с постфиксом allo_yoba_ref. Что за необходимость юзать верхний регистр.
Тупые школьники и не осилили короткую статью на русском языке. Речь в статье о том, что apps hungarian в принципе использовать имело смысл, а system hungarian - смысла использовать не было никогда. Речь только об этом. А не о том, что в языках с развитой системой типов для apps hungarian есть альтернативы. По пунктам. >>596058 Тупой школьник не осилил статью. >>596066 Тупой школьник тоже не осилил статью. Самый тупой. >>596097 Школьник номер три типа самый умный, но не в курсе, что венгерская нотация появилась до его рождения в ситуации, когда в С можно было сделать так: http://ideone.com/fS3mjz
>>596391 Ну а этот школьник не осилил C. Я сейчас сломаю тебе шаблон, но седьмая строчка твоего кода ВНЕЗАПНО не сработает без явного приведения типов. Это было сделано специально против динамических долбоебов, которые обожают присваивать неприсваиваемые сущности, а потом кукарекают что-то про ОСОБОЕ ИМЕНОВАНИЕ и РУЧНУЮ РЕВИЗИЮ КОДА.
>>596433 Компилятор не определяет стандарт, лол. >ANSI C 89, 3.3.4 > Conversions that involve pointers (other than as permitted by the constraints of $3.3.16.1) shall be specified by means of an explicit cast > 3.3.16.1 >both operands are pointers to qualified or unqualified versions of compatible types, and the type pointed to by the left has all the qualifiers of the type pointed to by the right; OR >one operand is a pointer to an object or incomplete type and the other is a pointer to a qualified or unqualified version of void, and the type pointed to by the left has all the qualifiers of the type pointed to by the right > 3.1.2.6 >Two types have compatible type if their types are the same Итак, если справа не указатель на тот же тип или void, то нужно явное приведение. Читайте стандарт, ребята.
>>596477 Не "Не выдаст предупреждение, а не скомпилируется" а "скомпилируется, но выдаст предупреждение". warning C4133: '=' : incompatible types - from 'unsafe_yoba *' to 'safe_yoba *' Если присваиваются указатели, то будет предупреждение, но присваивание произойдёт. А вот с C++ будет ошибка, т.к. там ужесточили подобные присваивания.
>>596495 Ну, до стандартизации было вообще некорректно говорить о "языке C". Был компилятор скорее всего, написанный самими мелкомягкими, были какие-то внутренние соглашения, а у других компаний со своими компиляторами детали отличались. Мелкомягкие не смогли грамотно продумать у себя присваивание указателей и многие другие вещи, это в конечном счете вылилось в дичайший костыль с нотацией, который реально использовали только они и неопытные ньюфаги, начитавшиеся мелкомягких доков. >>596492 Посмотри выше ссылку на стандарт. Уже в 89 это было, а в дальнейшем правила приведения только ужесточались. Какой-то у тебя хуевый компилятор, видимо, попробуй gcc.
>>596513 До стандартизации ANSI был язык, описанный его автором в своей книжке, авторы этой книжки плачут кровавыми слезами на оппике, когда видят фантазии школьников и уровень критики статьи Джоэля.
>>596517 И ты снова обосрался, там написано в точности то же, что в стандарте 89 года. Открываем K&R, приложение A.6.6, четвертый абзац: >Для указателей допускаются и другие преобразования, но в связи с ними возникает проблема зависимости результата от реализации. Эти преобразования должны быть специфицированы явным оператором преобразования типа или оператором приведения
Nyet. В крестах есть перегрузка функций, и, как следствие, пиздец с аби., плюс не под все есть компилятор.
В растопараше перегруженный ебанутый синтаксис, костыли в стандартной-боблиотеке и пр., а с компиляторами - вообще полный пиздос.
И да, большая часть "киллер-фич", если не все, лол, раста реализуемая на крестах, правда в рантайме, а не во время корреляции. Да и про #ногц афтары растопараши Кизляр.
>>596534 Погуглил сейчас. Действительно, почему-то в дефолтном конфиге отнесли это к предупреждениям, а не ошибкам. Учитывая стандарт, странно, но, видимо, из-за того, что в сишном стандарте вообще нет разграничения на unspecified behavior и ill-formed-program, каждый компилятор дрочит, как он хочет, лол.
>>596547 >каждый компилятор дрочит, как он хочет Вообще, C++ даже void* без кастинга не преобразует, выдаст ошибку. А в C malloc, free и прочие стандартные функции, принимающие или возвращающие void*. Это не баг, это фича.
>>596534 Ну вот еще один аргумент в пользу шланга вместо гцц. Алсо Pelles C (и, видимо, lcc тоже) делает правильнее: foo.c(7): error #2168: Operands of '=' have incompatible types '(incomplete) struct safe_yoba *' and '(incomplete) struct unsafe_yoba *'. Ибо нехуй.
И вообще, похуй, предупреждение или ошибка, лишь бы показало, что с кодом что-то не так.
>>596761 Абсолютно похуй в чем писать. Выбираешь любуя понравившуяся IDE или редактор: студия, Code::Blocks, Pelles C, CLion, Eclipse CDT, Sublime Text, NP++ и т. д. Любой понравившийся компилятор: MinGW gcc проще всего, clang под Windows заводится через пару манипуляций (требуется MinGW вдобавок к инсталлеру с сайта), у студии и Pelles C компиляторы встроены (т.е., все работает без дополнительных настроек). Всякие интелы, борланды и tinycc не рассматриваем, ибо ненужны, древние или бажные. Это под винду. Под линуксы добавляется еще добрый десяток редакторов, а из компиляторов остаются gcc и clang, причем в clang няшный --analyze и более понятные варнинги. Выбираешь, пишешь, конпелируешь. В IDE готовой кнопочкой, а с редакторами консолькой или плагином.
>>596769 >интелы >ибо ненужны, древние или бажные Блять. Интеловские компилеры ебут всех на вычислениях. поддержка C11 сосёт хуй: а) даже в гцц ещё не завезли до конца б) нинужно, все как писали так и пишут на 99-й
> Интеловские компилеры ебут всех на вычислениях Спрашивающий - новичок. Интелы ему не нужны, потому что ему не нужна скорость, борланды - потому что древние, наколеночные компиляторы типа tinycc, потому что бажные. Так понятнее?
> поддержка C11 Стандартные static_assert и анонимные структуры которые раньше делали через костыли и расширения - годнота. А на C99 пишут, потому что с поддержкой не все гладко.
> даже в гцц У гццшников всегда так - как написать очередную оптимизацию, использующую знание об UB и сломать ею что-нибудь в линуксе, так они первые ко-ко-ко, стандарт позволяет, а как допилить поддержку языка по этому же самому стандарту, так им влом.
>>596527 >И ты снова обосрался, там написано в точности то же, что в стандарте 89 года. Открываем K&R, приложение A.6.6, четвертый абзац: Даун ссылается на второе издание. Привет, даун.
Суп. Есть строка, представляющая собой 3 дробных числа с 3мя цифрами после запятой и от -1 до 1 в качестве целой части - нормализованный вектор строка в духе "0.5910.114-0.012" Как спарсить посредством sscanf или подобной функцией, если эта строка передается через сеть и может быть намеренно искажена. Сейчас есть решение через atof функцию с ограничением на 5 или 6 символов в зависимости от наличия минуса. Спасибо
>>599461 Нам-то откуда знать, как твоя IDE работает? Ты бы рассказал, как оно к железу подключается, хотя бы. Тебе надо собирать данные параллельно с IDE или вместо нее? Можно, например, программно грабить из окна IDE (проверь, http://www.nirsoft.net/utils/sysexp.html будет работать с окном Sensors?), но это костыль.
>>599515 так а мне откуда знать? охуеть вообще. Оно, думаю, эмулирует сериал порт через юсб. Но как разобраться что оно там шлет то нахуй? Думал, из ИДЕ быстрее будет забрать. Собственно, если не будет разумного решения, то проще на робота навесить Ардуино, чем ебаться разбираться с форматом общения робота с ИДЕ. Про костыль посмотрю и сообщу, спасибо. >>599528 Он это я и есть. Алсо, проверяй Лего за щекой. только кортекс >>599629 >ну скорее всего телеметрию она сбрасывает еще и в логи если это так, что я и правда лох. Но мы то знаем.
>>599724 чего, даже этого? НХТ пишет в файл на роботе инфа процентов 80, это не то. А то что ты предлаешь - вообще управление uart, никакого отношения к связи с компьютером.
Давай так, ты перестанешь умничать про роботов, раз не видел их никогда, а сосредоточишь свою экспертизу на рассказах как мне получить данные из ИДЕ. Например посоветуешь программу которая могда бы слушать сериал порт в то время как его использует иде. Раньше в похожих ситуациях с ардуино этого сделать не получалось, почемуто только одна програма могда работать с портом.
Cап, на связь выходит школьник-кун. Хочу написать шахматы. Использовать буду windows api для графена и си как язык. Думаю представить доску как статический массив 8х8. Не понимаю как наложить ограничение на ход фигур, есть только идеи, но ничего конкретного. Пока сижу без полноценного интернета, как только обзаведусь буду ебать вам мозги моими бесконечными вопросами. Заранее прошу прощение.
>>600007 Опять пытаешься пальцем в небо ткнуть, лол? ОК, не беда, ты старался. Что интересно, наш с тобою "диалог" натолкнул меня на простое решение, жалко что не програмное. бывай
>>600227 давай отвлечемся от склок, подумаем шире. Что позволяет тебе кукарекать, если в предыдущих 4х ответах вподряд ты обосрался с пруфами? Имею ввиду, что про уарт ты можешь быть прав пока я, правда, вообще не пойму что ты несешь, вопрос где ты берешь моральные силы. >в шоколадный глаз тебе ткнул спс, вот с тебя и польза
>>600615 Исключения, которые от процессора - только зависящим от платформы способом (сигналы в никсах, SEH/VEH и их вариации в винде). А симулировать плюсовые исключения можно через через сигналы или через longjmp, да.
jmp_buf buf; if (setjmp(buf)) { fprintf(stderr, "SOSNOOLEY\n"); exit(EXIT_FAILURE); } else { передаешь buf кому-нибудь, кто в нужное время скажет longjmp(buf, не 0), после чего выполнение продолжится с fprintf выше. }
>>601407 Потому что у тебя как и у большинства машинка с little endian, т.е., многобайтовые инты хранятся в памяти, начиная с младшего байта. Либо меняй порядок байтов (__builtin_bswap32 в гцц), либо не выделывайся и сверяй сигнатурки через memcmp.
>>601410 >машинка с little endian, т.е., многобайтовые инты хранятся в памяти, начиная с младшего байта Если старшему байту соответствует старший адрес, то с чего начинается число? Я не совсем понял, как отсчитывается начало числа и его конец.
>>602032 Я точно не знаю, но есть вроде команд процессору, которые указывают, какой длины число и где оно сидит, соответственно перемещается и либо копируется, либо берётся кусок
>>602032 Да и вообще, легче на низком уровне Предметы: логика, информатика и схемотехника считывать в двоичном или 16-ричном 8 битном числе всё наоборот, сформулировать легко не смогу, можешь посмотреть, как работает Стек
>>602032 Когда процессор читает число, он знает, сколько ему нужно байт, это кодируется компилятором в самой инструкции. Само число в little-endian является суммой из (ptr[byte_index] << (byte_index ∗ 8)).
>>602029 Тебе в любом случае нужны "лишние" библиотеки, чтобы получить и распарсить, например, командную строку для main. Можно указать свою точку входа -е, если почему-то хочется компактности.
>>602029 Во-первых, это делает не компилятор, а линковщик. Во-вторых, не хочешь использовать стандартную библиотеку - есть ключ линковщика -nostdlib, или типа того, пиши свой стартап и наслаждайся.
Чому у меня первый ряд не заполняется 1? Он 0 заполняется, а потом первый ряд не заполняется int i, j; int a[8][8]; for (i = 0; i < 8; i++) { printf("\n\t"); for (j = 0; j < 8; j++) { a[j] = 0; printf("%2d ", a[j]); } printf("\n"); } for (i = 0; i < 8; i++) { a[0] = 1; }
Чому он мне условие игнорирует? if ((a[t2][t1] == 0 || ((t1==0 || t2==0) && (t1+t2)<=8)) && (t1<9 || t2<9)) { printf("Тут нет шашки\n"); printf("Выберите шашку (введите число в в формате (x y), без скобок\n"); scanf_s("%d", &t1); scanf_s("%d", &t2); if ((a[t2][t1] == 0 || ((t1 == 0 || t2 == 0) && (t1 + t2) <= 8)) && (t1<9 || t2<9)) { printf("Больше вам играть нельзя, вы слишком много ошибались\n"); break; } } Когда ввожу и t1 и t2 больше 9, он все равно присваивает, а об ошибке не пишет
Дан одномерный массив А неупорядоченных целых чисел. Необходимо переписать в массив В все различающиеся элементы из массива А. Буду благодарен за помощь.
Вот мой код, но программа выводит массив неизменно:
#include<stdio.h> #include<conio.h> #include<stdlib.h> int ifexist(int a, int n, int b) { int i, z=0; for (i = 0; i < n; i++) if (a == b) return 1; else return 0; } int main(void) { int A, B; int i, j = 0, N, k=0; printf("N="); scanf("%d", &N); A = (int)calloc(N, sizeof(int)); B = (int*)calloc(N, sizeof(int)); printf("Array A: "); for (i = 0; i < N; i++) scanf("%d", &A); for (i = 0, j = 0; i < N; i++) if (ifexist(B, k, A) == 0) { B[j] = A; j++; k = j; } printf("Array B: "); for (i = 0; i < k; i++) printf("%d ", B); free(A); free(B); system("pause"); return(0); }
Ребята, вкатился в программирование на прошлой недели. Можете накидать хорошо написанного исходного кода реальной программы? Мне нужно изучать язык, а как я понял изучая чужой код один из лучших вариантов.
Поручили написать калькулятор с учетом приоритетов с помощью бинарного дерева. В алгоритмах ноль, в структурках еще не совсем разобрался. Можете подсказать, как в нем разобраться? тупо списывать код не хочу, намерен сделать сам, но откуда плыть - не знаю
>>602962 >>602922 А это точно через польскую решается? В задании сказано, что написана строка с выражением, его нужно с помощью бинарных деревьев посчитать.
С помощью чего генерируется такой шеллкод и что это за байты? Почему у них такое обозначение, а не 0x90 и т.п. ? Я изучал программы в олле и видел, как кодируются инструкции хексами. Здесь просто выписаны эти хекс-коды по байтам в том порядке, в каком они расположены в отладчике?
>>603537 > Здесь просто выписаны эти хекс-коды по байтам в том порядке Да. \x - это способ записи тех же самых хексов внутри строкового литерала (можно было сделать и uint8_t shellcode[] = { 0x31, 0xc0, 0x31, 0xdb ... }, ну ты понел). Пишется на ассемблере, компилируется, проверяется на отсутствие \0 вообще-то, есть автоматические генераторы давно.
>>603537 >С помощью чего генерируется такой шеллкод Самое простое - ставишь nasm. Пишешь на асме процедурку, удовлетворяющую сишному соглашению о вызовах. Компилишь. Потом скармливаешь объектный файл утилите ndisasm и переписываешь коды. Потом в сином коде делашь указатель на функцию с адресом шеллкода.
>Почему у них такое обозначение Потому, что байты предствлены в виде одной строки, а \x - это escape-sequence для 16-ричного кода.
>>603585 >>603590 А если не может, можно просто сделать: db 'START' твой код db 'END' и хекс-редактором выдрать из объектника код между этими двумя маркерами, не задумываясь, кто там во что может.
>>603586 > после символа x стоит не 2 символа, а 4 Это либо обычный текст: "\xfeee" - это 0xfe, 'e', 'e', либо там не \x был, а \u.
>>603603 \u -юникодный символ, после u могут идти 4 hex-цифры, то есть, можно указать 16-битный code point ("\u1234" превратится в 0x34, 0x12 на little-endian машине). Есть еще \U и 8 цифр, чтобы указывать 32-битный code point. Но я не знаю, зачем кто-то стал бы хранить шеллкод в юникодной строке.
сап. Прошу вашей помощи, аноны. Начал разбираться с shared memory и семафорами и получил задание написать морской бой, где сервер и клиент коммуницируют через ShM. Проблема в том, что не могу нормально синхронизировать. То есть одного игрока с сервером я могу синхронизировать, но как это сделать сразу с двумя. Трудность у меня вызывает то, что battleships-client он один, а игроков двое. Может подкините мыслишку какую-нибудь? Я пока не буду код кидать свой, вдруг я еще что-нибудь надумаю...
>>603921 Лол. Ему даже новую игру делать не придется. Дописать "Морской бой" и в нем перед началом каждой партии выводить сообщение, что игрок руководит действиями НАТОвского флота, а его противник - корабли с африканскими нелегалами.
>>603931 Выражение "захватил семафор" заиграет новыми красками >>603738 геропейский еблан, захватывай семафор в клиенте и удерживай, затем отпускай после обработки
Cделал хуйню шашки на си https://github.com/shkolnik3333/132/blob/master/shashki Обоссыте меня. Заодно у меня есть задания, посоветуйте материала по работе с файлами, сам я понимаю как сделать это логически, но как написать без понятия.
>>604388 хз как. я глянул твой код - это вообще пиздец какой-то. начиная от >int tmp, tmp1, i, j, ww = 0, bb = 0, t1, t2, m1, m2, f = 1, mm1, mm2, wf=0, bf=0, z=0; и заканчивая гирляндой из goto
>>604406 вся жизнь впереди. вузик не проеби и все будет. а с этим ты мне меня напомнил, когда я в 16 лет захотел овладеть программированием и купил самоучитель по ассемблеру, бгг.
>>604235 И ещё. 1. Чтобы занулить массив, достаточно memset(a, 0, sizeof(a)); без двойного цикла. 2. char a[9][9]; хуже чем int a[9][9], а если числа не могут быть отрицательными, то unsigned. Хотя что то, что другое из разряда байтоёбства и экономии тактов. 3. i % 2 - это ты определяешь чётное или нечётное число у тебя? i & 1. 4. Не лучше ли вместо 8 циклов инициализации сделать один статический массив и скопировать его на место 'a'? static const char init_a[9][9] = { {0, 1, 2, 3, 4, 5, 6, 7, 8}, {0, 1, 0, 1, 0, 1, 0, 1, 0}, ..... }; memcpy(a, init_a, sizeof(a));
5. Разноси на функции. Не понадобится goto, проще будет разобраться самому. У тебя уже есть потенциальные места для отдельных функций - метки для goto. 6. scanf_s стоит проверять на возвращаемое значение и проверять t1, t2 перед их использованием, иначе можно вылететь за пределы массива. 7. Не объявляй все переменные в одной куче. int tmp, tmp1, i, j, ww..... ww, bb, t1, t2 и некоторые другие у тебя используются только в цикле, там их и объявляй. Старайся объявлять переменные как можно ближе к месту использования. 8. vibor, hod и прочее. Только английский, только хардкор. 9. Строка 156 и ниже. Как понимаю, одно только условие истино? Используй else if, чтобы не делать бесполезные проверки. 10. Строка 156 и 160 - одинаковое условие, во втором случае наверное m2 > t2. Логику не смотрел, может там что есть ещё. А так - всё норм для начинающего.
>>604414 Я в шараге, 2 курс. >>604416 > 1. Чтобы занулить массив, достаточно memset(a, 0, sizeof(a)); без двойного цикла. Принял > 2. char a[9][9]; хуже чем int a[9][9], а если числа не могут быть отрицательными, то unsigned. Хотя что то, что другое из разряда байтоёбства и экономии тактов. Изначально было инт, но когда хотел буквы вместо цифр переделывал в чар, убрать назад забыл. > 4. Не лучше ли вместо 8 циклов инициализации сделать один статический массив и скопировать его на место 'a'? Принял > 5. Разноси на функции. Не понадобится goto, проще будет разобраться самому. У тебя уже есть потенциальные места для отдельных функций - метки для goto. Хотел сделать функциями, только начал, как сразу закончил, не хватило навыка, вроде написал, а что возвращать? А может вообще не нужно возвращать, а нужен воид, А тут я уже не понимаю мне же нужно что-то принимать, а воид ничего не дает и прочие бредни сумашедшего. > 6. scanf_s стоит проверять на возвращаемое значение и проверять t1, t2 перед их использованием, иначе можно вылететь за пределы массива. Проверяется же > if ((a[t2][t1] == 0 || ((t1 == 0 || t2 == 0) && (t1 + t2) <= 8)) || (t1>9 || t2>9)) Или я тебя не правильно понял? > 7. Не объявляй все переменные в одной куче. Принял > 8. vibor, hod и прочее. Только английский, только хардкор. Какая разница? Ну если правильней будет choose, move, end, то хорошо. > 9. Строка 156 и ниже. Как понимаю, одно только условие истино? Используй else if, чтобы не делать бесполезные проверки. Вроде если я сделаю if else, то тогда может ошибка быть, например if ((m1 > t1) && (m2 < t2)) a[m2 + 1][m1 - 1] = 0; else А тут в елсе у меня подразумевается 3 возможных варианта. Или я ошибаюсь? > 10. Строка 156 и 160 - одинаковое условие, во втором случае наверное m2 > t2. И правда, не заметил. Спасибо? > Стив Макконнелл "Совершенный код". Читай. Скачаю, почитаю, только один вопрос, тяжело для осознания?
>>604434 >а что возвращать Может и ничего не надо, передаёшь массив в функцию и изменяешь там, как надо. Надо по контексту смотреть. >Проверяется же Если ты изначально задашь t1 и t2 больше 9 или меньше 0, то у тебя будет вылет за пределы массива. Надо что-то типа: if (scanf_s("%d", &t1) != 1 || scanf_s("%d", &t2) != 1 || t1 < 0 || t1 > 9 || t2 < 0 || t2 > 9) { //error } else { // нормальное выполнение } Или задавать t1 и t2 беззнаковыми, тогда проверка t1 < 0 будет не нужна. >Вроде если я сделаю if else, то тогда может ошибка быть Там два взаимоисключающих условия, как мне показалось. Строка 156 и 158, например. Только одно условие может выполниться, тогда лучше записать if ((m1 > t1) && (m2 < t2)) { a[m2 + 1][m1 - 1] = 0; } else if ((m1 < t1) && (m2 < t2)) { a[m2 + 1][m1 + 1] = 0; } Или даже объединить, когда m1 > t1 и m1 < t1 if (m1 > t1) { if (m2 < t2) { a[m2 + 1][m1 - 1] = 0; } else if (m2 > t2) { a[m2 + 1][m1 + 1] = 0; } } else if (m1 < t1) { .... } А ещё лучше вынести if (m2 < t2) и else if (m2 > t2) в отдельную функцию. Надо разбираться, что ты там делаешь, так бегло не поймёшь, как лучше. >тяжело для осознания Это не учебник по ЯП, там написано, как нужно писать код.
>>604373 >#include "stdafx.h" >system("color 97"); >setlocale(LC_ALL, "rus"); >system("pause>void"); Это платформенозависимое говно. Его надо отделять от всего остального.
Ну и до кучи, тебе бы разбить код на функции, отделить логику работы игры от интерфейса пользователя, ну и венгерская нотация таки не помешает. Если какой-то кусок кода повторяется несколько раз, то его точно надо сделать функцией.
Хочу прочитать текстовый файл, в качестве примера сам исходник, в память. Создаю динамический двухмерный массив и начинаю читать, но программа сегфолтится после первой прочитанной строки, я так понял на realloc. Помогите понять где ошибка. http://ideone.com/1hmIIZ
Численные методы поцоны. Метод половинного деления(дихотомии)Звездныевоиныевривер19/12/15 Суб 21:09:45#519№607703
Задаешь типа arcsin(числорад) и выдает тебе ответик чему равен арксинус, снизу функшин, все работает збс, НО, из-за того что используется сравнение по абсолютной ошибке while (abs(b - a) > 0.0001) происходит FAIL!!!! при arcsin(1e-4 ) например, ПРОШУ ГОСПОДДВАЧА хелпаните
float pd(float n) { float a = -PI / 2; float b = PI / 2; float s = 0; while (abs(b - a) > 0.0001) { s = (a + b) / 2; if ((sin(a) - n)*(sin(s) - n) > 0) a = s; else b = s; } return s; }
>>607703 float pd(float n) { float a = -PI / 2; float b = PI / 2; float s = 0; while (abs(b - a) > 0.0001) { s = (a + b) / 2; if ((sin(a) - n)*(sin(s) - n) > 0) a = s; else b = s; } return s; }
>>579550 (OP) Аноны, помогите пожалуйста, вчерашнему школьнику отладить функцию удаления нулевого столбца из массива: int del_zero(inta, int n, int m) { int j,i,jj=0,k=0; for (j = 0; j < m; j++) { for (i = 0; i < n; i++) if (((a+im+j) == 0)) { k++; for (jj=j;jj<m-1;jj++) for(i=0;i<n;i++) ((a+im+jj))=((a+i*m+(jj+1)));
} } return k; } Выводит пикрелейтед (почему-то выводит последний элемент предшествующей строки первым элементом новой)
>>607463 Проще же можно: выделить кусок память под весь файл и прочитать его за раз. Дальше парсишь его содержимое и не забываешь, что строка на `\0` не кончается. http://pastebin.com/gtSzqGb4
>>607937 Я уже написал велосипед так, в том исходнике не хватало malloc на строки , ну и ошибок с индексами много. Строки кончаются на '\n', конец файла на 25, не знаю как это выглядит с точки зрения про программирования, но чувствую что программа не будет работать с другими кодировками. Ладно, теперь у меня в памяти двумерный массив символов [строка][символ]. Как написать функцию очистки ? void FreeRamFromScript (char script_in_ram) { unsigned int count_strings = CountStringsInRam (script_in_ram); unsigned int i; for (i=0; i++; i<count_strings); { free(script_in_ram); } free(script_in_ram); } Такая функция не работает, видимо потому что она , как я думаю, делает копию из переданного массива. Как правильно в нее передать массив?
>>607935 Сорри, не правильно сформулировал задачу нужно, чтобы функция удаляла в матрице столбцы, в которых есть 0. Вот мой код: http://pastebin.com/FnYB1kk0 Он удаляет столбец с нулём, но еще и копирует последний столбец.
Анон, я скриптокодер. Хочу в С, для повышения скилла и, может, по работе пригодится: плагины для своих язычков писать. Скажите, сильно ли сложно вот это всё байтоёбство, указатели и проч.? У меня есть шанс?
С чего начинать:
Классика от Отцов: http://www.ime.usp.br/~pf/Kernighan-Ritchie/C-Programming-Ebook.pdf
Годное пособие для гуманитариев: http://c.learncodethehardway.org/book/
Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
ООП, например: http://www.cs.rit.edu/%7Eats/books/ooc.pdf
Предыдущий тред тонет по следующему адресу: