Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
- Очевидный GCC. - clang: оче годно, батя рекомендует. - Intel C++ Compiler: оптимизации, тысячи их. - Visual Studio 2017 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте. - Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное. - TCC: очень маленький компилятор с багами и неполной поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Stephen Prata "C Primer Plus, 6th Edition" (2014) Свежая знает про C89, C99, C11, описывает различия, объемная около тысячи страниц, годная хотя есть некоторые шероховатости, с вопросами, упражнениями и ответами. Читать после K&R или до.
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? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
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. Kochan "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
>>935822 Посмотреть бы, как атаку переполнения буфера на змее реализуют. Книга все-таки не о крекинге. А о безопасном кодинге на Си. Плюс внятно описаны криптография и сетвой кодинг.
Нуб вкатился. ANSI C. Открываю файл 1.txt, чтобы считывать с него по строке. file=fopen("1.txt","r"); Также открываю 2.txt для записи: filec=fopen("2.txt", "w"); Ранее 1.txt был записан в этой же проге, если что, а потом закрыт. Знаю кол-во строк заранее, пишу в цикле fgets(outstr, 178, file); Размер массива outstr 180 символов, если что. Проверяю некоторое условие (оно внешнее, от содержимого outstr не зависит). Если оно выполняется, то хочу записать outstr в filec: fputs(outstr, filec); И ничего, файл filec пуст всегда. Я в этой программе удачно заполнил 1.txt, но не могу никак заполнить filec, и в консоль ничего вывести не могу, даже если написаь fclose. ЧЯДНТ?
>>935864 Но вам проще будет ответить на общие вопросы, наверное. Речь о стандартной библиотеке, ОФК. 1. Можно ли одновременно открывать несколько файлов и переносить из одного в другой, сравнивать их и т.п.? 2. fgets где оставляет каретку после своей работы? Написано, что она считывает до первого символа след строки. Т.е. три fgets подряд благополучно заполучат три строки? Ничего между ними вписывать не надо?
>>935869 1. Можно. 2. Каретка - это про печатную машинку или консоль. Позиция в FILE остается там, где закончилось считывание. Считывание заканчивается, когда заканчивается буфер или встретится символ конца строки (в зависимости от того, что случится раньше). Позиция в нижележащем файле ОС может быть где-то дальше из за кэширования прочитанных данных во внутрененм буфере FILE. Три fgets могут прочитать три строки, а могут только одну, если она длиннее буфера.
>>935884 Конкретная проблема в точке с запятой тут: > if (str==strm); Но макаба съела звездочки наверняка, поэтому там могут быть и еще какие то проблемы.
>>935896 Да, с двоеточием я обосрался. А ты уверен, что у тебя цикл работает, и строчка читается? Что ты не вышел по return чуть раньше? Если в gdb не умеешь пока, воткни printf, да побольше.
>>936129 >В конце марта амд выкатывает процессоры вдвое дешевле интеловских при той же производительности и при меньшем энергопотреблении Кроме геймеров, кому на это должно быть не похуй?
Если верить тестам и конференциям, они наконец-то дотянули однопоточную производительность. Перестали функциональные блоки урезать - Гипертрединг у них скелится лучше, чем у интела (тоже не факт, только циферки), и такого фейла, как у бульдозера (который даже в пределах физических ядер не скейлился даже близко к пропорциональности, пока обновы планировщиков не вышли, и при этом кушал больше, чем Интел с тем же числом ядер), быть тем более не может. И это при примерно вдвое меньших ценах.
С моей диванной точки зрения видится то, что Интел сам себе дал пососать: могли бы продавать процессоры по сильно меньшим ценам и задавить x86-подразделение АМД напрочь, вместо этого выставили такие цены, что АМД сможет нагнуть их по всем практическим характеристикам и ещё и заработать на этом.
Интел постоянно пихали АМД палки в колёса своими финансовыми выворотами (можно вспомнить премию за неиспользовани АМД и бенчмарки времен Netburst), из-за них производительность дороже, чем могла бы быть в условиях честной борьбы. Когда ты будешь собирать новый ПК, ты сможешь взять себе процессор с вдвое большим числом ядер примерно по той же цене. Это может быть интересно очень многим - хотя бы тем, кто сейчас может позволить себе только двухъядерник, и при этом хочет плавную работу нескольких программ.
С другой стороны, с моей точки зрения проблема современных ПЭВМ не в вычислительной мощности, но это уже другая история.
>>936154 так хули, копитолизды не заинтересованны в улучшении продукта, их цель - агрессивная реклама. АМД малацы, Интел должен был cдохнуть еще на i286 параше
Я хочу -полностью опенсорсный софт в рамках одной машины, -никакого preemptive-пердолинга хотя бы на всех ядрах, кроме главного -математически-строгие стандарты обмена без ошибок и и без всякого legacy (форматы любых данных, протоколы и т.д.) с референсным универсальным кодом, чтобы один раз и надолго, -математически строгую оптимизацию компиляции без багов и распараллеливание кода (основанные на математической модели процессора), -максимально простое и прозрачное сохранение состояния всех программ в хранилище (HDD или ещё куда), -неимпераитвный язык, структура которого будет учитывать устройство современной вычислиловки и набор типичных методик работы с устройствами, -ГУЙ с развитой самодокументацией (любой достаточно сложный ГУЙ требует прочтения мануала, нужно всю справку встроить в ГУЙ), -IDE с развитой самодокументацией (конверсия между различными представлениями программы, предпросмотр дерева разбора, встроенный стандарт языка, средства автоматического доказательства) -средства языка и компилятора для обнаружения ошибок вычислений без ECC и полного дубляжа вычислений, с помощью частичного дубляжа, дешёвых проверок, хранения хэшей - изоляция костылей для поддержки разных форматов
Если у меня всё это или большая часть этого получится, я захочу написать стек софта под несколько конкретных профессий/занятий: дизайнер, маркшейдер, доярка, студент, инженер, таксист, статист и так далее, потому что без софта ни одно благое дело, которое не тащит за собой обратную совместимость, не взлетит.
Ввиду того, что никто за меня это делать не собирается, прямо сейчас я пишу то, что могу писать (на плюсах), набираюсь знаний и не живу мечтами, ведь я даже программистом не работаю.
И ещё хочу 1:1 монитор, потому что даже 16:10 задолбало. Как ни странно, джве модели есть.
АМД тоже капиталисты, просто сейчас волею судьбы они догоняющие, и им приходится компенсировать отставание не маркетингом, а идеологией. >>936200 шутит, наверное, впрочем.
П.С. Рекламу "Атлон инсайд" помнишь? Вот и я не помню.
>>936402 > Зависит от того, как это оформить. Хоть ты усрись, нельзя. Интерфейс априори императивен, со своими новыми концепциями можешь в /mg/ уебывать, там тебя встретят как своего.
>>935715 (OP) Пытаюсь в эту вашу СИ, и вот проблема. Написал стронгли по учебнику код, который должен сравнивать введенные строки, потом печатать самую длинную, затем её же наоборот. Так вот, в любой ситуации печатается 661304 после вывода максимальной строки, переделанный в обраточку массив идет уже без чисел. Что это?
>>936517 Надо в шапку походу уже добавить правило, что если кто-то хочет помощи по коду, пусть выкладывают минимально компилируемый код на какой-нибудь пастебин. А то почти каждый долбоёб либо сразу в тело поста копирует код, где макаба съедает все звёздочки, либо выкладывет СКРИНШОТ С ТЕКСТОМ. Первое я ещё могу понять, но второе... Блядь, ну нахуй вы это делаете.
>>936739 А зачем? Экономить память в компиляторе - это какое-то непередаваемое извращение. Нет, оттайпдефать нельзя. Что единожды затайпдефано, останется тайпдефнутым до конца текущего модуля.
>>936741 А перетайпдефить? У меня не экономия а немного другая ситуация. Нужно для заголовков функций затайпдефить один тип, в тупую на void, а потом поменять void на нормальную структуру.
>>936745 > А перетайпдефить? Нет, нельзя, вообще никак. Можешь препроцессором нужный вариант выбирать разве что.
А вообще, расскажи, что сделать хочешь? Если ты хочешь скрыть детали реализации, делай в хедере: typedef struct SomeType SomeType; а уже в .c-файле, который со структурой работает (или в приватном хедере, если .c-файлов несколько): struct SomeType { ... };
>>936748 У меня есть файл main.c, там хедеры функций, которые принимают структуру type. Также у меня есть файл func.h, в котором функции и эта самая структура. Делаю: #include "func.h" // файл со структурой type и функцией "func" typedef type low_type; void func(low_type type); // хедер функции func
И получаю хуй, так как сначала инклюжу файл с функциями, а потом какого-то хуя идут хедеры функций. Так нельзя. Делаю: void func(low_type type); #include "func.h" typedef type low_type;
и функция принимает в себя несуществующий тип low_type;
Хотел сделать перед функциями "typedef void low_type", а потом, заинклюдив func.h, "typedef type low_type", но так нельзя. Единственное до чего додумался, так это просто вынести структуру в отдельный файлик func_struct.h и инклюдить его перед функциями, но это не красиво.
>>936756 > main.c, там хедеры функций > у меня есть файл func.h, в котором функции Ты все перепутал. В .h кладут хедеры, а в .c реализацию. func.h: #pragma once typedef type low_type; void func(low_type); func.c: реализация func main.c: #include "func.h" компиляция: cc main.c func.c
>>936771 > Ты все перепутал Нет. В основной программе main.c это тоже .h файл. Я пишу библиотеку.
Конкретно у меня в основном .h файле лежат все хедеры и реализация половины функций из этих хедеров, а в том "func.h" лежит реализация второй половины этих функций и структурка. Можно убрать хедеры функций из func.h в этот самый func.h, но я не хочу. У меня есть одной место, где прекрасно видно все функции и комментарии к ним. Так красиво получилось, незачем портить.
>>936775 Я тут мимо походил, но разве в этой вашей няшной не действует правило - у функции моет быть одно определение и сколько угодно объявлений? Тогда я не понимаю зачем этот человек складывает определения в хэдеры, разве что чтобы потом поиметь проблем при их инклуде в два линкуемых объектника
>императивен аноны, нахуй вы такие пидерские слова используете?
книжн., юр. не допускающий выбора, требующий безусловного подчинения, исполнения комп., прогр. описывающий процесс вычисления в виде последовательности команд, инструкций
>>936363 >Окошки с кнопочками императивны, хоть ты упрограммируйся вконец. Поддержу этого анона. Программирование ГУЯ - линейные вычислительные процессы, обрабатывающие изменяемые данные. Никакой функциональностью здесь не пахнет.
>>936402 >Зависит от того, как это оформить. Если ввести новые концепции в язык, то можно даже Аллаха неимперативным сделать. Любимая задача борщехлеба - на ровном месте создавать себе трудности, чтобы их героически преодолевать. Вместо того, чтобы комбинировать функциональный и императивный код, используя тот и другой там, где они нужны (как принято в Лиспе, Скале и других нормальных языках) - они выдумывают глупые концепции вроде монад и зависимых типов, удаляя гланды через задний проход.
При этом полноценный фреймворк НА СТРЕЛКАХ написать им так и не удалось.
>>936127 > >Посмотреть бы, как атаку переполнения буфера на змее реализуют.
> Атаку row hammering сбацали на ЖС.
> Эксплойт успешно сработал на на данных системах в браузере Firefox версии 39. Эксплотируется сама уязвимость в DRAM. Эксплойт, не позволяет получить права администратора в системе . Ну и нахуй оно нужно?
>>936775 >Конкретно у меня в основном .h файле лежат все хедеры и реализация половины функций из этих хедеров
На кой ляд?
>Можно убрать хедеры функций из func.h в этот самый func.h, но я не хочу. У меня есть одной место, где прекрасно видно все функции и комментарии к ним. Так красиво получилось, незачем портить.
>>936934 > На кой ляд? А как иначе? Я бы вообще всё положил в этот основной .h файл, и был бы у меня проект из одного файла, но реализаций func.h может быть много. Каждая для своей платформы, например. В итоге, чтобы собрать мою либу под сперму, нужно просто заинклюдить "func_win.h". Охуенно же.
> Съеби. Ну ти чего. Алсо, я тут кое что вспомнил и могу оправдать эти действия: Функция func используется в основном .h файле, описывается в другом, func.h файле, но при этом должна быть static. Если шапка будет где-то в другом месте, то основной .h файл не сможет её использовать.
>>936889 > 2017 > при нажатии кнопки гуй зависает пока производит вычисления > если начать две кнопки одновременно, программа крашится Давно во всех учебниках гуй представлен конечным автоматом, для представления которых ничего лучше фп не придумали, одни императивные мудаки лепят самописные очереди событий для самописного межтредового взаимоднйствия
>>936913 > Ну и нахуй оно нужно? Реализация эксплоита не позволяет получить права. А сама уязвимость потенциально позволяет ебать компьютер как угодно.
>>937224 А ты попробовать сам не мог? Есть, именно так и заполняется. Если ты хочешь заполнить НЕ при инициализации, и тебе жизненно необходимо сделать это одной строкой, тогда num = (num_struct) { ... }; Алсо, при инициализации можно указывать конкретно, что куда присваивать: { .i = 10, .j = 20 };
>>937270 Нет ничего плохого. Но ты можешь сделать num = { 0 }, и компилятор сам решит, что выгодней: сделать несколько mov для маленьких структур, или заинлайнить/вызвать memset для больших.
Дорогие си-погромисты. Обращаюсь к вам, первокурсник-тугодум. Задали прогу сделать, которая кодировку в тексте исправляет. С UTF этих ваших, да ASCII в windows-1251. Из аски в вин я более-менее смог наклепать, но из 2хбитового ютф ну никак не шарю... Направьте в нужном русле, пожалуйста!
>>937698 Возможно, тебе стоит взять какой-нибудь iconv и не ебаться вручную (если задание позволяет). Что касается UTF-8, там в старших битах первого байта кодируется количество байтов в последовательности: (b & 0x80) == 0x00: 0xxxxxxx: 7 бит текущего байта (b & 0xe0) == 0xc0: 110xxxxx: 5 бит текущего байта и 6 бит следующего (b & 0xf0) == 0xe0: 1110xxxx: 4 бита текущего байта и по 6 бит из двух следующих (b & 0xf8) == 0xf0: 11110xxx: 3 бита текущего байта и по 6 бит из трех следующих Дополнительные байты (если первый байт их требует), выглядят как 10xxxxxx, в старших битах всегда 10, чтобы можно было узнать, что это не старт очередного символа, а середина, а младшие 6 битов используются для сборки codepoint. Можешь упростить себе жизнь, выкинув последние две проверки. В однобайтовом варианте у тебя по определению будет ASCII, а в двухбайтовом, возможно, кириллица. Добавишь пару проверок диапазонов, lookup-табличку сделаешь, и будет норм.
>>937712 Спасибо огромное! Я уже отчаялся. Мне говорили, что старшие биты нужно с 10 начинать, но я чет не понимал, зачем мне это. Теперь же все ясно и по полочкам.
Начал изучать С, понравилось то что охватывает и системный и прикладной уровень. Сейчас пишу фронтенд для сайта и стили, на сервере всё работает, как сделать, чтобы у клиента запускалось?
if(a > 0x09 && a < 0x10) a = a + 0x06; if(a > 0x19 && a < 0x20) a = a + 0x06; if(a > 0x29 && a < 0x30) a = a + 0x06; if(a > 0x39 && a < 0x40) a = a + 0x06; if(a > 0x49 && a < 0x50) a = a + 0x06;
переменная "а" - тупой счётчик, считает от 00 до FF. Шестнадцатеричная система. Нужно исключить, перескочить все НЕ десятичные комбинации. Убрать 0A,0B,0C,0D..... F9,FA.....FF. Чтобы "а" выражалось исключительно цифрой без букв.
Ну хоть подскажите что гуглить мне, уже голову сломал.
>>938612 Лол. Если сматчится первое подвыражение (при a = 0xb0, например), то твои цифры пойдут по пизде. Если уж тебе хочется именно скипать до следующего "правильного" числа, то разбей на два if, и при совпадении в старших разрядах скипай 0x60, а не 6.
>>938577 Аналог твоего кода: if (a % 0x10 > 0x09) a += 0x06; Если именно "проскочить" a-f до ближайшего нуля в последнем разряде, т.е. из 0x0b надо сделать 0x10: if (a % 0x10 > 0x09) a = (a / 0x10 + 0x01) * 0x10;
>>935715 (OP) Каким образом в определении типа этой структуры используется тип PLIST_ENTRY до того, как даже определена структура? Как транслятор решает это?
Делаю упражнения из K&R. В 1.8 ("Write a program to count blanks, tabs, and newlines") наткнулся на какую-то НЕХ. Сам листинг довольно незамысловатый: http://pastebin.com/1vRnQ3m4
Запускаю программу, пишу строку (да что угодно), завершаю комбинацией Ctrl+C. Выдаёт что-то типа: "Blanks: 2147344387, tabs: 0, newlines: 2.". То есть, табы и переводы строк правильно считает, а с пробелами выдаёт не то. ЧЯДНТ?
>>940123 > в C транслируется и безопасность у него такая же, как у C То есть, если бы он транслировался в нативный код процессора, виноват был бы процессор?
>>940171 > Как ты себе это представляешь? Как делают нормальные люди - берут llvm и генерят IL, из которого генерится машинный код. Транслировать в си ненужно.
> Статью прочти, неосилятор. Я проскроллил, какой-то говноязык, какие-то криворукие студенты.
>>936177 Нет, ты выяснишь, что ты пидорас-байтоёб и ЭМБЕДЕД НИНУЖОН, СЪЁБЫВАЙ ОТСЮДА И ГОВНО СВОЁ ЗАБЕРИ b vyjuj bynthtcyjuj ghj cdjb[ hjlcndtyybrjd^ dxfcnyjcnb ghj vfvfie
>>940206 а че, пездоглазы из самсунга свой днищелесапед джерискрипт и разрабатывают как жс ембедед. движок на си, а сверху жс и все это говно в телевизор, лол.
сап, анон. Подскажи вкатывальщику-неосилятору. Если я учу Си и собираюсь по серьёзке упарываться им со всеми вытекающими и прочими ништяками, то стоит ли мне гуммантираю лучше изучать электротехнику, чтобы знать как шить микроконтроллеры и для каких целей их прошивать. И вообще подскажите где вообще Си полезен, кроме таких низкоуровневых вещей. Так и не понял почему он круче ассемблера. Скажи, что почитать, анон, чтобы понять куда можно си впихнуть и куда его можно впихнуть с натяжкой.
> Если я учу Си и собираюсь по серьёзке упарываться То есть, ты учишь язык, но не знаешь, зачем? Имей в виду, что нормально ты начнешь писать года через три, не меньше.
> стоит ли мне гуммантираю лучше изучать электротехнику Нет. Даже если пойдешь в эмбеддед, для начала хватит понимания самых базовых вещей, которые можно за вечер прочитать в википедии.
> где вообще Си полезен Либы, сервисы.
> почему он круче ассемблера Си соберется на другой архитектуре, если код писал не криворукий мудак, код читабельнее и компактнее, компилятор пишет более быстрый код, чем ты (ты можешь обогнать компилятор на маленьком куске, но ты заебешься качественно оптимизировать весь код).
> куда его можно впихнуть с натяжкой Писать для веба неприятно. Писать гуи неудобно по сравнениню с высокоуровневыми языками. В остальных случаях никто не мешает писать на Си.
>>940399 бладжд там есть квест 1.13 написать гистограмы. Я так и не понял как их делать, но в консольку вывел ">" в горизонтальную гистограмму, а с вертикальной дак вообще охуел там корячиться. Четыре дня думал, так и не понял, как эти ёбанные гистограммы вертикальные запилить, не подлкючая сторонних средств. Но в книге ничего вроде не написано вообще про сферу применения языка. Тупо приходится отовсюду выискивать где и что пишут на сях.
>>940410 > так и не понял, как эти ёбанные гистограммы вертикальные запилить А в чем проблема? Ты не можешь посчитать на основе простейшей пропорции, стоит ли выводить в консоль заполняющий символ или проблел?
>>940406 На GTK написан GIMP. Точно Си тяжко подходит для гуишек? Опыт есть в этом? Я бы попробовал (времени навалом) но если это не имеет смысла, то и знакомиться с GTK не стоит.
>>940412 Да, я как-то криворуко это наделал. Вроде консолька что-то выводит, но всегда что-то непонятное вылазит. Типа массив создаётся, где каждый индекс номер слова, а элемент индекса - количество букв для гистограммы. Вроде правильно проинициализировал массив, но количество строк всегда разное и не поддаётся нужной мне логике. http://pastebin.com/v8Zbu0aN
>>940429 А, я начинаю понимать по поводу своего 1.21. Предположение такое: каждый раз после нового getchar() место putchar() уходит в начало строки. Или как всё обустроено? Я вообще не могу представить, как C обрабатывает вводимый в консоль текст, как он понимает, когда надо начинать обрабатывать. Т.е. я нажал Enter, это вроде бы \n для C, ноон после Энтер начинает работать и Enter становится как EOF...
>>940440 может шиндосовская кодировка энтера воспринимается как EOF. Я же наоборот не могу найти в Убунте сочетание для EOF ctrl-z работает как стоп-сигнал какой-то >[1]+ Stopped
>>940455 > игнорит Ввод по умолчанию line-buffered. Enter тыкай после Ctrl+Z/Ctrl+D.
>>940429 Таб - это не 8 пробелов. Таб втыкает нужное количество пробелов до следующего табстопа. А табстопы располагаются на каждой 8-ой колонке. Т.е., один символ и таб - 8 знакомест, два символа и таб - тоже 8 знакомест, 8 символов и таб - 16 знакомест. От этого и пляши.
>>940415 >если это не имеет смысла, то и знакомиться с GTK не стоит. Имеет смысл, если интересно. А так писать на С с gtk гораздо медленнее, чем на том же python или javascript. Тут тебе и хоть какая-то типизация, сегфолты, если не понимаешь как что-то работает и прочие радости.
КАКОГО ФИГА?! Я только на пару недель отлучился выучить ассемблер, выучил кое как теперь си кажется бредом шизофреника, но тем не менее я его использую И теперь мой код не работает. Я не понимаю почему. В области обведённой синем происходит бесконечный цикл. Не понимаю почему. Я проверял через printfы wik и width и у меня через некоторое время wik был больше width. Но цикл продолжал работать как упёртый но глупый рабочий на зло всем. Из-за чего так? Уже 2 часа мучаюсь над этим http://pastebin.com/HrreXvdL
>>941448 > u64 width; > u64 height; И ведь только в прошлом треде мы говорили о том, почему вредно копировать байтики поверх структур (и переменных). У тебя 64-битная неинициализированная переменная, ты пишешь значение в младшие 32 бита (на little-endian машине), а в старших битах что? - мусор. Если по счастливому совпадению мусора нет в width, значит, виснет во внешнем цикле из-за height. Алсо, нахуя тебе вообще 64-битные размеры изображения?
>>941497 очень громкий и высокий крик разочарования но и пониманияАААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААА Я всё понял! Почему-то мой мозг принял 64-битные числа за 4-байтные. От жеж дидько, какой я не внимательный иногда. Спасибо, анон.
>>941530 да уже не актуально, я просто хотел у себя запустить, было интересно, откуда там мог бесконечный цикл взяться, но походу его там не было изначально
Вот вы тут сидите конпелируете, а вот тут вот: http://www.iso-9899.info/wiki/Books — написано, что 'Learn C The Hard Way' суть негодная книжка и не стоит её на второе место в шапке вывешивать.
Подскажите простой способ рандома поэффективнее, чем нижеследующий. void random(int mr[],int size,int min,int max) { srand(time(NULL)); int r, d; d=max-min; for (r=0;r<=size-1;r++) mr[r]=rand()%d + min; } Данной функции передаётся массив, его размер, максимальное и минимальное значения элементов. Если функцию вызвать три раза массивами разных размеров, но с одинаковыми min и max, то всё будет очень уныло, например, как на пикрил. Что заменить, что добавить?
>>941598 double random(void) { return rand() / (double) RAND_MAX; } // 0.0 .. 1.0. И дальше городи эти свои (int) (random() * d) + min. Будет слегка получше.
>>941598 Ах да, srand() нужно вызывать один раз в начале программы. time() возвращает время в секундах, и если между вызовами прошло меньше секунды, то получается, что ты инициализируешь генератор одним и тем же значением, и, конечно же, получаешь одни и те же данные.
>>941605 > double random(void) { return rand() / (double) RAND_MAX; } Это что? Функция? Её перед моей random вызывать? Т.е. ей название другое дать, да?
>>941625 Лол. Нет, твоя основная проблема была >>941613 в этом. А использование RAND_MAX просто дает последовательности с менее заметными корреляциями, по сравнению с использованием остатка от деления.
>>941598 Я знаю лишь как на ассемблере такое сделать. Надеюсь там можно вставлять асм код. rdtsc ;ложит в edx:eax количество тактов, которое прошло после последнего сброса процессора mov peremennaya,eax ;в переменную с названием peremennaya ложит значение eax, которое меняется каждый такт
Правда я могу где то ошибаться, может надо [peremennaya] написать или что-то такое.
Я просто гуманитарий-ниасилятор, который тремя постами выше от K&R охуел. Ты не представляешь, насколько таким как мы бывает в радость технаря подъебнуть, особенно насчёт ассемблера или чего-то такого.
Есть функция, в которой многократно используется переменная с длинным названием, я хочу её сократить. Как лучше делать, так: int var = ebat->long->name->var; или так: int *var = ebat->long->name->var;
Кто будет работать быстрее? Как надо делать? Надо ли делать вообще?
>>942573 Вот тебе три вопроса. Если на каждый ответишь без гугла - то можешь скорее всего. Если же даже вопросы вызовут WTF, то продолжай учиться. 1. Чем конвенция cdecl отличается от fastcall? 2. Дана структура struct { char a; int *b; double c; } x; Чему равен её sizeof? Как его уменьшить? 3. В двух объектных файлах есть переменная с одним и тем же названием, в файле с main она объявлена как extern. Что произойдет при попытке собрать приложение?
Плюсаны, нужно написать некоторую программу с графическим интерфейсом игорь типа тетриса, но показать ее работоспособность нужно на университетском древнем пека. На чем там байтоебы рисовали окошки в 2007?
>>942599 > с main она объявлена как extern Всмысле? Если название такое, то оно зарезервировано под функцию объявления её в других .c файлов командой extern из хидера, или я чего-то не понимаю.
>>942599 > Чем конвенция ... отличается 1) Чем угодно. Может не отличаться. > Чему равен её sizeof? Как его уменьшить? 2) Чему угодно. Удалить из нее лишние члены. > Что произойдет при попытке собрать приложение 3) Сборка приложения.
>>942599 Правильные ответы, если кому интересно. Но лучше попытайтесь ответить сами.
1. cdecl передает аргументы на стеке в обратном порядке, fastcall - часть в регистрах, и лишь то что уже не влезет - на стеке. 2. Зависит сразу же от нескольких факторов - разрядности системы (это влияет на sizeof(int *) и размеров данных (это влияет на sizeof(double) - если CHAR_BIT != 8, то размер будет не 8). Дальше в игру включается выравнивание, его уже сами гуглите. Отключить можно через #pragma pack или в gcc через __attribute__((packed)) 3. Произойдет ошибка линковки. Что-то вроде Multiple definition of ...
>>942632 > Произойдет ошибка линковки. В оригинальном вопросе про инициализацию не было ни слова, а без инициализации ошибок не будет, привет фортрану.
>>942633 1. Стандартная практика в сжатые сроки определять уровень знания предметной области - задавать несколько глубинных вопросов и экстраполировать полученные ответы. Выковыривать знания каждого аспекта - слишком долго. 2. Со всеми тремя вопросами я сталкивался на практике, так что имеет. Ты не представляешь, как часто люди приводят указатель на структуру к (uint8_t *), отправляют как бинарные данные, а потом удивляются, что на другой стороне ЧОТО НИТО ПРИХОДИТ.
>>942636 Признаю, мой косяк. Но, собственно, ответ вполне мог был бы выглядеть "если инициализируем переменные, то так, а если не инициализируем - то так". Это был бы только дополнительный плюс тебе в карму.
>>942650 Скучно. Ты бы лучше спросил, что будет, если сделать так: #include <stdio.h> static char foo[]; int main(void) { return printf("%zu\n", sizeof(foo)); }
>>942632 >fastcall Да, но текущее архитектурное состояние нам же надо сохранить перед вызовом и после вызова восстановить. Один фиг оно, получается, на стек уйдёт. В чём профит? В обычном варианте ты внутри функции пихаешь на стек значения используемых регистров перед вызовом (push x R), чтобы их потом в конце функции со стека обратно в регистры записать (pop x R), плюс пушишь и попишь аргументы функции (push x A + pop x A). Итого (A + R) x 2 стековых инструкций. В fastcall -- пихаешь на стек регистры, в которые запишешь аргументы (push x A), в конце функции восстанавливаешь регистры обратно (pop x A). Между делом пушишь и попишь оставшиеся аргументы на стек (push x K + pop x K). Итого (A + K) x 2 стековых инструкций. Получается, что профит в количестве инструкций будет только тогда, когда K < R, т.е. количество оставшихся аргументов (>= 0) меньше количества используемых функцией регистров.
>>942664 > один фиг оно, получается, на стек уйдёт Есть функции, которые больше ничего не вызывают (leaf functions). Во многих RISC-ах даже специально существует регистр LR, хранящий адрес возврата, чтобы вообще не трогать память и работать побыстрее. Сохранять те регистры, через которые передаются аргументы, обычно не нужно, плюс часто есть еще регистры, которые сохранять не нужно. Их можно юзать и получать неплохое ускорение на коротких функциях.
>>942664 Не все регистры являются callee-saved. Если, допустим, у тебя функция одного аргумента, то он передастся в eax (или rax), ты там же в рамках регистра с ним поработаешь и через eax же вернешь. Никакого стека.
>>942668 Это какой такой фасткол использует eax/rax? Кроме тех случаев, когда компилятор каждую функцию вызывает по-разному, наиболее удобным ему способом, не следуя никаким конвенциям.
>>942671 У меня в памяти отложилось, что фасткол в этом плане не стандартизирован и каждый компилятор (идеологически) может реализовывать как хочет. В любом случае, я привел лишь синтетический пример.
>>942695 Ты поехавший что ли? В стандарте си ничего нет, кроме языка. Там даже стека нет. Соглашения о вызовах стандартизируются в описании ABI процессоров.
>>940222 Таких кастрировать надо. Охуеваю от андроеда на тиви, ну блядь, ну ладно бы железо там было норм, но нет же, на самое вшывое и давлик прокручивает говнокод. 5 минут нахуярить на С гуй с линукса. Написали бы приложение для арча на арм, чтобы консолька, все нормально, вейланд.
>>943416 Если бы не сраные приложения для телевизоров, в эти телевизоры бы продолжали пихать ртос с мгновенной загрузкой и без тормозов, а не ублюдочный линукс.
>>943442 Ну я же сказал > чтобы ты страдал А чтобы не страдать, ворнинги для системных либ стоит выключать. Я свой код стараюсь собирать с Weverything, даже если считаю, что компилятор излишне придирается. Единственное, что выключаю для всего проекта - высер столмана -Wno-date-time[/spoile]
>>943447 > ворнинги для системных либ стоит выключать. Как? Нагуглить не смог. Впрочем, после того, как я внёс pkg-config в "``" вместо "$()" никогда не понимал этой прыщемагии, шланг уже на кайру не ругался.
>>943447 >ворнинги для системных либ стоит выключать. И да, шлангист, подскажи такую вещь. Шланг очень много ругается на unused functions, unused parameter, как отключить эти ворнинги?
>>943472 Неиспользуемые параметры в колбеках затыкаются чем-нибудь типа: #define UNUSED_PARAM(x) ((void) (x)), а неиспользуемых функций у тебя быть не должно.
>>943493 >>943494 Неиспользуемые функции они на будущее, ещё не реализовал части программы с ними. Тоже самое с неиспользуемыми переменными, функционал с ними просто ещё не запилен. Но зачем мне каждый раз при конпеляции видеть эту информацию? Сейчас отключу, потом включу.
>>943424 Но приложения все-таки могут быть полезными. На линукс все есть, новое не сложно сделать, а вот через давлик/арт это дохуя ресурсоемко, у меня на пк столько памяти не жрет сколько на вшивом смартфоне, а у тв еще и разрешение большое. Комп может жрать меньше 100мб с загруженой графической оболочкой. Андроид почти 300 со старта жрет. >>943500 У моего говно-тв реагирует норм, долго реагирует именно если начать набирать номер канала. Но утубик и все остальное совершенно не работает, вообще. Только одно приложения с говноканалами кое как тащит. А с флешки почти норм (на самом деле нет). Хорошо не мой телик, Я бы такой не покупал, лучше взять монитор хороший и отдельно приставку с хорошим железом которую можно будет заменить когда в говно скатится, а монитор - это почти всегда на порядок лучше изображение.
Вот только почему андроид не понял.
Годные смарт тв начинаются от 3К бачей думаю, но переплачивать за смарт не знаю зачем, лучше взять панель с HDMI 2.1 DP 1.4 SuperMHL и ебатся уже только с приставками.
>>943447 > Я свой код стараюсь собирать с Weverything, даже если считаю, что компилятор излишне придирается. Кастишь unsigned int в int при, например, сложении одного с другим? Меня шланг завалил подобными претензиями, но по-моему кастинг тут выглядит плохо.
>>943515 А зачем ты функции эти компилируешь? Закоментируй, скрой макросами, вынеси в отдельный файл и убери из мейкфайла. Компилятор ведь прав что ты муть компилируешь, убери, и компилируй что уже работает.
>>943520 (int) перед выражением написать это каст? Надо явно указывать всегда, или перевести другую переменную в просто инт, так должно производительнее выйти, потому как никаких конвертаций не будет.
>>943520 > Кастишь unsigned int в int Ты такой кастишь, а в результате у тебя отрицательное число. Поэтому, хоть язык и не требует, лучше для себя же пометочку сделать, мол, вот кастую явно, значит, и о проблемах подумал. То же и с кастами в меньшие по размеру типы.
>>943532 >Что выглядит вполне няшно. А так: >a = b + (int32_t)c; Не правильно пишешь, формат задается один раз перед всем выражением. А вот int+uint вернет мусор, тут и надо указывать (int) в начале выражения один раз. Или если int+float тоже форматировать надо в флоат.
>>943553 >А вот int+uint вернет С float все ясно, а вот интеджеры могут прокатить и без форматирования, например если добавляем к юинту отрицательный инт и результат не отрицательный. Поэтому лучше или один всеобъемлющий инт юзать или явно конвертировать чтобы не получить неожиданых ошибок, дебажить может быть очень трудно если пропустил.
>>943563 Как быть с char и unsigned char? Строка char* скармливается конечному автомату, у которого есть потребность индексировать этим символом в массивах состояний, и отрицательные индексы ему конечно не нужны. Тут методом тыка за секунды решается, но интересно, как оно по канону.
>>943566 Очевидно, что если у тебя 8-битная кодировка, то и строки unsigned char. А если 7-битная ASCII (или какой-нибудь ASCII-совместиый UTF-8, и тебе насрать на все кроме ASCII), то можно и проверить, не притащили ли лишнего в старшем бите.
>>943566 unsigned юзать для ясности, конечно отрицательных значений там быть не может. static const unsigned char - так объявляется алфавит в ядре linux. Почему обычный char работает нормально стало интересно, он конвертируется наверно тоже.
int main(int argc, char argv[]){ return 0; } Почему так пишется, а не unsigned int main(unsigned int argc, unsigned char argv[]); Ведь количество не может быть отрицательным, и возвращать отрицательный код ошибки незачем и сами строки по природе из unsigned char состоят, зачем тогда по другому принято? Было бы гораздо проще вместо unsigned int uint писать.
>>943584 > Почему так пишется Потому что давным давно символы были 7-битными. Отрицательный код ошибки удобен (чтобы отличать невырный синтаксис аргументов от ошибок выполнения полезной части программы, например). А вот size_t argc был бы к месту, но... обратная совместимость.
>>943619 Вектор - это последовательность элементов, массив. В Си массивы есть. argv - это массив указателей на char.
>>943620 Если тебе сложно написать два слова, пиши только unsigned. Во-вторых, товарищ Шахиджанян ждет тебя. Или нормальный IDE. В-третьих, макросы для типов зло, используй typedef.
>>943622 Это не массив а указатель на массив, значения переданые не копируются, а ты получаешь только указатель, тоесть ты можешь переопределить его внутри функции. Аяаяй такгого не знать. >>943622 uint короче ведь. typedef не уверен что лучше, макроса в программе уже не будет, а typedef уже в программе обрабатывается, лишние затраты, всегда проигрывал с манек брезгующих #define для констант, это ведь самая настоящая константа hardcoded в програмку, а не определяемая при исполнении с выделением памяти.
>>943633 Если уж придираться, то указатель на массив имеет типа "указатель на массив". А массивы в аргументах функции неявно преобразуются к указателю на первый элемент этого массива.
>>943630 > всегда проигрывал с манек брезгующих #define для констант, это ведь самая настоящая константа hardcoded в програмку, а не определяемая при исполнении с выделением памяти. Ебать дебил.
>>943624 означает вектор, но векторов в C нет, это массив argv ты обращае >>943631 Чем дефайн плох маньк? >>943660 Он не подставит значения манька тупая, const можно задать во время выполнения. А дефайн это впечатано в код программы. Попробуй int s; scanf("%d",s); const int d=s; printf("%d",d); Это такипеременная которую нельзя менять.
>>943670 > Алсо, память все равно выделится. Да похуй, хоть 100 раз. Никакого "компилятору нужно ее читать" нет и это главное. >>943671 Научись следить за ходом обсуждения, прежде чем влезать, а пока иди нахуй.
>>943674 >читать Если знаешь значение константы зарание то #define как правило лучшее решение. const же совсем не для того, и конст будет иметь свою ячейку в памяти.
>>943675 >#define как правило лучшее решение. Может быть и так, но у многих на препроцессор категорическая аллергия - и на то есть существенные причины. Это следует понимать, а не быть неполноценным аутистом вроде тебя.
>>943741 > >многих на препроцессор категорическая аллергия >везде так или иначе использовался предпроцессор. Это совершенно ортогональные утверждения. А ведь ты и правда туповатый аутист, плохо быть тобой.
Совершенное число. Как вывести сумму всех делителей совершенного числа на экран? void main() { int a, i, x1=0, cnt=0, summ=0; printf("Vvedite luboe desyatichnoe chislo:"); scanf("%d", &a);
for (i=1; i<=a-1; i++) { x1=i; if (a%x1==0) summ+=i; } printf("summ=%d\n", summ); if (a==summ) printf("Sovershennoe chislo"); else printf("Ne sovershennoe chislo"); }
>>943897 > транслит как признак именно говнокода >>943899 > Ссылку на ебучую песочницу делай, а не гавнокод вставляй. > мимо У меня нет кода другого анона, ибо я мимо, но я же вижу, что ты человека просто так обоссал.
Посоветуйте, пожалуйста, подходящее решение для моей проблемы. У меня есть простой алгоритм написанный в матлабе. Пикрил. Который там занимает 4 строчки.
Хочу сделать тоже самое, но теперь на си/си++. Читал, что в крестах есть std::vector, но не уверен, что это то, что мне нужно.
1. Мне нужно хранить 2d вектора. Их будет очень много. Миллионы штук. 2. Отсортировать их в лексикографическом порядоке. 3. Подсчитать число уникальных векторов.
Больше ничего делать с ними не нужно.
Есть ли уже готовые инструменты в стандартной библиотеке для этого?
Алсо могу рассматривать только элементы языка по стандартам C89 и C++03 максимум. Т.к. компилятор будет MSVC 2010. И изменить это нельзя.
>>942599 1. За функцией __cdecl стек чистит caller, в __fastcall некоторые аргументы передаются через регистры. 2. Выравнивание, наверное, на double, поэтому sizeof будет 3 * sizeof(double). Или char будет выровнен на размер указателя, а затем будет лежать double. 3. Хуй знает.
>>943755 Как и случаем ранее. Видишь ли, использовать макроопределения для заранее известных констант - это классическое и повсеместно используемое решение, и на то действительно есть существенные причины. Вне зависимости от чьей-либо (твоей прим. авт.) аллергии.
>>944241 >препроцессор с - мерзостный высер от дегенератов для дегенератов (тебя) >использовать макроопределения для заранее известных констант - это классическое и повсеместно используемое решение Опять же - совершенно ортогональные и истинные утверждения.
>>944241 >Видишь ли, использовать макроопределения для заранее известных констант - это классическое и повсеместно используемое решение, и на то действительно есть существенные причины.
Настолько существенные, что нельзя использовать enum?
>>944304 Алсо логически более правильно использовать enum для связанных параметров (список состояний, например), а не объявлять через него любую целочисленную константу, попавшую в исходный код.
>>935715 (OP) Сап, пр, помоги нюфагу, есть файл с числами, считываю из него числа в массив и вывожу его во второй, все бы ничего, да только считывается только первая строка файла, как заставить цикл переходить и на вторую строку?
>>944371 Во-первых, никто не мешает тебе написать const register int = MY_DEFINE там, где это требуется. Макроопределения вообще удобнее тем, что их можно легко расшарить, а в случае с константными переменными - это уже либо static, либо extern. К слову, объявлять регистровые переменные в global scope - это как раз не самая популярная практика, и не все компиляторы это одобряют. Во-вторых, если тебе нужно экономить на спичках, то не повод ли это отказаться от C и посмотреть в сторону ассемблера?
Все тотже начинающий неосилятор. Сделал таблицу для квадратов и кубов числа но она съезжает в бок когда число становится больше. Как записать чтобы число выдавало справа налево? http://pastebin.com/kvkkDLUs
printf возвращает число символов, которое он вывел. Делаешь так: отдельно печатаешь числа и отдельно печатаешь пробелы. Напечатал число - проверил число символом - добилдо нужного числа символов пробелами.
Поясните начинающему: пытаюсь запилить строки с длинной и rc. С динамической-то частью всё просто, но как прописать это в статике? Т.е в асме я бы прописал что-то типа: hello_ref DW -1 hello_len DW 11 hell_data DB "hello world", 0 В принципе возможно сделать без спецефических для компилятора хаков?
Сап, ребят, где-то видел нерабочий код на C (кажется был прототип функции, без тела, и она в main вызывалась), который gcc при этом под O3 компилил и не жаловался. Вроде в твиттeре кто-то постил прикола ради давно еще, но это не точно, помогите плз найти
Похоже на параною с моей стороны, но всё ж успокойте меня: Для ro строк использую структру {int rc; int len; const char data[];}, ну что бы её в неизменяемую секцию ложило, для rw - {int rc; int len; char data[];}. Тут ведь гарантирутся их эквивалентность? Компилятор ничего не соптимизирует?
Короче, строковые литералы компилятор всегда суёт в RO-секцию и тип у них const char[<длина>], поэтому присваивать их можно только указателям на const char.
>>944635 > >К структурам это не имеет никакого отношения. Ну, кроме упомянутого в предыдущем предложении присваивания. Нормальный компилятор не даст присваивать указателю на char. Ну или по крайней мере прокукарекает warning про ISO C forbids blah-blah-blah...
>>944935 > Qt да, ну или .net если ты аутист > все руководства и книги по ней mfc было тухлым изначально, даже пакистанские говноеды из мелкософта это признавали, так что книги актуальны до сих пор мимо winapi->mfc->qt господин
>>944951 Только Qt-говно что на C++, что на QML одинаково тормозит, в отличие от MFC, в котором хоть и абсракции, но хотя бы ничего не лагает на пустом месте.
Посоны посоветуйте современной литературы по C (С11 желательно). Раньше читал K&R когда был задротом, но уже подзабыл. Хочется начать снова на чем то более свежем.
>>946339 Я лично считаю c++ мем языком из-за его плохого дизайна. В язык просто накидали рандомных фич для решения непонятно каких проблем. Вместо дженериков эти шаблоны, которые "решают" две проблемы одновременно. Но они хуже джавовских/растовских дженериков и в метопрограммировании мягко говоря сосут
>>946359 Не ебу, что за абсракции. За всю жизнь написал на нём два с половиной хелловорлда и теперь дрочу FMC, как видно тут >>944661 Запилил всратый калькулятор, что попробовать ещё сделать? олсо для матриц хуету, которая будет считывать определитель?
>>945730 Создаешь C++ проект, добавляешь файлы с расширением .c, пишешь. Кукаретиков не слушай, они даже не пробовали.
>>946180 Да, memset забивает циклом память. В общем случае выбираются инструкции с операндами "пожирнее" (SSE c 128-битными, например), а адреса, не подходящие для этих инструкций (невыровненные начало и хвост буфера), заполняются с помощью инструкций с меньшим количеством операндов.
>>946335 > напомните, malloc по стандарту выдаёт выравнивание к double? Выдает адрес с выравниванием, подходящим для любого нативного типа. Если именно double требует наибольшего выравнивания, то да.
>>946460 > Те смотрю в диспетчере 0 эффекта Что ты в диспетчере смотришь? Я так понимаю, это винда, в винде десяток колонок на тему памяти. Алсо, настоящую память тебе дают по мере использования - попробуй забить свой гиг единичками (не нулями!).
>>946463 1) На стеке ты можешь выделить не больше нескольких мегабайт. 2) Целочисленные константы по умолчанию int, этот int переполняется при умножении. Добавь к любому числу в строчке с size суффикс ULL (unsigned long long).
Что читать:
- Классика от Отцов: http://www.cypress.com/file/56651/download
- Годное пособие для гуманитариев: http://c.learncodethehardway.org/book/
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/%7Eats/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. Древний, но все еще актуален.
Stephen Prata "C Primer Plus, 6th Edition" (2014)
Свежая знает про C89, C99, C11, описывает различия, объемная около тысячи страниц, годная хотя есть некоторые шероховатости, с вопросами, упражнениями и ответами. Читать после K&R или до.
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? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
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. Kochan "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://arhivach.org/thread/106153/
- https://arhivach.org/thread/131949/
- https://arhivach.org/thread/140570/
- https://arhivach.org/thread/153698/
- https://arhivach.org/thread/155908/
- https://arhivach.org/thread/173837/
- https://arhivach.org/thread/180461/
- https://arhivach.org/thread/182958/
- https://arhivach.org/thread/188294/
- https://arhivach.org/thread/193780/
- https://arhivach.org/thread/198868/
- https://arhivach.org/thread/206632/
- https://arhivach.org/thread/211714/
- https://arhivach.org/thread/217128/
- https://arhivach.org/thread/223224/
- https://arhivach.org/thread/235327/
- https://arhivach.org/thread/237852/
Шапка: http://piratepad.net/bJ1SdmkZyu