Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.Пожалуйста, пользуйтесь https://ideone.com/ или http://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [i] или ∗.Что читать:- Brian Kernighan, Dennis Ritchie "The C Programming Language": http://www.cypress.com/file/56651/download- Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.- Zed A. Shaw "Learn C the Hard Way" (2015): годное пособие для гуманитариев для гуманитариев!- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf- Стандарт ISO/IEC 9899:1999 (он же C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт)- Стандарт ISO/IEC 9899:2011 (он же C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)- man/Dash/zealdocsЧем конпелировать:- Очевидный GCC.- clang: оче годно, батя рекомендует.- Intel C++ Compiler: оптимизации, тысячи их.- Visual Studio 2017 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.- TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.Что еще почитать:http://c-faq.com/FAQ из comp.lang.c. Древний, но все еще актуален.Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).Richard M. Reese "Understanding and Using C Pointers. Core Techniques for Memory Management" (2013) - почитать, вкатиться в указатели.Ben Klemens "21st Century C: C Tips from the New School" (2012)Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)Stephen G. Koch@n "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+StandardЕще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_CОнлайн-утилиты:- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.Прошлые треды:- №32: https://arhivach.tk/thread/375538/- №33: https://arhivach.tk/thread/383767/- №34: https://arhivach.tk/thread/398890/
>>1287741Ну, как программисту это тебе нужно для ручной автоматизации сборки скриптиками на баше или мейком. Хотя это можно и в сигвине вроде делать. Пожалуй на этом вроде заканчивается. Дальше идут особенности операционки: меньше вирусов, меньше тормозов, но зато ебля с драйверами и пердолинг с конфигами. Хотя против венды ещё скажу, что очень много языков поставляется из коробки в большинстве основных дистров.
>>1287743Ну я с cmake и make и на винде могу работать. меня больше волновал вопрос нужности знания лигукс апи.
>>1287743В линуксе удобно ставить языки и либы через apt install или pacman -S и т.п. Это вот точно удобно.
>>1287746Линукс АПИ? Дак, это вроде Си использует винАПИ. Потому что для линуксов си - родной язык, на котором ядро в общем-то пишется.
>>1287770Это звездочка не перед названием функции по сути, это звездочка относится к типу возвращаемого значения. Ты можешь писатьint✡ funcint ✡funcint ✡ funcРазницы это не имеет. Просто главное что ты возвращаешь указатель на тип данных int. Если ты не знаешь что такое указатель - то прошу читать книжки и статьи, ибо рассказывать это здесь нет смысла - все и так разжевано.
>>1287779Нет я в курсе. Просто получается если не ставить звездочку возле функции. То компилятор будет думать, что возвращает не массив , а просто int единицу?
>>1287783Да. Но желательно пойми суть указателей.Например arr[3] это равнозначно *(arr+3). Потому что стандартный массив это указатель вроде на первый элемент, и написывая [3] ты указываешь на то, что надо отчитать 3 блока памяти размером с тип данных указателя и взять оттуда блок памяти размером с тип указателя.
>>1287750> Но если ты на винде в студии пишешьЕсли ты не умеешь в современные IDE, то ты говно, а не программист. Иди дальше sed-ом рефакторь, а less-ом логи gprof листай.
>>1287743На винде тоже есть шелл-скриптинг и ее автоматизациияведь билл всегда следит за юникс системами и пиздит оттуда идеи
>>1287856Неоднозначная ситуация. С одной стороны вонючая командная строка, с другой стороны, чтобы переехать на повершелл у всех сборка из коммандной строки и никто ни за что в повершелл не переедет, продолжая жрать говно из комнадной строки. В пинусе же баш в основном как шел используется в терминале. С этим тут всё более однозначно, хотя выбора никто не лишён. Хотя есть кое-какая проблема у баша. Он не поддерживает работу с плавающей точкой. Повершелл поддеживает. Может можно как-то исправить, не велосепидируя собственных утилит?
>>1287862В винде есть батники, есть mingw со всеми линуксовыми утилитами, в том числе и с bash. А повершелл - это высер, превращающий командную строку в какие-то тормозные заклинания. Ненужен.
>>1287931Ну ка расскажи, насколько у этого новоиспеченного языка большая библиотека? Насколько большое комьюнити? Все ли протестено и возможно?
>>1287936Да, экосистема маленькая, но все же лучше чем пердолиться с Си который застрял в 2005.У Кристала как минимум пакетный менеджер есть. И есть уже компании которые его в проде используют. Дело лишь за популяризацией.
>>1287764Ты это, ещё три DE забыл перечислить. Различия между ними только в DE.В чём «чистота» «чистой убунту»?Есть даже all-in-one дистрибутив
>>1287862> Может можно как-то исправить, не велосепидируя собственных утилит?Да, попробуй программу bc.
>>1287931>CrystalОчередной ноунеймЯП уровня йопта-скрипта с сишным синтаксисом. Причём это среднестатистическое описание любого языка младше 2000 года. Я не глядел описание, честно. Давай просто сравним количество гаедов к обоим ЯП. Всё, отсыхай.
>>1288022>с сишным синтаксисомНе, там какое то говно между Паскалем и Питухономclass Object def has_instance_var?(name) : Bool {{ @type.instance_vars.map &.name.stringify }}.includes? name endend
>>1288022>сишный синтаксис>я не гляделОно и видно, что не глядел. Там Рубишный (то есть самый идеальный) синтаксис.
Нахуя в си тип unsigned? Типа почему бы блять тупо функцией принтф не указывать способ вывода: %u или %d имея лишь тип int. Или я чего то недопонимаю
>>1288163unsigned поддерживает битоебство, добавляет бит в диапазон значений, для него определено поведение при overflow/underflowа ещё пачка возможных багов при сравнениях signed-unsigned и вообще при неосторожном использовании unsignedкарочи, нужен ровно в тех местах, где надо битоёбствовать, в остальных местах лучше использовать int
>>1288189Я так и понял, а на переносимость это может повлиять?хотя какая нахуй переносимость че я блять несу, о какой блять переносимости может идти речь если уже давным давно есть языки-конструкторы вроде питона, мда ну пиздос
>>1288064Он просто указал с чего взят синтаксис у Crystal. Что ты петушишь? Неадекват что ли?>>1287936>насколько у этого новоиспеченного языка большая библиотека?Вроде либа поддерживает либы с Ruby, так что с этим почти нет проблем.>>1287931>такой же быстрый CrystalТы хотя бы тесты сам проделай прежде чем вбросы делать.>>1287896>> 2018>> не интерпретацияПоинтерпретируй ты мне тут в лоу левел программировании, петушок.>>1287862>и никто ни за что в повершелл не переедет, продолжая жрать говно из комнадной строкиPowershell как по мне то еще говно. Все равно у юниксов пизже
>>1288224>насколько у этого новоиспеченного языка большая библиотека?Вроде либа поддерживает либы с Ruby, так что с этим почти нет проблем.>вроде
>>1287936Вот биндинги к С либам https://crystal-lang.org/docs/syntax_and_semantics/c_bindings/ . Все, что есть в С, доступно в кристале с минимумом усилий.
>>1288163> Типа почему бы блять тупо функцией принтф не указывать способ выводаЭто работало бы, если бы у тебя было только сложение и вычитание. А вот реализации деления и умножения разные для signed/unsigned.
Какие части программы целесообразно переписывать на Си? Городить абстракции гораздо удобнее на С++, так ещё и неймспейсы помогают писать менее громоздко, что приятно видеть в проектах чуть больше хелоуворда, но что в проекте точно должно быть на Си?
>>1289061>прохожу его. и искренне охуеваю от заданий уровня "Напишите операционную систему" на первой главе.Ты о чем, уважаемый? Я седьмую закончил, нет там такого.
>>1289064Упражнение 1.24. Напишите программу, проверяющую Си-программы на элементарные синтаксическиеошибки вроде несбалансированности скобок всех видов. Не забудьте о кавычках (одиночных и двойных),эскейп-последовательностях (\...) и комментариях. (Это сложная программа, если писать ее для общегослучая.)Последняя задачка первой главы. Вроде как самая челленджная. Предыдущая немногим проще. Даже ковыряя Си один год. Это всё равно становится нетривиальной задачей даже для человека, знакомого с языком.
У меня два вопроса, можно ли так много использовать if else в цикле while? И 2) Как переносить текст в printf, а то слишком длинный в правоалсо че то нихуя не печатается
>>1289071погугли switch(variable) case of RANGE:С ним и красивее будет и компилятор более конкретный ассемблерный код сгенерирует, что немного время исполнения сократит. А в printf() можно переносить, если в конце строки поставить бэкслэш. И писать в новой строке.
>>1289078Бля... У тебя же в коде типо юникод... А в винде в консольке какая-то особая кодировка. Попробуй перед printf() написать такую хуйнюsystem("chcp 1251");для этого нужно stdio.h подключитьпотом после printf() вернуть кодировку на стандартнуюsytem("chcp 866"); И тогда вроде лучше напишет. Вообще вся эта тягомоть с локалями и кодировкой мне самому покоя не даёт, нужно либу себе велосепедировать для этого. Либо вообще откажись от русских букв в выводе printf(). Что в лучшую сторону повлияет на твою культуру кода.
>>1289080>А в винде в консольке какая-то особая кодировка.Бляяя, нахуя они так делают?>system("chcp 1251");Вставил в начало функции. Что-то не работает.Может в main надо пихать?Вообщем переписал все на инглишь.
Почему unsigned long long num = 1 << 32;Выдает ошибку shift count >= width of type [-Wshift-count-overflow]?
>>1289078-fexec-charset=866 -finput-charset=utf-8>>1289093Потому что 1 влезает в int, значит 1 - int. Пиши 1ULL << 32.
>>1289071Боже. Если ты все равно уже умеешь в массивы, какого хуя у тебя по переменной на каждую цифру? Сделай массив и сократи все это до трех строк. Алсо, <= kol там наверняка ошибка, и ты хотел < kol.
>>1289097Ахаха, да я просто делал на быструю руку. В красоту думал в конце привести. И знаешь так и вышло, один хуй прога не работает.Вот к примеру блядский scanf тупо не читает число.Запускаю прогу, просит ввести что-то. Ввожу к примеру 3489,Он пишет vi brosili 0 kibikov podryad.Блять я уже все перебрал спецификаторы!!!
>>1289098> Вот к примеру блядский scanf тупо не читает число.Ты не просил у него число. Ты просил фразу вида vvedi klv broskov 3489. Вот и вводи ее. Целиком со словами. scanf() принимает параметром не сообщение с просьбой что-то ввести, а спецификатор.
>>1289068Мне кажется, что это вообще троллинг когда советуют K&R для полных нубов, для нубов есть Кочан, Прата и т.д. а после можно и K&R почитать.
>>1289106>>1289107учил си на первом курсе по k&rсквозь боль делал упражнения, перечитывал раз за разом непонятные места, включая и приложения где формально язык описанхз что с вами не таку англичан даже что-то вроде поговорки есть, что ты не поймешь по настоящему что написано в книге пока она не начнет разваливаться у тебя в руках
>>1289107Я учил Си по K&R первой редакции (другого не было) и по чужим исходникам. Мне было норм, но я пришел с ассемблера. Сейчас я всем рекомендую Прату, но всегда находится кто-нибудь, кто с пеной у рта защищает K&R. Похуй, всегда можно скачать обе и выбрать ту, которая больше понравится.
>>1289112Бля, вот думаю K&R распечатать, не люблю книги с компа читать.Но у нас распечатка стоит 5 рублей за страницу КАРЛ!.Это 1700рублей. Интересно сколько выходит рублей у людей,у которых есть принтер и собственная краска печатнуть 350стр?
>>1289113k&r всегда в книжных магазинах есть, даже в мухосранскахимхо, эта так книга которую стоит иметь
>>1289113Ты собираешься страницу во весь лист а4 печатать? Нужно печатать по 2 страницы с двух сторон, итого нужно 288/4=72 листа.Распечатать это может бесплатно любой знакомый офисный работник. На лазерном принтере на котором регулярно перезарпавляют тонер себестоимость печати страницы копеек 50.А малому бизнесу нужно деньги зарабатывать, вот и получается по 5 рублей.
>>1289168> О каком буфере речь?Ну на пике же подробно описано. У каждого FILE есть свой буфер (банально массив char) и три режима: нет буферизации (каждый getchar()/putchar() и т. п. летит сразу в ОС), построчная буферизация (ввод читается из ОС до Enter, т.е., построчно, а вывод кладется в буфер и выплевывается, если в буфер больше не помещается или если в буфер прилетела \n) и полная буферизация (буфер читается из ОС, когда полностью пуст, или пишется, когда буфер полностью заполнен). Плюс есть принудительный сброс буфера вне зависимости от режима с помощью flush()/fflush() со stdin не работает. Если хочется, режим и буфер можно задать самостоятельно с помощью setbuf()/setvbuf(). Буферизация сделана потому, что обращение к буферу в тысячи раз быстрее по сравнению с походом в ядро ОС из-за каждого байта.> Разве данные не печатаются в стандартный поток вывода?Печатаются, но режим буферизации зависит от реализации стандартной библиотеки. В винде, если я правильно помню, по традиции буферизация у stdout/stderr отключена (и все тормозит!), в линуксе обычно буферизация отключена только у stderr, а вот у stdout включена построчная буферизация.Т.е., если ты в линуксе сделаешь:#include <stdio.h>#include <unistd.h>int main(void) { printf("Hello, "); sleep(2); printf("world!\nAnd bye!"); sleep(2); }Оно положит первый "Hello, " в буфер, подождет 2 секунды (ничего выведено не будет), положит в буфер "world!\nAnd bye!", увидит \n в буфере и выведет строку, ты сразу увидишь "Hello, world!", потом оно поспит еще 2 секунды, и уже при завершении программы стандартная библиотека, чтобы ничего не проебать, принудительно очистит буфер с помощью fflush(stdout), и только тогда ты увидишь "And bye!".
Как сравниваются числа типа unsigned int и просто int? Допустим имеется 2 переменных с одинаковым расположением битов однако одна из них имеет тип инт а другая Unsigned int, но при сравнении они не равны, вопрос почему? Типа биты же в одинаковой последовательности расположены
>>1289191> Как сравниваются числа типа unsigned int и просто int?Гугли integer promotions или даже arithmetic promotions. Вкратце, суть в том, что для любой арифметической операции, в том числе и для сравнения, Си преобразует операнды к одному типу, обычно к более широкому или точному из двух.> но при сравнении они не равны, вопрос почему?Потому что ты где-то облажался. Если типы отличаются только наличием знака, то ранг одинаковый, и signed преобразуется в unsigned (на абстрактной машине (unsigned int) -1 = -1 + (UINT_MAX + 1) = 0xffffffff, на реальной оно "само" так будет, потому что представления одинаковы), получаем одинаковое представление, числа равны. Поэтому сравнивать signed/unsigned между собой - это опасное занятие, и если уж очень хочется, стоит скастить signed к более широкому типу.
>>1289192Много лет назад у меня был телефонный справочник, его автор навелосипедил свой парсер DBF, и этот парсер читал базу на десяток метров отдельными вызовами ReadFile побайтово - поиск адски тормозил несколько минут. Так что пусть лучше аноны спрашивают, чем пишут подобное говно.
>>1289168У меня какое-то дежавю, буквально вижу такое сообщение уже не один тред, с одной и той же картинкой и все спрашивают, что за буфер.памагити
>>1289078Среда какая? Пердоль кодировку файла с сырцами или найди уже наконец setlocale(LC_ALL, "rus").
Реквестирую какую-нибудь программу на голом Си, с открытыми исходниками, где реализовано ГУИ. Хочу на C + SDL2 игрушку наваять, и тут маленько завис, пытаясь сделать меню.
>>1289398Ну, это наверное не совсем то. Мне бы принципы подсмотреть, а то пока под каждую менюшку отдельная функция в цикле крутится, что, наверное, не очень хорошее решение.
>>1289401> а то пока под каждую менюшку отдельная функция в цикле крутитсяЕсли менюшки полноэкранные, то тебе нужны сцены: структурка с необходимыми данными и указателями на функции Update (обработка пользовательского ввода и всякая анимация), Render и, если нужно, Activate/Deactivate. Делаешь в разное время разные сцены текущими, а единый главный цикл дергает у текущей сцены Update/Render.
Сап синоны, Почему данный цикл генерирует лишь одно число в sum? Я же srand тоже положил в цикл, разве он не должен каждый раз обновляться.Или данный алгоритм возможен лишь в рекурсии?
>>1289423То есть получается огромный массив и в каждой итерации одно и тоже число, которое было рандомно сгенерировано 1 раз в начале
>>1289423Алгоритм отрабатывает за одну и ту же секунду. Убери нахуй srand из цикла, поставь перед while.
>>1289429В цикле же он как бы каждый раз должен был сдвигать начальное число на секунду, а вне цикла нет вроде. Так как сработало то?
>>1289419И у каждой сцены, выходит, свои функции update и render? А если, например, содержимое неоднородно? В одном меню - несколько условных кнопок, в другом - условный текстбокс. Но в любом случае спасибо за направление.
>>1289445Прогони в цикле 10000000000 раз. И проставь время перед циклом и после цикла в обоих вариантах. Вообще по идее должно получиться быстрее вторым способом. Но как оно окажется на деле - хз.
>>1289432> Cделал, сработало. А в чем логика то? Логика в том, что rand() генерирует псевдослучайную последовательность путем каких-то преобразований внутренней переменной (или переменных) seed. При вызове rand() seed изменяется, поэтому каждый новый вызов rand() генерирует новое число, тебе ничего не нужно никуда "сдвигать". srand() нужен не для того, чтобы обновлять состояние генератора или что-то там еще, что ты себе напридумывал вместо чтения документации. Он нужен, чтобы при разных запусках программы rand() выдавал разные последовательности. Т.е., если ты srand() вообще не используешь, то в seed будет что-то по умолчанию (0 или 1, например), а так как результат rand() целиком и полностью зависит от того, что лежало в seed, то без вызова srand(), ты будешь каждый раз получать одну и ту же последовательность, основанную на этих 0 или 1. То же самое происходит, если ты вызываешь srand() в цикле и кормишь его таймером. У time() разрешение - 1 секунда, т.е., велика вероятность, что каждый раз в seed будет попадать все та же константная секунда, в течение которой успевает отработать твой цикл. Одно и то же значение в seed - один и тот же выхлоп. А чтобы все работало правильно, нужно вызывать srand() один раз за все время жизни программы (или потока, если у тебя есть потоки). Лучше всего, где-нибудь в начале main(). И, разумеется, все вышесказанное не касается криптографии, там все иначе, там за использование rand() пинают по лицу.>>1289437Общие функции для всех меню, но своя для рендера самой игры. А дальше нужно больше абстракций. Меню - это указатель/индекс активного элемента и массив элементов управления, каждый из них - тип (класс!) и какие-то данные. render() для меню по очереди рисует каждый элемент, update() для меню стрелочками меняет активный элемент, а остальной ввод обрабатывает в зависимости от типа элемента. Можно опять же для каждого типа завести свои render()/update(), и там уже switch-ем выбирать нужный (или сделать в элементе вместо типа сразу указатель на таблицу функций методов этого типа). И потом это все можно обернуть еще дальше, чтобы магия происходила под капотом, и у тебя получится еще один наколеночный GUI-фреймворк.>>1289445> Что быстрее?Первое. Велик шанс, что компилятор положит значения в регистры, а обмен данными между регистрами на современных процессорах скорее всего будет бесплатным (регистры переименуются друг в друга еще при декодировании инструкций). А вот если компилятор не распознает, что xor - это обмен значениями, и не превратит его в первый вариант, то процессору придется на самом деле выполнять три ксора, да еще и с зависимостями.
>>1289462Там по ебанутому, в нашей библиотеке технические кгини даже нельзя забирать домой, лишь только у них на месте читать,лол.забирать домой можно только худлит
>>1289473gets() сломан искоробки, а rand() можно реализовывать как угодно, лишь бы выполнялось требование псевдослучайности (идентичные последовательности для одинаковых seed) и если начальный seed для srand() влезает в unsigned int. Поэтому нет, не выкинут.
>>1289463>в нашей библиотеке технические кгини даже нельзя забирать домойЭто может быть и плюсом.Например, ты приходишь и читаешь. А не копаешься вкудахте.
>>1289419Поясните в целом за геймдев на си. Знаю только gtk+ GUI для созданий интерфесов, но это не совсем геймдев. А вот анимации и геймплей создавать сложно в целом? Что надо знать, какие то драйвера, директ их или какие то другие теории? Просто для меня это целая непонятная вселенная, знаю что графика есть растровоая ,векторная. но что это? Из каких частей состоит игра?
>>1287941>пакетный менеджер>один финн чисто для лулзов запилил ядро для пакетных менеджеров для це и называет это ядром ОС, опять же, для лулзов
>>1287931>class Greeter> def initialize(@name)> end> def salute> "Hello #{@name}!"> end>end>етот донный синтаксис
https://ideone.com/wx2mMfАнон, можешь помочь с интерпретатором shell? В теории работать должно, но пытаюсь понять где оподливился.
>>1289697>https://ideone.com/wx2mMfargc - int, а не массив##argv -char. двумерный массив всех параметров шелавот так должно быть:int main(int argc, int ##argv){}##-звездочки
бле народ хэлпаните лоускилл долбоебу первачу с лабой.крч нужно в двумерном массиве найти столбец в котором нет ни одного элемента равного нулю(Не используя дополнительные методы и указатели)мне важен сам алгоритм перебора,не могу врубиться как мне найти столбик без нуликов(
>>1289085>Бляяя, нахуя они так делают?Ребята не стоит вскрывать этот код. Вы молодые, хакеры, вам все легко. Это не то. Это не ядро линукс и даже не ГНУ. Сюда лучше не лезть. Серьезно, любой из вас будет жалеть. Лучше закройте компилятор и забудьте что там писалось. Я вполне понимаю что данным сообщением вызову дополнительный интерес, но хочу сразу предостеречь пытливых - стоп. Остальные просто не найдут.
Вопрос про processor cutch(Это же тоже самое что КЭШ?).Допустим есть массив в котором 0-ой указатель сдвинут впрёд, то-есть можно обращаться к отрицательным элементам.Передаю в функцию указатель на 0-ой элемент массива, комп подготавливает сразу кусок памяти. Вопрос: он готовит только правую(впереднюю) часть данных? Ну то-есть, обратись я в функции к отрицательному элементу компу придётся подготавливать уже другой кусок памяти и будет промах КЭШа?
>>1290067Ну я ж у специалистов полюбопытсвовать хотел, к тому результат моей проверки может быть не универсален.
>>1289671> А вот анимации и геймплей создавать сложно в целом?В целом просто, на практике сложно.> директ ихC OpenGL в сишечке приятнее.>>1289832> мне важен сам алгоритм перебораВ массиве array[num_rows][num_cols], для каждого столбца c, для каждой строки r: если array[r][c] нолик, ставишь флаг, что столбец зашкварен и выходишь из цикла по r.>>1290065> cutch(Это же тоже самое что КЭШ?).Не знаю такого.> Передаю в функцию указатель на 0-ой элемент массива, комп подготавливает сразу кусок памяти.Это немного не так работает. Вряд ли твой компилятор генерирует явный префетч, а сам процессор закэширует кусок массива при первом обращении, а не при передаче параметров. Гугли кэшлайн (cache-line, линейка кэша). На границы массива и указатели процессору насрать. Если какого-то значения нет в кэше, он прочитает из памяти сразу блок размером с кэшлайн (64 байта), выровненный на кэшлайн (т.е., может заодно прочитать память и чуть ниже того адреса, на котором был промах). Соответственно, если массив был выровнен по кэшлайну, то по отрицательному индексу будет промах, а если нет (malloc выравнивает только на 8 байт, например), то промаха может и не быть.
>>1290157Мде... Перевелись нынче байтоёбы. Вот батя мой компилировал в командной строке, а писал на превокартах. Ещё писал порой прямо в оперативке, приатачиваясь к процессам дебагером.
Для чего изучать Си? Подойдёт как первый язык? До какой степени стоит его освоить?Начал 1,5 месяца назад, для меня это первый язык, идёт очень туго, сейчас с уверенностью могу сказать что понимаю что такое указатели и как ими пользоваться, и вот думаю стоит ли продолжать. Сам никуда не спешу, если анон посоветует дойти до понимания каких-то тем, а потом перекатиться на условно джаву или пхп что бы через 3 года быть уверенным джуном или даже сеньером. Готов принять ваши советы, не смотря на тугость изучения мне нравится то, что я делаю.Кстати что за тема со звёздочками? *
>>1290311Тож жду ответа на твой пост.Алсо, сам не так давно начал Си изучать.Ну думаю , что все так да. Раз уж начал, то доводи до конца. Хотя бы ознакомится со всеми возможностями и синтаксисом точно надо, не думаю, что это долго. Долго - это изучать всякие библиотеки и писать что-то серьезное.
>>1290311>с уверенностью могу сказать что понимаю что такое указатели и как ими пользоватьсякак относятся друг с другом указатели и массивызачем возвращать из функции указатель на указатель?как работать с указателями на функции и зачем это надо?особенности работы с нетипизированным указателем и зачем он нужен?вангую, что ты еще ни одной сложносвязанной структуры данных не запилил, не говоря уж про хоть какое-то подобие библиотеки решающей часть своего функционала через каллбеки, напримерну или ничего не писал, что читает из бинарного файла или из сети в банарном формате
>>1290481Правильно вангуешь про структуры и прочее, на первые 3 вопроса я могу дать ответ без Гугла, что такое "нетипизированный" могу только догадываться. интересно кто-нибудь писал сложные структуры и то что написано в том посте всего через 1,5 месяца изучения Си
Приветствую уважаемые. Стремящийся репортинг ин.Никак не могу найти пикрелейтед. Несмотря на год выпуска, у сего труда очень хорошие отзывы, даже с 2018 года.Да и как такие авторы могут написать некошерную книгу?Еще нашел Седжвика Алгоритмы на Си, очень рад, ибо можно сосредоточиться собственно на алгоритмах а не расписывать иерархию классов для сортировки пузырьком.Вообщем, прошу помощи.Благодарю.
>>1290634на либгене нет электронной копии, есть data structures using pascal тех же авторовна амазоне можно купить не новую за 1.5 бакса
>>1290578нетипизированный указатель это voidно речь не о том чтобы знать что он существует, а о особенностях работы с ним и зачем вообще применять..
Почему я могу сделать так: char s; s="abc"; (это кстати расширение gcc что ли?(присваивание строки после инициализации))Но не могу так: int i ={1,2,3};В чём принципиальная разница? И где находиться та строка, на стеке?
>>1290634Поддвачну.Есть вообще хорошиая книга про Data Structures в С?<spoiler>Как введение в алгоритмы, например.</spoiler>
>>1290750> s="abc"А почему бы и нет? У тебя указатель, у строкового литерала есть адрес.> Но не могу так:> int i ={1,2,3};Давно уже можешь. Тип укажи только. int ∗i = (int[]) {1,2,3}
>>1290755Офигеть, сколько про С ни читаю в интернете "int ∗i = (int[]) {1,2,3}" такого не встречал, спасибо.
>>1290481>как относятся друг с другом указатели и массивыМассив это и есть указатель, только он указывает на начало связных блоков памяти.>зачем возвращать из функции указатель на указатель?Тем самым мы возвращаем двумерный массив.>как работать с указателями на функции и зачем это надо?Я хз, пусть другие дополнят>особенности работы с нетипизированным указателем и зачем он нужен?Что бы принять данные которые нам не известны (их тип нам не известен)
>>1290849>Я хз, пусть другие дополнятЧтобы передавать другие функции как аргументы для функций, но я про это только читал, сам не делал. Ещё такая хрень нужна, чтобы организовать функциональное программирование, но что это значит я тоже не знаю. Там на педивикии написано, что высшие функции - это те функции, которые принимают в качестве аргументов другие функции.
>>1290849>Массив это и есть указательневерно>зачем возвращать из функции указатель на указатель?>Тем самым мы возвращаем двумерный массивневерно
>>1290863> Чтобы передавать другие функции как аргументы для функцийТогда вопрос с подвохом: почему это компилируется и работает (нет, макаба не сожрала звездочки)?static void hello(void) { puts("Hello, world!\n"); }static void invoker(void func(void)) { func(); }int main(void) { invoker(hello); }>>1290877Второе с некоторой натяжкой верно. Можно организовать двумерный массив как массив указателей на одномерные.
>>1290863указатели на функции в си используются для более банальных, но практичных вещей, чем попытки симитировать пункции первого порядка и высшие функции из фп
>>1290931Структуры как замены классов, а колбеки в виде указателей на функции вместо полиморфизма, хехе.алсо в ядре линукса такое много где используется
>>1290934> а колбеки в виде указателей на функции вместо полиморфизмаКак будто в этих ваших крестах не так. Ой, они называются по-другому.
>>1290851Нету :(((Проблема усугубляется тем, что книгу под абсолютно тем же названием написал индус, и именно она вылазит изо всех дыр.
>>1287758вызовы ядра тебе не нужны. из юзерспейса у тебя есть набор библиотек предоставляющих тебе какие-то стандарты.например gnu c lib:> This section discusses the various standards and other sources that the GNU C Library is based upon. These sources include the ISO C and POSIX standards, and the System V and Berkeley Unix implementations. > • ISO C: The international standard for the C programming language.> • POSIX: The ISO/IEC 9945 (aka IEEE 1003) standards for operating systems.> • Berkeley Unix: BSD and SunOS.> • SVID: The System V Interface Description.> • XPG: The X/Open Portability Guide.наверно, если говорить за аналогию винапи, то это posix для линя. хз кстати, можно ли бсд расширения использовать в лунтике, конкретно через эту библиотеку.
засрали всё, говно жрут.подумал тут в в аллокаторе свой хедер заделывать, хотя-бы чтобы всё отчищать было проще, при выходе с ошибкой из фрейма. так норм определение выравнивания?:#ifdef ULLONG_MAX#define LLONG_T long long#else#define LLONG_T char#endif#ifdef LDBL_DIG#define LDOUBLE_T long double#else#define LDOUBLE_T_T char#endif#define ALIGNOF(T) offsetof(struct { char c; T member; }, member)#define ALIGN_MAX ALIGNOF(union { char a; sint b; int c; long d; LLONG_T e;\ void@ f; float g; double h; LDOUBLE_T i;})
>>1291098Почему дефайны вместо тайпдефов?> offsetof(struct { char c; T member; }Куча невнятного говна в отладочной информации из-за тестовых анонимных структур. Чем тебя stdalign.h не устраивает, зачем велосипеды?> ALIGN_MAXУ различных SIMD-типов выравнивание может быть от 16 до 32 (в зависимости от компилятора и платформы). alignof(long double) не спасает, в 32-битном коде на винде оно даже меньше, чем alignof(double).
>>1291142>Чем тебя stdalign.h не устраивает, зачем велосипеды?тем что он есть только в с11. мне поебать на отладочную информацию, я отлаживаю принтами и gdb когда падает.> alignof(long double) не спасает, в 32-битном коде на винде оно даже меньше, чем alignof(double). какая разница, если я их всех перечислил?> Почему дефайны вместо тайпдефов?и нахуя мне тейпдефами засирать пространство имён? я в этом же файле undef сделаю и всё.
Приветствую уважаемые эксперты.Вот тут описывается создание битового массива:http://www.mathcs.emory.edu/~cheung/Courses/255/Syllabus/1-C-intro/bit-array.htmlЭтот кусок показался мне странным:https://pastebin.com/mhykVexwЭто нормально такие трюки проводить между int и unsigned int?Не лучше ли использовать только unsigned int в таком случае?
>>1291325Не понял почему пейсбин не высрался.Вот код:int A[100]; // A = 0 means false, A = 1 means true int i = k/32; // i = array index (use: A)int pos = k%32; // pos = bit position in A unsigned int flag = 1; // flag = 0000.....00001flag = flag << pos; // flag = 0000...010...000 (shifted k positions) A = A | flag; // Set the bit at the k-th position in A
>>1291325> Это нормально такие трюки проводить между int и unsigned int?Более или менее. Но бессмысленно, потому что> Не лучше ли использовать только unsigned int в таком случае? Лучше. Я еще лучше uint32_t, а то в инте не обязательно 32 бита.> pro versionФууу. x[index >> 5] |= 1u << (index & 0x1f)
>>1291397>еще лучше uint32_t, а то в инте не обязательно 32 бита.Хотел спросить кстати, но подумал что наверное вообще нубский вопрос, стыдно
>>1291445Ну у тебя к инту идёт битовое или, так что норм, если бы было наоборот могли бы возникнуть проблемы из-за знакового бита, а так вполне все норм, тут же unsigned просто как бит используется.Но вообще странно, что так сделано, т.к. если вдруг будет 1 << 31, то возникнет сюрприз.
>>1291449uint32_t макрос кроссплатформенный, который гарантирует тебе беззнаковую 32-битную переменную.>>1291450Это не проверсия, это нечитаемое говно, не пытайся это понять, это не сложно, но такой говнокод понимать а уж тем более писать не стоит.если коротко index >> 5, тоже самое, что index / 32, 1u << это беззнаковая единица, а нужное для неё место даёт index & 0x1f, 0x1f это 32 в хексе, соответственно index & 0x1f тоже самое, что index % 32, думаю соответствие с кодом, который ты скинул сам найдёшь
>>1291515Добавлю, размер инта не управляется стандартом и зависит от платформыкомпилятораА ещё я там опечатался, 0x1f это 31 в хексе, но % 32 это верно.
>>1291515> это нечитаемое говноВот деление и остаток - нечитаемое говно. А тут сразу ясно, какие биты индекса за что ответственны. И это практически идиоматичный код, он такой везде. Ты либо понимаешь побитовые операторы, либо выбираешь другой язык.
Привет, аноны.В коде:char a, b;scanf("%c", &a);scanf("%c", &b);Столкнулся с проблемой переноса line feed (\n) в буфер stdin и последующей инициализацией переменной b при вызове scanf этим символом \n. Погуглив, нашел этоhttps://stackoverflow.com/questions/7898215/how-to-clear-input-buffer-in-cТред мне очень помог, я понял, почему возникает такое поведение, и как от этой "проблемы" избавляться.После этого решил немного аналогично поиграться, но уже с массивами char'ов. Написал простенький код, чтобы увидеть line feed в массиве.#include <stdio.h>int main () { char a[10]; char b[10]; scanf ("%s", a); scanf("%s", b); for (int i = 0; i < 10; i++) { printf("%d\n", a); } printf("new\n"); for (int i = 0; i < 10; i++) { printf("%d\n", b); } return 0;}Вводные данные:HelloWorldЧто я ожидаю увидеть:72101108108111010 //аски-код \nмусормусормусорnew871111141081000мусормусормусормусорЧто я вижу на самом деле:721011081081110мусормусормусормусорnew871111141081000мусормусормусормусорГде код line feed символа?
>>1291543быстрофиксв "что я ожидаю увидеть" у World тоже должен быть код \n, т.е....new87111114108100010 //аски-код \nмусормусормусор
Прочел седня такой пост на форуме:"самое главное понять самую важную вещь. в С++ многомерные массивы - не настоящие. они все равно представляют собой одномерный массив. например int [2][2][2]; все равно будет как int [8] в памяти лежать, а первая запись лишь языковая форма вводящая новый тип. поняв это ты придешь к простой истине, что имея указатель на 0-й элемент любого массива ты получаешь начало массива любой размерности.поэтому int #p = &mass [0][3][5][8]; - будет показывать на определенную точку в этом многомерном массиве а int#p = &mass [0][0][0][0]; гарантирует тебе его начало. а далее игра смещенийиначе будешь использовать синтаксис монстров int (#a)[4][4]---- # = звездочкиВопрос, в Сишке так же?
>>1291558в си и с++ нет многомерных массивов на уровне языкавсеочень легкокак и, например, нет строкнет подсистемы ввода-вывода
>>1291558>многомерные массивы - не настоящие. они все равно представляют собой одномерный массивУ тебя память одномерная, какие "настоящие" многомерные массивы вообще могут быть? Пиши свои типы на псевдо-ООП чтобы они тебе их имитировали.
>>1291522Новичкам сложно читать битовые операции и понимать, что они делаютнекоторые даже не представляют, как выглядит число в бинарной записи, о каких битовых операциях идёт речьА судя по его вопросу он как раз новичок.
>>1291663Компилятор понял, что значение б ты не меняешь, а т.к. это не указатель, то и адрес ты не поменяешь, и он скорее всего, чтобы лучше понять чекни асм просто выкинул твой вызов, не создавал переменную б, а тупо распечатал 3 как строковый литерал.
>>1291663А вообще ты сделал какую-то хрень.Ты взял адрес переменной и пытался присвоить этому адресу другой адрес.
>>1291671Чтобы было понятнее.Если ты хочешь поменять значение переменной, то передавай её адрес, если ты хочешь поменять адрес, то тебе нужен указатель, который содержит в себе именно адрес, который ты можешь поменять, короче сделай б указателем на инт и передавай в функцию без амперсанда, должно сработать.
>>1291543> Где код line feed символа?Продолжу повторять итт, что scanf - нелогичное, неюзабельное говно. scanf перед чтением очередного значения пропускает из входного потока все isspace() (т.е., и \n тоже), кроме случаев с charset-ом %[], потому что он может содержать пробелы и %с, потому что пробелы - тоже символы. А %s, как все остальные спецификаторы, сначала пропускает все пробелы, а потом читает до первого пробела.>>1291558> в С++ многомерные массивы - не настоящиеБред. Любой массив настоящий, если с ним можно работать, как с массивом. Без разницы, как он там реализован - как массив массивов или как массив указателей на массивы. А так, да, в сишке так же, оно из сишки в кресты и пришло.>>1291663> ПОЧЕМУАргументы функций полностью аналогичны локальным переменным (кроме того факта, что их инициализирует вызывающая функция). Ты изменил локальную переменную a, это ни на что не повлияло.
>>1291763>Любой массив настоящий, если с ним можно работать, как с массивом.в си есть производный тип - одномерный массив, задается через соответствующий описатель, семантика оператора индексирования определена так что позволяет работать с массивом посредство арифметики указателей, не более тоготочка
>>1291803Это никак не доказывает, что многомерных массивов нет, а лишь говорит о том, что можно красиво делать многомерные массивы из одномерных, и для этого нахуй не нужны запятые в квадратных скобках.
>>1291689Если тебе нужно поле класса передать в другую функцию не член класса и там изменить, например.
>>1291813>Это никак не доказывает, что многомерных массивов нетНу как бы я согласен, что если что-то выглядит и ведет себя как утка, то это утка, но по факту же это одномерный массив указателей.
>>1291558Да, в C тоже. Связано с тем что указатель на начало статического массива в памяти процесса нигде не лежит.type arr[size];Понятно что:(&arr)[m][n] == (&arr + m)[n] == arr[msizeof(arr) + n]Можно создать динамическое подобие &arr, которая будет работать аналогично. Перемешивать обыкновенные указатели и массивы нельзя:if ((void) &arr == (void*) arr) printf("Wtf\n");
а что значит настоящий многомерный массив? это когда указатели хранятся или когда размер каждого измерения?
>>1291823Скажем так, они для наших глаз есть. Но просто хранятся в фиической памяти по другому. А так все есть
>>1292317> Но просто хранятся в фиической памяти по другомуДавай, неси пример из языка с многомерными массивами и показывай, чем в практическом смысле они отличаются от сишных, какая разница в генерируемом коде и как именно они по-другому хранятся.
Больше всего меня раздражают операторы * и & для разыменования, и взятия указателя. Надо было выбрать что-то другое.
>>1292481Тебе неправильно ответили.Ты взял указатель и передал его в функцию.В той функции ты изменил значение ЛОКАЛЬНОЙ переменной a на некоторое другое значение, потом вышел. При этом в main ничего не поменялось.а - локальная переменная в функции. Действия с ее значением без на main никак не влияют. Тебе нужно чем-то выстрелить по этому указателю.Например: a = 4. Или a = c.В asm смотреть за этим не нужно.И еще, ты просто так не сможешь сделать так, чтобы b в main ссылалась на какое-то другое место в памяти. Можно только пошатать значение.
Подскажите сортировку для 5000000 элементов, надо только название, код сам напишу. Время очень критично. Массив целочисленный.
>>1292090Какой пиздец. Эталонный говнокод. Прям образец для, рамки не хватает, как программировать нельзя.
>>1292817Я конечно понимаю, что юношеский максимализм помноженный на сексуальную неудовлетворённость дурманит твой мозг, но переменные вида pmss/vd, вложенные циклы и прочие «алгоритмы» это фиаско.
зато оно работает, защищено от переполнений, от выхода за границы индексов. но важно же приебаться к вложенным циклам в тесте.
>>1287378 (OP)Здравствуйте, мне нужна помощь, суть такова. У меня есть динамический массив, сделанный через realloc. Мне необходимо иметь указатель на один из элементов данного массива. Всё бы хорошо, но у меня есть ещё и второй динамический массив тоже сделанный через realloc и когда я увеличиваю размерность этого второго динамического массива, то указатель уже указывает не на один из элементов первого массива, а на непонятно на что. Олды, подскажите как быть?
>>1292959Еще раз. У тебя так: ты хранишь указатель на массив, хранишь указатель на элемент внутри массива, realloc() перемещает массив в новое место памяти, и указатель на элемент начинает указывать на мусор (возможно, не после первого же realloc, а возможно, как у тебя, после realloc другого массива - это все зависит от реализации менеджера памяти). Но можно так: хранишь указатель на массив, хранишь индекс элемента (смещение внутри массива), можешь хоть смещение в байтах хранить, если у тебя элементы разного размера - похуй. Больше данных ты от этого хранить не станешь, но доступ становится сложнее на целую одну операцию. Там, где ты писал ∗elem_ptr или elem_ptr[0], ты будешь писать ∗(array_ptr + index) или array_ptr[index]. Если тебя это чем-то не устраивает, покажи кусок кода с примером того, что ты пытаешься сделать.
>>1293185Да это понятно, я сначала так и хотел делать, но дело в том, что мой массив - это массив структур, у которых поля - это указатели на элементы этой же структуры (по сути сеть). И если я хочу перейти от одного узла сети к другому, мне необходимо менять указатель на текущий элемент, который я возьму из поля текущего элемента. Я не могу взять индекс массива следующего узла сети, потому что в формате элемента он отсутсвует, понимаешь?
>>1293521Ты что-то делаешь очень неправильно.> у которых поля - это указатели на элементы этой же структурыТы все еще можешь хранить офсеты вместо указателей. Ты можешь даже хранить офсеты внутри указателей, хоть это и UB, и вообще дикий говнокод.> потому что в формате элемента он отсутсвует, понимаешь? Понимаю. Отсутствует - добавь.Но если уж очень хочется, есть другой вариант. Храни массив кусочками. Выделяешь массив под свои структуры с запасом (ну там сколько не жалко, допустим, сразу пару сотен элементов), хранишь количество заполненных элементов или помечаешь неиспользованные как-нибудь - похуй. Когда этот кусок полностью заполнится, вместо того, чтобы realloc()-ом менять его размер, выделяй другой, новый кусок malloc()-ом и начинай заполнять его. Естественно, тебе придется хранить указатели на все куски твоего массива, хотя бы для того, чтобы потом все это освободить правильно. Тебе придется поддерживать какой-нибудь free-list для удаленных элементов, чтобы можно было втыкать поверх них новые элементы. Т.е., фактически придется написать небольшой кастомный аллокатор. К тому же, из-за того, что массив перестанет быть непрерывным, тебе будет сложнее его обходить. Но третьего варианта тут нет.
>>1293538>Отсутствует - добавьДобавил ещё вчера, вроде нормально. Просто не хотелось поначалу засорять структуру, вот и пришёл сюда в поисках более элегантного решения, но раз такого нет, то придётся оставить как есть. Спасибо.
>>1293543Если тебе о нем не сказали, не значит, что его нет.80% проблем идут от хренового дизайна, уверен, если ты года через два попробуешь сделать тоже самое, ты найдёшь намного более интересный подход
>>1293648Просто вспомни, что "строка" - это массив char с неявным \0 на конце. Когда ты используешь массив в выражениях, он кастится к указателю. Вот и твои вопросы сводятся к тому, что будет, если вычесть один указатель из другого или прибавить что-то к указателю.> "1345" - "1345"ptrdiff_t x = адрес одной строки - адрес другой строки. Разница между адресами строк в штуках char (т.к. строка - массив char). Но вообще тут undefined behavior: одна из возможных проблем в том, что если компилятор схлопнет эти два одинаковых литерала в один, разница будет 0, а если не схлопнет - какое-то число. Поэтому вычитание указателей работает правильно только когда указатели указывают на разные части одного и того же объекта.> "1345" + 1(адрес "1345") + 1, т.е., указатель, указывающий на "1345" + 1 = указатель на "345".
Двач,выручай!Выделить под массив динамически память.Обращаться к элементам массива необходимо используя указатель.1. В одномерном массиве, состоящем из n вещественных элементов, вычислить: - сумму отрицательных элементов массива;- произведение элементов массива, расположенных между максимальным и минимальным элементами
Как начать писать маленькие проекты если никогда ничего серьёзного не писал кроме задач на 3 функции максимум. Что почитать, посмотреть?
Антон, посоветуй показ книжку по логике, необязательно компьютерной. Чтобы я прочитал и понял что нелогично было спрашивать такое у анона
>>1293915попенсорс проект найди, читай код, фикси баги простые.Например https://github.com/neovim/neovim/labels/good%20first%20issue
>>1292932Запили свой динамический массив, который использует не realloc, а выделяет память чанками некоторого размера. Перегрузи всякие операции типа ++ и будет тебе счастье.
>>1294075Полный бред. Числа не вещественные ни разу, какие-то промежуточные копирования массива, хотя ты его и так не модифицируешь, задание не прочитал - произведение не то. Реально задача решается максимум двумя циклами.
>>1293828по-моему этот код лучше/ Задание 1: Написать программу в соответствии с вариантом, выделив под массив динамически память.Обращаться к элементам массива необходимо используя указатель.1. В одномерном массиве, состоящем из n вещественных элементов, вычислить: - сумму отрицательных элементов массива;- произведение элементов массива, расположенных между максимальным и минимальным элементами./#include <stdio.h>#include <conio.h>void main () {int i,n,tmp1=0,tmp2=0;int proizv=1,sum=0, max, min;//vvod massivado{printf("Vvedite kol-vo elementov massiva (<30)\n");scanf("%d",&n); } while (n>=30);float b[n];for (i=0;i<n;i++) {printf("Vvedite element [%d]\n", i+1);scanf("%f",b+i); } for (i=0;i<n;i++){if ((b+i)<0){ sum+=(b+i); printf("Summa otriz elementov matrici = %d\n", sum);}}//max max=b;for (i=0;i<n;i++){if ((b+i)>max){max=(b+i);tmp2=i;}}printf("Max element matrici = %d\n", max);//minmin=(b+1);for (i=0;i<n;i++){if ((b+i)<min){min=(b+i);tmp1=i;}}printf("Min element matrici = %d\n", min);for (i=tmp1+1;i<tmp2;i++){ proizv=proizv(b+i);} printf("proizv mezhdu min i max :%d",proizv); }
>>1294110А если индекс максимального элемента меньше, чем индекс минимального? И вообще, кто-нибудь здесь способен решить ОДНИМ циклом >>1293828 ?
>>1294165Ну, C17 - это мелкие фиксы, никаких фич. И гораздо хуже, что Pelle дропнул поддержку 32-битных ОС. Компилятор, который не только не кроссплатформенный, но даже на собственной платформе не везде работает - это эталонное нинужно.
>>1294128Поиск минимального и максимального элемента это уже два цикла, чисто в теории можно объединить в один, но нахуя? Есть такое условие в задаче?
>>1294196> чисто в теории можно объединить в один, но нахуя?Потому что гонять два цикла для такой простой вещи - идиотизм даже в нашем современном мире.> Есть такое условие в задаче?Нет. Но быть макакой стыдно.
Есть какой-нибудь источник в котором описаны сокращение типа if (!str) или while (str) и подобные. Часто читая код натыкаюсь на подобные сокращения и по пол часа ищу их в гугле
>>1294075Кстати, никто не мешает написать такfor (int j = 0; j < size; j++) { if (numbers[j] < min) min = numbers[j]; if (numbers[j] > max) max = numbers[j]; }и не нужно создавать кучу циклов
двачик,выручайДвумерный массив, содержащий равное число строк и столбцов, называется магическим квадратом, если суммы чисел, записанных в каждой строке, каждом столбце и каждой из двух больших диагоналей, равны одному и тому же числу. Определить, является ли данный массив А из n строк и n столбцов магическим квадратом.(размерность с клавиатуры+это должно быть решено чере указатели и должна быть выделена память через ,malloc)если западло не пишите код,мне бы просто логику усвоить ,я делал аналогичную хрень без указателей ,но с ними ничего не выходит
>>1294411В обычном массиве a[n][n] ты адресуешь элемент как a[y][x]. В динамическом массиве a[n ∗ n] ты адресуешь элемент как a[y ∗ n + x]. Суммы циклом посчитаешь, ничего сложного там нет.
Почему нихуя не выводит, двач? Почему отрицательная обыкновенная дробь, меньшая единицы по модули, в СИ не меньше 0? Т.е. -6/6 СИ понимает что она меньше нуля, а вот -5/6 и т.д не понимает?
Господа. Не так давно узнал, что все (или во всяком случае те, что используются большинством) операционных систем, используют для адресации виртуальной памяти лишь 48 бит из 64 битного указателя (на 64 битных архитектурах, само собой). Что означает, что старшие 16 бит фактически можно использовать для данных. Так же слышал, что это используется для реализации tagged pointers. Собственно вопрос, каковы подводные камни и стоит ли этим пользоваться (для реализации тех же виртуальных машин, например). Пока вижу единственный недостаток в том, что перед тем, ка использовать указатель, как указатель, если в его старших 16 битах что-то лежит, надо эти 16 бит обнулять (тут кстати неясно, почему ОС просто не игнорирует их, тогда бы не пришлось этого делать).
>>1294468> почему ОС просто не игнорирует ихПотому что ОС их как раз игнорирует, а вот процессор очень обижается, если адрес не в канонической форме.> надо эти 16 бит обнулятьЕсли бы. Туда надо дублировать 47-ой бит. Две лишних инструкции вместо одной.> каковы подводные камни и стоит ли этим пользоватьсяЕсли обязательно нужно вкорячить в указатель дополнительные данные, а сделать жирные указатели (т.е., структура с указателем и данными к нему) ну вот никак нельзя - пользуйся. Но это все грязные хаки, и нужно сто раз подумать сначала.Алсо, если тебе нужно меньше бит (например, флаг какой-нибудь указателю поставить), лучше используй выровненные указатели, они портабельнее, и их фиксить проще: например, обычный malloc() без дополнительных телодвижений выравнивает на alignof(double) == 8 (обычно), и 3 младших бита - твои.
Хвощ, ковыряю Си, запрашиваю объяснение сего. Если я правильно понимаю, s содержит адрес первого элемента массива. Функция печатает элемент массива, затем меняет адрес, хранящийся в s, на адрес следующего элемента массива. Но загадкой для меня является сочетание while (s). Что это значит? Адрес, который s содержит, рано или поздно выйдет за границы массива. Если он пустой, то указателю присвоится значение 0 и цикл прервется. Но что если по этому адресу хранится какое-нибудь значение?int puts (const char s){while (s) putchar (s++);return 1;}
>>1294893Если строка пустая или неуспех при выделение затребованной памяти.А вообще это весьма неправильный способ проектирования программы, так как память можно выделять поблочно, а в представленном случае можно лишь сказать, что автор данной строки либо лиственник, либо конченный долбоёб.
>>1294924>автор данной строки либо лиственник, либо конченный долбоёб.Хуйня, норм код доя смузихлебов. Если по хардкору, то в чанк можно побайтово и копировать, без подсчета длины строки, если не додумался хранить длину в переменной.
##mas;А когда мы очищаем двойной массив с помошью функции free(mas), то массивы внутри этого двойного массива тоже автоматом чистятся ?:)
Реально ли вкатиться в байтоебство и найти работу в России?Собираюсь через переехать в спб из своей мухосрани, но есть еще 1-2 года в запасе, которые можно будет потратить на изучение разных штук и технологий. Я понял, что успешный байтоеб в 2019 году должен уметь: в C, C++, Linux, Linux Kernel и какой-нибудь скриптовый язык вроде питона и систему контроля версий, а также алгоритмы и структуры данных для собеседования.Стоит ли игра свеч? Или лучше оставить байтоебство как хобби, а работать где-нибудь в вебе или энтерпрайзе?
union { int i; short b;}Как сделать union у которого бы b выводило старшую, а не младшую половину? Что-то типаunion { int i; struct { short a, b } b;}Но только чтобы обращаться к старшей половине можно было бы не union.b.b, а просто union.b?
>>1295660вот так, если компилятор поддерживает анонимные структурыunion {int i; struct { short a, b };}
>>1287378 (OP)ой код#include <stdio.h>#include <limits.h>int main(void){ int a=1000,c,b; stop: scanf("vvedite cteneh:%d",&c); for(b=0;b!=INT_MAX;b++) { a=a>>b; if(b==c) { break; } printf("%d\n",a); } goto stop;}
>>1295660Сделай это битовой операцией, хули ты. Обращаешься в твоём случае к i, и делаешь (i & (0xFFFF << 16))
>>1295831Но лучше не используй инт, используй unsigned int, а то после такого сдвига настанет пиздец знаковому биту.
>>1295760Алсо можно ещё так.union { int i}Что-то-там = i & 0s //старшие биты IЕсли хочешь получить старшие биты как просто биты, то ещё можешь сдвинутьно бля не двигай знаковые переменные, иначе тебя бог накажет>>1295831-кун
>>1287378 (OP)Аноны, может кто нибудь знает как найти параметры функции в памяти? И как они вообще расположены? Возможно есть статейки на эту тему.
>>1290634В последний раз попрошу анона помочь найти в оцифрованном виде и больше не буду вскрывать эту тему.
>>1291515>index & 0x1f тоже самое, что index % 32,Я реально сейчас в катарсисе. Почему я не знал об этом? Это же гениально.Что быстрее вычисляется, остаток или AND, я думаю вопрос риторический.Хотя:Optimizing compilers may recognize expressions of the form expression % constant where constant is a power of two and automatically implement them as expression & (constant-1). This can allow writing clearer code without compromising performance.
>>1296120> Optimizing compilers may recognize expressionsДа. Каждый первый компилятор умеет в умножение через lea и/или сдвиги, деление через сдвиги и остаток через &. И еще умеют деление умножением заменять. Но> This can allow writing clearer codeэто хуйня полная. В варианте с & сразу видно, что оно маскирует биты, видно, сколько битов и все такое. А с % надо об этом думать. Традиционно, для улучшения понимания происходящего, даже после того, как компиляторы научились оптимизировать, если дело касается битоебли, используют сдвиги и логические операторы, а если не касается - нормальные умножение, деление и остаток.
>>1296104Ну в памяти оно лежит в все подряд, тебе только нужно определиться что за тип данных, колличество и порядок элементов передающихся в такую функцию, выцеплять можно через указатель, например. Просто добавить к нему 1 и получишь следующий после адреса "n" адрес.https://rsdn.org/forum/cpp/418970.1Первая же ссылка в Гугле, можешь ещё по теме поискать.
>>1287378 (OP)Анончи, можно ли на Си создать двумерный массив, второй элемент которого является массивом переменной длины:[...[0, [1, 2, 3, 4, 5]],[1, [1, 2]],[2, 0]...]
>>1296331> Ну в памяти оно лежит в все подряд> выцеплять можно через указательНи в коем случае нельзя так делать. Это работало с 32-битным __cdecl в x86. В современном мире параметры могут лежать и в SIMD-регистрах, и в обычных, и в стеке, в зависимости от их типа и ABI в целом (т.е., va_arg(ap, int) и va_arg(ap, float) могут читать из разных мест). Поэтому #include <stdarg.h> va_list, va_start, va_arg, вот это все.>>1296392Статически - красиво никак нельзя не заставить компилятор сгенерить безымянные вложенные массивы, и это очень огорчает, когда тебе нужно задавать статически всевозможные древовидные структуры в Си, но можно сделать это явно, по частям, как макака: https://ideone.com/P0qbBE
>>1296434А чего вам не нравится? Про руки я пошутил, для ленивых есть кодогенерация. У меня в одном из проектов килобайт этак 60 таких вот массивов, разве что слегка сложнее: там список типов сущностей, списки их свойств и дочерних сущностей, ну и методы всякие, для манипуляции и (де)сериализации. Нужно было такое на крестах писать, но когда я это осознал, было уже поздно.
>>1296103Есть соглашения о передаче аргументов в функцию.Для amd64 Linux, System V ABI:Первые аргументы в регистрах rdi, rsi, rdx, rcx, r8, r9, иногда еще xmm.Остальные лежат в стеке задом наперед.
>>1296454>есть кодогенерацияЭто понятно. Я еще вариант придумал, хранить data в сплошном бинарном массиве, а в инициализации указывать ссылку на этот массив и смещение. Какой вот стул выбрать, пока не ясно. И тут вопрос, не распидарасит ли конпелятор мой бинарный массив, похеря смещения.
>>1296511Бля. Ты прав. Я вспоминал об этом варианте, но когда-то раньше у меня с ним были какие-то проблемы, и я даже не удосужился затестить, когда отвечал тут >>1296433. Кстати, можно обернуть инициализатор в макрос, тогда и нуль-терминатор не понадобится.>>1296679Сам посчитай: https://www.sqlite.org/2018/sqlite-amalgamation-3250300.zip Похуй, сколько строк в файле. Программу разбивают на модули по смыслу, и чтобы не пересобирать и не линковать лишнее из-за мелких изменений. А к читаемости это никак не относится. Ну, разве что ты пользуешься модными "редакторами" на электроне, но в таком случае ты сам выбрал страдания.
>>1296681>Кстати, можно обернуть инициализатор в макросОставить поле длины и подсчитывать макросом? Кокой же вариант выбрать, хм...
>>1287378 (OP)Может кто-нибудь посоветовать какую-нибудь литературу по ipc/параллельному программированию в POSIX и System V? Не по основам, с безопасными реализациями алгоритмов.
main(){func1();func2();pthread_create();}Тут все функции выполнятся строго по порядку, или компилятор может сделать так, что pthread_create() начнёт выполняться раньше?
>>1287378 (OP)решил я тут пдставить очко под этот ваш си, ебать, че там скачивать нужно, нотпад хуе мое?стремящаяся-умственно-отсталая-веб-обезьянка
Анончики хэлп. Create a function ft_count_if which will return the number of elements of the array that return 1, passed to the function f.The array will be delimited by 0.Нужно создать ф-цию которая возрвращает число эл-ов массива который возвращает 1? Или как более точно перевести. Не пойму что требуется в этом задание
>>1297663Нужно создать функцию, которая считает элементы массива которые подходят определенному условию, соответственно тебе нужно сделать так чтобы она принимала сам массив, количество элементов в нем и какой-либо предикат. Вот вроде функции remove_if в этой статье - https://ru.cppreference.com/w/cpp/algorithm/remove
>>1297625Где-то читал, что функция создания потока может стартануть раньше, но раз это не так, то ок.
>>1297726>>1297727Хм, придется руками прикручивать SDL_Renderer. Попробую лучше сделать свое, как нужно конкретно мне. Осталось только придумать, как адекватно коллбэки на кнопках обрабатывать - не хочу городить кучу глобальных переменных, чтобы менять сцены или там текст в текстбоксах обновлять.
Аноны, а где можно почитать про буферы и буферизацию? Рассказывается ли об этом в K&R или у Прата? Конечно, чтобы понять, что такое fully buffered, line buffered, unbuffered i/o мне хватило парочки тем на stackoverflow. Однако я не понял, почему при буферизации чтения и записи идет выигрыш в производительности. Есть некое абстрактное представление, но хочется конкретики, да и в этой абстрактности я не уверен. Хочется полных и точных объяснений, особенно, когда имеешь дело с Си. Например, мы имеем файл с записью "Hello". Мы fscanf'им его в массив. Так вот, зачем функция помещает эту запись сначала в буфер, а лишь затем - в массив? Ведь буфер - это и есть тот же самый масив. Зачем лишние действия?Другой пример: int main () {printf("Hello");sleep(3);system("clear");printf("World\n");}Здесь мы получаем HelloWorld, очевидно, т.к. printf - line bufferedТак же в кодеint main () {printf("HelloWorld");while (1) {}}Сообщение HelloWorld никогда не будет выведено на экран.Однако приint main () {printf("HelloWorld");return 0;}сообщение HelloWorld все-таки выводится на экран. Как я понимаю, это происходит на этапе завершения программы, т.е. после return 0 (или при/до return 0?) программа видит, что data, предназначенная для stdout, не была доставлена и все еще висит в буфере, поэтому программа самостоятельно принудительно флашит stdout ("выплескивает" данные из буфера в stdout). Правильно я это понимаю?Ну и тут снова тот же вопрос, что и с scanf'ом - зачем нам вообще нужно line-буферить printf? Почему бы сразу не кидать все в stdout?Помимо этого, интересно, какая размерность у буфера?Можно ли отключить буферизацию?
двачик,родной ,выручайСоставить функцию для слияния двух упорядоченных по возрастанию массивов целых чисел.(используя функцию вне мэйна)под слиянием имеется ввиду не сложение соответствующих элементов,типа 0-й из 1-го массива+0-й из 2-го массива=0-й в новом массиве,а именно запись их в ряд по возрастаниюне знаю шо робiтi(
>>1297862> Однако я не понял, почему при буферизации чтения и записи идет выигрыш в производительностиВ этом же самом треде: >>1289184> Так вот, зачем функция помещает эту запись сначала в буфер, а лишь затем - в массив?Иначе fscanf будет ходит в ядро за каждым символом.> Как я понимаю, это происходит на этапе завершения программыВыход из main = exit(кодвозврата), exit = fclose всех файлов, fclose = fflush перед закрытием.
Новый ньюфаг вкатывается в итт тренд. Поясните про задачку с getchar, что почти в самом начале. Почему выводится все, что я ввел, а не только первый символ? Как работает цикл в данном случае, он получается прогоняет getchar до того момента, когда брать больше нечего, или как? Тупой вопрос наверное, но лучше уж сразу в таких основах разобраться основательно.
Почему это код не работает на ideone?#include <stdio.h>int main(){ int i = 1, x = 5, n = 5; scanf_s("%i %i", &x, &n); while (n > 0) { i = i * x; n = n - 1; } printf("%i", i); return 0;}
>>1298208Потому что майкрософтоговно ненужно. Используй scanf, а всем, кто будет возникать, говори #define _CRT_SECURE_NO_WARNINGS "Fuck you"
>>12981301.5.1. Копирование файлаПри наличии функций getchar и putchar, ничего больше не зная о вводе-выводе, можно написатьудивительно много полезных программ. Простейший пример — это программа, копирующая по одномусимволу с входного потока в выходной поток:чтение символаwhile (символ не является признаком конца файла) вывод только что прочитанного символа чтение символаОформляя ее в виде программы на Си, получим#include <stdio.h>/ копирование ввода на вывод; 1-я версия / main(){ int с; с = getchar(); while (с != EOF) { putchar (c); с = getchar(); } }
>>1298261Конкретизируй. Если просто говорить новичку в какой-то области "это говно, а вот это не говно", то он никогда ничему у тебя не научится. Надо объяснять почему это говно.
Подгоните годное пособие по прогингу микроконтроллеров на СЖелательно AVR, но по факту похуй - надо на чем-то будет набить руку. Знаю азы Си, но хотелось бы погонять его там где он чаще и применяется (плюс у меня специальность радиотехника, с МК часто приходилось иметь дело, но вот сам я их не прогал)
Потому что под маской всевозможных сканфов/принтфов скрываются системные вызовы read/write. Системный вызов - достаточно дорогая операция, в этом вы можете убедиться, к примеру, написав программу копирования содержимого одного файла в другой с помощью read/write (по 1 символу) и различных функций ввода/вывода из stdio, при это посмотрите время работы обоих программ. Разница будет коллосальна. Решение является буферизация содержимого. То есть вы складываете ваши символы в буффер и изредко его записываете с помощью write. То есть пишете не 1000 раз по 1 символу, а 1 раз 1000 символов, тем самым обращение к ядру, которое является столь долгим, происходит редко.
>>1287378 (OP)Есть ли что нибудь встроенное чтобы проверить содержит ли string букву или слог? в идеале что-то вида:s.contains("xy") -> Boolean
Приветствую, эксперты.Параллельно с Пратой, начал изучать Тененбаума (ОС).Пришла в голову дикая мысль - а что если купить 486 старый комп как полигон для написания разного софта по книге? Домашний ноут стремно трогать, я же нуб криворукий, сломаю еще что-то.Совсем дебильная идея, или стоит все-таки?Собираюсь ковыряться близко к железу.
>>1298668Пошарься по вк, типа отдам даром. Я б в своём городе отдал пару системников без жд, но ты не в моей мухосрани же. Другое дело, что тебе это может быстро надоесть и лучше потренироваться на эмуляторах.
>>1298668Лучше виртуалку, там можно настраивать пека твой, хочешь 2гб памяти, а хочешь 8 мб, процессор, частота, сетевая карта, мышка, все что нужно.
>>1298248Потому что не добавляет безопасности, несмотря на громкий заголовок, зато добавляет ебли, потому что создает проблемы с библиотеками, потому что необязательное расширение стандарта, которое почти никто не реализует.>>1298643strchr(), strstr(), != NULL>>1298670>>1298672Двачую этих.
>>1298574а зачем делать буферизацию руками то? ну ты чеввод-вывод стандартной библиотеки сишной буферизированный по умолчанию, причем более-менее оптимизированный под текущую платформу где рантайм сишный скомпилен, плюс есть функции записи буферизированных данных, функциии управления буферизациейребята, которые пилят основной сервис - почту на майлру, к примеру, пользуются стандартным вводом-выводом, им хватает по производительности.. просто в нужных местах в коде сбрасывают буфер и все.. когда надо..
>>1298574>Потому что под маской всевозможных сканфов/принтфов скрываются системные вызовы read/write. Системный вызов - достаточно дорогая операция, в этом вы можете убедиться, к примеру, написав программу копирования содержимого одного файла в другой с помощью read/write (по 1 символу) и различных функций ввода/вывода из stdio, при это посмотрите время работы обоих программ. Разница будет коллосальна. Решение является буферизация содержимого. То есть вы складываете ваши символы в буффер и изредко его записываете с помощью write. То есть пишете не 1000 раз по 1 символу, а 1 раз 1000 символов, тем самым обращение к ядру, которое является столь долгим, происходит редко.Ну, начнем с того, что это давно уже не так и там давно уже применяется mmap/MapViewOfFile, работающих напрямую со страничным механизмом OS.
>>1298829> mmap/MapViewOfFileЭто когда у тебя программа сегфолтится при вытаскивании флешки, с которой был открыт файл? Хороший механизм.> что это давно уже не так и там давно уже применяетсяГде там?
>>1298393Что аргументировать, тебя анон жирно протроллил, я в этом посте на это указал - >>1298261Дальше отвечал уже не я. Суть в том что те функции которые ты используешь добавлены мелкомягкими чтобы предотвратить гуляние по памяти в случае отсутствия в конце строки нуль-терминатора, по сути они эквивалентны обычным, только в функциях с "_s" в конце ты так же указываешь предел на котором функция должна остановиться в случае отсутствия нуль-терминатора. В IDE под linux и MAC, и на сайте ideone таких функций нет, потому-что они выпускаются не мелкомягкими.
>>1299008> тебя анон жирно протроллилГде я его потроллил? Предложение задепрекейтить Annex K в С21 как бесполезный и неиспользуемый уже обсуждалось рабочей группой. Хуй знает, правда, приняли или нет, но дело к тому шло.> чтобы предотвратить гуляние по памяти в случае отсутствия в конце строки нуль-терминатораНе только. Там есть и другой контроль границ. Например, когда строка не влезла в буфер целиком, в Си она обрезается, а у Microsoft возникает constraint violation. В любом случае, все, что есть в Annex K без возможности выбора, нормальными людьми реализуется по необходимости максимум двумя дополнительными строками кода. Просто майкрософт считает, что это круто, когда нужно повторять повторять размер буфера для memcpy_s().
Привет всем С господинам! Остальные лесом>>>Подскажите, видел кто в открытом доступе эту книгу, хочу с ней познакомиться!
>>1299393#include <stdio.h>#include "Fuck_your_mather.h"void fuck_mather(){ FUNC_FUCK_YOUR_MATHER == TRUE;}void main(int argc, char *arhv[]){ while(TRUE){ (FUNC_FUCK_YOUR_MATHER == TRUE) ? printf("Suck me dick bitch!/n") : void fuck_mather(); }}
Анончик, где есть интересные задания по Си? Недавно выучил синтаксис, хочу поделать что-то.Хочется что-то интересное и полезное
>>1299409http://www.pskills.org/c.jsphttps://stepik.org/lesson/34299/step/1?unit=30901https://www.codewars.com/
>>1299409вливайтся в опенсорс, ептне шучуне на гитхаб идиу того же гнома сотни проектов, систем и программ которые надо доделывать и дорабатыватьhttps://developer.gnome.org/
>>1287378 (OP)Деды, не бейте, лучше обоссыте, но ответьте на вопрос! Нужна библиотека простой 2d графики для сишки. Ну грубо говоря чтобы там можно было визуализировать всякие простые физические процессы например молекула отскочила от стенки сосуда лол, какие-нибудь аналоговые часики сделать, солнечную систему, такого вида Что посоветуете? Обязательно должно работать в линупсе и желательно, чтобы это была для него родная библиотека.
>>1299715Мне кажется это через чур сложная штука для моих задач. Я думал может взять какое-нибудь GTK+, там же есть вроде виджеты, в которых можно рисовать? Но что-то литературы по gtk3 вообще нет, все по gtk2.
Меня притягивает С, но отпугивает то, что в какой-то момент я неизбежно столкнусь с СПО.Но проблема в том, что СПО на 99,9% состоит из говна (на самом деле на 100%, но не будем категоричны).
друзья, помогите пожалуйста. учусь в школке и делаю какие-то тупые задачи (c99), но столкнулся вот с некоторой проблемой. задача - считать n строк, как-то там обработать, вывести. при этом использовать динамическую память. проблема внезапно на этапе считывания, причем понять в какой строчке происходит краш не могу. код -- hastebin.com/ibuwucoqif.cpp. при вводе корректных данных типа 4 принтит err1, но не принтит err2. если добавляю в аргумент ф-и scanf_string что-то типа (+ printf("err3\n") - printf("err4\n")), то указатель я как бы не двигаю, но эти строчки прога принтит (т.е. аргумент высчитывается без краша, так ведь?). тогда где вообще может краш произойти, если сразу по вызову ф-и scanf_string должна напечатать err2? короче идейно не понимаю в чем проблема и надеюсь на помощь от богов-профессионалов
>>1299855Все знают про тысячи полуграмотных индусов, пишуших платное ПО неземного качества?Так вот СПО пишут те же индусы, только в свободное время, бесплатно и с результатом, за который никто не отвечает.Все лучшее СПО (те самые 0,01%) суть бывшее платное, чуть допиленное сообществом (кроме GIT). Либо крякнутое. Крякнутое платное ПО - лучшее по качеству, не знаю почему так получается.Например, некоторые упоротые сравнивают LibreOffice и MS Office. Казалось бы, как можно сравнивать? Вообще разные весовые категории. Но не стесняются и сравнивают.
>>1299930scanf умеет динамически аллоцировать память и возвращает указатель, потом нужно юзать free на поинтерделой man scanf примерно в конце было даже с примером
>>1300212char *p;int n;errno = 0;n = scanf("%m[a-z]", &p);if (n == 1) { printf("read: %s\n", p); free(p);} else if (errno != 0) { perror("scanf");} else { fprintf(stderr, "No matching characters\n");}
>>1300211Ты вообще не разбираешься в вопросе.> Так вот СПО пишут те же индусы, только в свободное время, бесплатно и с результатом, за который никто не отвечает.СПО в основном пишут богатые белые представители загнивающего запада, у которых есть свободное время на хобби и не стоит вопрос сдохнуть с голода.
>>1300215>СПО в основном пишут богатые белые представители загнивающего западаДа ну?? Почитай любые вопрос-ответ треды, каждый первый ответ - ДИНЕШ и РАДЖЕШНо.. Если ты прав.. Пиздец. Все гораздо хуже чем я думал.
>>1300211индусы очень мало делают вклада в сподаже русских там больше чем ихосновной вклад - белые европейцы и сша, мужчинычерные, желтые и бабы вообще мало кода пишут, это реальность
>>1299419>https://developer.gnome.org/Можно в кратце что куда кликать ,что бы получить задания которые актуальны?
Ребят, а что за debuger во всех компиляторах, если в двух словах?Еще видел онлайн компилятор, который код C показывает в ассемблер виде, но уже не нахожу ссылку
>>1299167Ты охуеешь наверное, но мне на днях ещё и 40 исполнилось. Имею твердое желание выкатиться в embedded джуном.
>>1300587Ну он же написал:> Собираюсь ковыряться близко к железу.> Имею твердое желание выкатиться в embeddedОдной лишь сишечкой в embedded не обойтись, всегда будут всякие специфичные для платформы вещи, да и саму платформу понимать стоит, если цель - не хелловорды не только светодиодами мигать. А что касается x86, то железо, используемое там, либо очень сложно программировать для начинающего (современное), либо давно устарело и с embedded не пересекается вообще. Лучше сразу взять какую-нибудь малинку, стмку или даже аврку на худой конец, чем разбираться в давно никому не нужных тонкостях работы 8272A.
>>1300604Спасибо за ответ!Это я спрашивал.То есть ты даже 286 не советуешь?А с чего начать? У меня есть такое ощущение, что начинать с Малинки вместо контроллера, это как вместо С учить сразу С#.
>>1300639> что начинать с Малинки вместо контроллера, это как вместо С учить сразу С#Можно дрова в линуксе писать, а можно экономить байты. Эмбеддед - это не только микроконтроллеры с килобайтом рамы.Си лучше учить на своей пеке, а не ебаться с кросскомпиляторами и удаленной отладкой. А поиграться со знаниями, почерпнутыми из Танненбаума, можно на qemu-system-xxx, реальная железка не нужна, особенно поначалу.> То есть ты даже 286 не советуешь?Можно, конечно, листать пыльного Джордейна, писать демосцены 16-битным кодом, но зачем? Что ты с этими знаниями делать собираешься? Ну ладно в российских вузиках мсдос в студентов пихают, потому что преподы ничего другого не знают. Студенты сдали и забыли, а самостоятельно-то зачем в это вляпываться?
Пытался написать программу, которая находит вводимое число в водимом массиве и указывает позицию элемента в массиве, но непонятно откуда перед итоговыми числами появляются нули. Кто-нибудь, объясните откуда нули там незначащие нули.#include <stdio.h>int main(){int M[100000], n, i = 0, x;int a=0;scanf_s("%i %i", &n, &x);while (i < n) {i=i+1;scanf_s("%i", &M);}i = 0;while (i < n) {i = i + 1;if (x == M) { a = a + 1; printf("%i", i); }if (a == 0) printf("%i", a);}scanf_s("%i %i", &n, &x);return 0;}Проблема проявляется только когда я пытаюсь добавить в программу проверку на отсутствие числа в массиве, чтобы выводился 0.Программа работает так: вводишь размер массива, через пробел вводишь искомое число. Далее через энтер заполняешь позиции в массиве, в одной из которых может быть или не быть искомое число. Если число есть, выводится позиция числа в массиве, если числа нету - 0.
Хотел написать простенький mymallok(), пишу под Windows, включил <stdlib.h>, <stdio.h>, <stdint.h>, <stdbool.h>, <assert.h>, sys/types.h>, <unistd.h>, <string.h>, <windows.h, но компилятор так и не видит декларацию brk(), sbrk(), mmap(). Что я` не так?
>>1300902Под Windows у тебя есть VirtualAlloc()/VirtualFree(), их и используй. Ну и еще Pelles C поддерживает _mmap(), в аллокаторе можно им одним обойтись.
Мой план на ближайшие 9 месяцев:(В примерно хронологическом порядке)C Primer Plus -- Stephen PrataData Structures Using C -- Langsam, Augenstein, TenenbaumAlgorithms in C -- Robert SedgewickStructured Computer Organization -- Andrew TanenbaumModern Operating Systems -- Andrew TanenbaumComputer Networks -- Andrew TanenbaumЧто потом - не знаю, надеюсь там будет видно.Цель - эмбеддед/гейм/.... То есть поближе к железу, плюс физика, механика, матрички, вот это вот все.
>>1301497> У меня уже есть вышка, я инженер-механик. Мне уже много лет.Ну это типа не в плюс, а в минус при обучении. Потому что если ты собрался учить сишку с нуля, очевидно в вузике ты совсем не погроммировал.
>>1301514После вдумчивого изучения направлений и доступных материалов для самостоятельной работы, а так же подобных универститетских и колледжских програм, пришел к данному списку.Это минимум, база, после которой можно, собственно, думать о вкатывании.Я ориентируюсь на где-то год. Но если возьмет 2 то так тому и быть. К сожалению, я не вижу других вариантов.С благодарностью приму поправки и советы от бывалых.
>>1301523Ну тащемта для вкатывания гораздо важнее практический опыт, чем какие-то теоретические знания. Если ты не знаешь и трети, что написано в этих книгах, но имеешь какой-то более-менее полезный пет-прожект, для работодателя ты будешь на порядок интересней теоретика, прочитавшего тонны книжек, но не имеющего никакого опыта.
>>1301519Ну почему же. Я программировал, но больше функции для вычислений. Использовал С как продвинутый калькулятор так сказать.Ну и MatLab в основном.Я довольно быстро (как мне кажется) схватываю материал, единственное препятствие для меня сейчас - нехватка свободного времени.Скачал лекции про ОС, слушаю пока еду на работку.
>>1301526>для вкатывания гораздо важнее практический опытАбсолютно согласен, через год будет понятно как подступиться к прожекту, тем более идейки у меня есть.
>>1301523к&r читани корка от корки, все упражнения сделай, не игнорируй приложение, медитируй над ним, это нужнопо структурам и алгоритмам ебани пару курсов, хотя бы на том же спепике, плюс заебашь 200-250 (больше нахуй не надо) алгоритмических задач хотя бы на том же hackerrank или на любом подобном, десятки их щасдальше уже ходи по собесам, вкатывайся за еду бляа так ты скорее с голоду сдохнешь читая весь тот лольный список что ты себе составил
>>1301530>по структурам и алгоритмам ебани пару курсовЯ реально быстрее учусь по книгам. Если бы было время смотреть курсы, я бы за это время уже закончил свой лольный список.
>>1301538>я не про видеоуроки от васянов на ютубея про курсы где есть упражнения и задания, где надо делать кодинг и где есть проверяющая системаот того что ты там че то читаешь или смотришь в голове остаешься 0
>>1301540вы, кстати, чутка неправильно оборот используете"пет прожект" это вообще то когда сформировавшийся кодер у которого есть уже основная работа по выходным ебашит что-то приятное ему вдобавокэто как у линукса есть собственно операционка, и пет-прожект это он на qt (лол) пилит какую-то приложуху для учета статистики дайвинга
В тред призываются опытные системные прогромизды. Какие вилки у мидлов-сеньеров системных программистов в ДС? Интересуют крупные компании типо Яндекса, мейла, касперского и тд.
Привет байтовелители, хочу вкатиться в сириоз девелопмент.Хочу читать этот список >>1301473, но вместо этого решил читать /pr.Какие подводные?
>>1301672О, спс, не знал про этот сайт. Просто недавно апнули с джуна до мидла, спрашивали сколько я хочу (получилось 130к чистыми, 150 gross), теперь думаю не продешевил ли.
Посоветуйте годные блоги, где публикуются статьи о программировании на Си (желательно англоязычные). Можно даже заброшенные блоги, но с доступным архивом для чтения.
>>1301523Хуйня, не ссы главное сиди днями занимайся этим и перерывы делай. Хотя кому я пизжу, сам сижу каждый день марафоню. Не... Нужно отвлекаться все же, на изучение самой системы, использования Сишки для упрощения жизни на Шлинуксе или там, ради себя ебни бсдшку и поизучай параллельно. Этот мир не только об одном языке, заебешься. Его нужно использовать, тебе тот же Прата скажет тоже самое, что развитием нужно заниматься используя язык. Я угараю еще как многие на шлинукс приходят и игнорируют баш скрипты.
>>1302713Еще на Гитах сидеть код разбирать. Не надо одни книжки читать, ебаш форумы. Ну я говорю просто как я делал. Алсо туториалы - Нахуй. Чем ты отличаешься от других тогда, если ебашишь одно и тоже?
С туторов можно спиздить что-то, но туторы должны быть бесплатные, иначе это просто способ навариться на ванаби и кста код у этих УЧИТЕЛЕЙ ЕБАНЫХ говнище такое позорное.
>>1302713>>1302714>>1302715А ты сам всё ещё учишь или может уже успешный и на работу таки устроился?мимо
Аноны, а помогите найти что-нибудь прочитать про кросс-компиляцию с x86_64 в ARM. Вот у меня есть gcc и есть телефон, нак который я могу скинуть какой-нибудь код. Как компилировать?
>>1302978Я поехавший ванаби который каждый день пишет на Си и мечтает в будущем переехать на ассемблер, планирую в сфере хакинга использовать. Щас тема интересная, где типа вирусы можно писать на уровне железа.
>>1303432> Вот у меня есть gccКросскомпилятор для AArch64 или обычный для x86-64? Если обычный, то тебе нужен кросскомпилятор. Качаешь http://releases.linaro.org/components/toolchain/binaries/ распаковываешь, компилируешь. А еще лучше качаешь NDK: https://developer.android.com/ndk/downloads/, распаковываешь (компиль в папке toolchains, сисрут внезапно в sysroot), компилируешь.> Как компилировать? Точно так же, как обычно, только с правильным --sysroot.
>>1304240Хуй знает, попробуй сам найди, я вообще дрочил полгода плюсы, а потом устроился на работу, сейчас ебашу драйвер на си.
>>1304464Винда, MSVC или MinGW, которые линкуются к сломанной майкрософтом CRT, которая хочет %S? Больше идей нет.
>>1304503У тебя вообще ничего не печатало? Локаль выставлял?#include <wchar.h>#include <locale.h>int main(void){ setlocale(LC_CTYPE, "ru_RU.UTF-8"); wchar_t wtext[] = L"строка"; wprintf(L"%ls\n", wtext);}
>>1304520Потому что у потока есть ориентация, и если ты однажды пишешь в него wide, ты больше не можешь mbcs. И наоборот. Можно только явно менять ориентацию с помощью fwide. Связано это с особенностями многобайтовых кодировок, в том числе и UTF-8, но особенно всяких Shift-JIS.
Сап аноны. Помогите найти ключ gcc, который отключает препроцессор. То есть я отдельно вызываю препроцессор, а только потом хочу попытаться вызвать gcc, но он всегда первым делом снова прогоняет препроцессор, а мне это не надо.
>>1304608> То есть я отдельно вызываю препроцессорГенерируй .i, а не .c.> Помогите найти ключ gcc, который отключает препроцессор-x cpp-output, но вариант с расширением правильнее.
>>1305157 (OP)>>1305157 (OP)>>1305157 (OP)>>1305157 (OP)>>1305157 (OP)Тем временем понемногу начинают редактировать черновик C20/21: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2310.pdf