24 декабря Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!
Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
- Очевидный GCC. - clang: оче годно, батя рекомендует. - Intel C++ Compiler: оптимизации, тысячи их. - Visual Studio 2015 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)
Stephen G. Kochan "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
Закину и сюда, вдруг это какой-то подводный камень и в ньюфаго треде о нём не знают. Есть один цикл while ( read(client_socket, &c, 1) > 0)
Теперь тело. Варианты: putchar(c) - всё окей, результат устраивает.
putchar(c) printf("%d ", c) После каждого символа он ещё и код поясняет.
А теперь внимание: printf("%d ", c) выдает совсем другой результат. По крайней мере, коды последних символов не совпадают с вариантом, в котором есть putchar(c). Что за говно? С сокета гарантировано постуают одинаковые символы.
>>839218 Не, мне не очень зашло именно это видео, хотя все что я услышал на этих лекциях про указатели я понял сразу же. У меня теперь другая проблема, хорошо запомнить это., усвоить, и свободно использовать, и я не могу придумать как этого достичь. Читаю сейчас рекомендованную литературу для этого курса, хоть и просрочил все их "сроки" на джве недели уже. >>839217 Спасибо, именно так всегда и делаю. Когда не ищу отговорочки.
Поясни пожалуйста про регистры и RAM model. К примеру, у меня есть регистры размера w и слова размера w. Насколько я понял, то чтобы добавить 2 числа мне нужно: 1. Из памяти по указателю достать первое значение 2. Записать его в регистр 3. Из памяти по указателю достать второе значение 4. Совершить арифметическую операцию 5. Выгрузить результат из регистров в память
Что будет если у меня будет регистры размера w и слова такие, что l > w ? Смогу ли я их записать в регистры? Насколько я понял, то могу передавать на указатель на начало ячейки и размер самого слова.
>>839814 > Насколько я понял, то могу передавать на указатель на начало ячейки и размер самого слова. Не совсем понятно, о чем ты спрашиваешь. Ты не можешь записать слова размером l в регистры - получатся только остатки от деления, если у тебя little endian или частные, если у тебя big endian.
> Насколько я понял, то могу передавать на указатель на начало ячейки и размер самого слова. Кому передавать?
Если числа не влезают в регистры, ты складываешь по кускам, используя аппаратный флаг переполнения (если у процессора он есть) или вручную (если сумма меньше одного из слагаемых, добавляешь в следующий раз 1 к слагаемым).
Из предыдущего треда. Антуаны-железячники и мимопроходящие, подскажите, может быть кто-то знает, как решить мою проблему. Есть один CRC32, реализованный в железе. Соответственно, доступа к алгоритму нет. Есть файл и хеш к нему. Как узнать алгоритм, чтобы рассчитать контрольную сумму для других файлов? Перебором полинома? Может быть, какие-то методики есть? Брутфорс - крайне медленное, но, похоже, единственное решение.
сисюны, есть ли стандартная функция для вывода на консоль подстроки из массива, не оканчивающейся на ноль но с известной длиной (типа printf %★s но без спотыка на 0).
>>840233 А вот если бы ты не читал кривые переводы, то знал бы общепринятый термин string literal. Алсо, string literal - не строка, а последовательность символов. И если ты не хочешь следовать формату строк, который ожидает printf, можешь тупо вывести свою последовательность символов через fwrite, который как раз и предназначен для вывода последовательностей элементов.
Сап. Объясните ньюфагу, почему на втором круге цикла программа дважды выводит строчку "ЗАГАДАННОЕ ВАМИ ЧИСЛО %число%? (пикрелейтед). Не могу разобраться, аж бесит. Вот код: http://pastebin.com/04TWJ0Vg
>>840379 или при работе с программой жми Ctrl+D (или что там в винде нужно жать, чтобы дать знать, что ты закончил input) вместо Enter, а то получается, что ты ещё вводишь знак переноса строки и он также считывается scanf'ом
Аноны, чот я соснул, не омгу запилить функцию чтобы добавляла новый элемент в линкед лист. Укажите, где ошибка в коде? про ошибку в моих генах я уже знаю
>>840433 Давай разберем: 1) В строке 27 ты ебешь list_pointer, пока он не станет NULL. В строке 31, где ты вызываешь insertEntry, он, удивительное дело, все еще NULL. 2) В строке 43 ты определяешь автоматическую (локальную) переменную. Автоматические переменные "живут", пока не выйдут из области видимости. Т.е., после выхода из insertEntry все указатели, которые у тебя указывают на newEntry уже указывают на мусор. Тебе нужен malloc() или пусть вызывающий создает новый элемент, а insertEntry будет его только втыкать (допустим, ты в main создал элемент, вызвал insertEntry, она его воткнула, и пока выполняется main, жив и элемент, все ок). 3) В строке 50 ты зацикливаешь список (нарисуй и увидишь). Тебе бы нужно присваивать list_pointer->next. 4) Там же после вставки уже нет смысла крутиться в цикле. Воткни break или return. 5) Подумай, что ты передашь, если захочешь элемент в начало (сделать его первым). Алсо подумай, как в таком случае ты уведомишь вызывающего о том, что его начало списка - уже не начало списка (можешь либо всегда возвращать указатель на правильное начало списка, либо принимать указатель на указатель на начало и модифицировать его по необходимости).
Сап. Поясните нюфане, что значит "error: address of stack memory associated with local variable 'array' returned"
У меня есть функция int toArray (int length, int number) { int array[length]; for (int i = length-1; i >= 0; i--) { array = (number % 10); number = number / 10; } return array;
в методе main делаю так: int array = toArray(5, 13542);
>>841043 Такс, все равно все спят или всем похуй, но я всё таки нашел решение. Если возвращать не array, а создать новый массив в функции, например ar, и сделать ar=array; return ar; то всё будет работать. Стоит ли в это вникать новичку, или забить?
Нужно написать программу, считающую периметр квадрата (знаю, что для даунов задача, язык учить начал буквально пару дней назад, а программы нужно писать уже сейчас). Объясните, где проебался, что не так, а то я понять не могу.
тут опять приуныл, что нельзя никак проверить вместимость члена структыры в статик ассерте. как же, всё-таки, хуёво. но придумать что-то надо, а то этож пиздец, забудешь, изменишь, и в переполнение.
ещё было бы ништяк, иметь сравнитель членов разных структур по имени, чтобы они совподали или нет. или проще, чтоб одна структура была подмножеством другой. иногда так нужней, ведь меньше оверхеда, ну, определить значения, чем в оболочке структуры пребывать.
всё это заставляет меня пить, пить много. хотя не это, а воля. попёр ка я до ночного незаконного
>>842112 Это вам в кресты, батенька. Алсо, вот сколько пишу, никогда из-за этого проблем не было. Из-за == были, на единичку ошибался, маски неправильно писал, промоушены эти блядские опять же. Но вот чтобы структуры перепутать - это надо суметь!
возможно ли сделать инлайн функцию, не в хедере, но чтоб также работало? чёт как-то не красиво получается. нихуя не понимаю как оно там работает, везде леплю static inline
>>843357 Я тебе сейчас очередной секрет открою: когда компилируешь с высоким уровнем оптимизации (в современных компиляторах не обязательно) от этой директивы не зависит вот совсем нихуя.
Погугли про weak функции в си, насколько я помню инлайн так же для этого используется.
Анон, прошу помощи: Прога должна выделять заголовки функций в тексте программы Пикрил - результат работы Подкинете тестовых примеров? Какие подводные камни? Что не учтено?
>>844000 Так, я вас понял и благодарю.. Невалидного объявления не может же быть в правильно написанной программе? Заголовок может находиться в одной строке с объявлением глобальных переменных, да?(
Алсо, может подскажешь, можно ли эту всю задачу делать без регулярных выражений, но и не каким-то тупым посимвольным перебором?
>>844007 >Невалидного объявления не может же быть в правильно написанной программе? Это да. Но ведь твоя программа только исходник получает на вход и не может знать, правильная программа или нет. Или я что-то не так понимаю?
>Заголовок может находиться в одной строке с объявлением глобальных переменных, да? Компилятору все равно. Главное, чтобы это было разделено точкой с запятой.
>без регулярных выражений Синтаксический анализ. Если не хочешь заморачиваться вручную, то найди описание синтаксиса сишки в формате БНФ, возьми оттуда правила, которые описывают объявление функций (со всеми зависимостями, разумеется) и задействуй ебическую силу flex+yacc.
>>844049 Ну какбе выхлоп генератора тебя волновать не должен, вне зависимости от его вида. В этом же весь его смысл. Другое дело, если имеется требование наговногодить парсер вручную. В таком случае надо получше смазать анус и попытаться сесть им на дерево грамматического разбора, попутно теребя лексемы и надрачивая на алгоритм сортировочной станции.
>>844064 > Другое дело, если имеется требование наговногодить парсер вручную. Все парсеры сколько-нибудь не-хипсторских языков "наговнокожены" вручную.
>>844070 Насколько я понял, у анона была задача написать детектор объявлений функций, а не полноценный язык. Поэтому я и говорю, что в данном случае проще воспользоваться генератором, если не стоит жесткого условия ручной реализации.
>>844012 >>844014 >>844050 >>844073 Спасибо каждому анону за сочувствие , но я почти ничего не понял Условия задачи: тестовая программа написана правильно, а сама задача - лаба (2 курс), стандартные библиотеку подключать можно
>>843959 Задача гораздо сложнее, чем ты думаешь. http://pastebin.com/Gf25Psct - абсолютно валидный синтаксис, хоть и бессмысленный. Для лабы норм и то, что у тебя.
>>844741 Ты передаешь по значению указатель на массив символов. Внутри функции ты присваиваешь указателю адрес другого массива символов. После выхода из функции этот указатель перестает существовать. Чего же ты ожидал? Тебе нужно две звездочки, а не одна.
>>844752 Работает лишь по недоразумению. По счастливому совпадению указатели на две строки отличаются только младшим байтом: 0xaaaaaa10 и 0xaaaaaa14, например. И внутри функции ты пишешь единственный char, и этим char ты правишь младший байт указателя с 0x10 на 0x14, например. Но если конфигурация (количество строк в программе, компилятор, опции компиляции) изменится, магия может не случиться, и на выходе будет мусор. Не делай так больше никогда.
>>845142 Начинать изучать язык с чтения стандарта не стоит. Возьми Прату сначала хотя бы. Если язык знаешь, и хочешь почитать именно стандарт, читай C11.
>>845907 Первый элемент массива, который заканчивается на '\0'? Я же правильно понимаю, что ОС просто выделяет адрес памяти, начиная с которого я могу что угодно сохранить, но не задену ли я что-то другое в памяти, если введу слишком большую строку?
>>845947 > Первый элемент массива, который заканчивается на '\0'? Ну да, только если ты этот массив в str присвоил. Ты присвоил?
> Я же правильно понимаю, что ОС просто выделяет адрес памяти, начиная с которого я могу что угодно сохранить Неправильно. По счастливой случайности str указывает на какую-то область данных, в которую у scanf получается насрать без видимых последствий. В следующий раз может повезти меньше. Алсо, ОС тебе ничего не выделит, пока ты не попросишь. Тебе нужно char str[скольконадо] или str = malloc(скоканадо) или char buffer[скольконадо]; str = buffer.
> не задену ли я что-то другое в памяти, если введу слишком большую строку Заденешь. Поэтому стоит указать максимальный размер строки, которую scanf скопирует по твоему указателю (%32s, например).
Анонче, скастуй указатель туда, где мне ошибку искать? Решил cs50 пройти 2016го года, решаю шифр вижненера. Очевидно, что с вычислениями где-то напортачил, двоешник https://ideone.com/IlQ4GL
Вопрос, как в консоли выводить псевдо/графику/символы в режиме реального времени и строго в пределах одной границы. Например, что бы полоса бегала в пределах [ ] квадратных скобок. Или символ в скобке менялся в той же строке. В сторону какой библиотеки смотреть? Пробывал бесконечные циклы, так они мне засирали весь терминал
Хочу написать процедуру, где на вход подаются координаты точек (float x, float y). А в теле производится серия вычислений с заранее известными точками. Таких точек будет 475 (соотвественно у каждой будет 2 координаты). Каким образом мне в самом коде программы ввести это точки, чтобы было удобно и работать и вводить? Массив?
>>846312 Создавай пустой проект C++, создавай файл, сохраняй с расширением .c. Компилятор там один и тот же, язык определяет по расширению (ну или в свойствах можно насильно указать).
>>846317 Я и так создал сначала С++, написал свою программку на Си и мне выдало тип int не поддерживается Думаешь, если сохранить и запустить, поможет?
PellesC ругается на Unresolved external symbol '_WinMain'. Создавал консольный проект, в исходнике определил функцию WinMain, после этого в настройках проекта включил расширения майкрософта и прописал точку входа WinMain. Не помогло. Изменил тип проекта на Windows - тоже не помогло. Как тут это настраивается?
>>846347 Ох, как все тяжко. Нагугли хелловорлд что ли, вставляй код в функцию main(), а не просто в файл. > exit Для вызова функций надо () обязательно указать. А у exit() еще и аргумент есть - код возврата. 0, например. > if ... printf(3); exit; if действует только на первое после скобочек выражение. Если хочешь условно выполнить несколько выражений, заключи их в {}: if (a==b) { printf(...); exit(...); }
> printf(3) Принтф не печатает числа, он их форматирует, и ему нужно указать, как именно. Например, printf("%d\n", 3), чтобы отформатировать 3 как целое число (со знаком, если есть), а \n добавляет переход на новую строку.
>>846170 И написать простейший скрипт, который конвертит координаты из того формата, в котором они у тебя сейчас, в сишный код. А то заебешься вручную.
>>846354 Нет, ну я типо знаю что в паскале вывод это println, тут printf Поэтому и написал
В общем, вся суть: Даны три числа, одно из которых отлично от двух других, равных между собой. Определить порядковый номер числа отличных от остальных.
Нам просто нихуя не показали в универе, даж за компы не пускали ещё, хахх
>>846373 iostream - это кресты. Тебе нужно #include <stdio.h>. Алсо, одинарные кавычки - для символов. Для строк - двойные. А у тебя еще и открывается одинарной, а закрывается двойной. Так даже в этих ваших паскалях нельзя.
>>846383 Напиши #define _CRT_SECURE_NO_WARNINGS в самой первой строке файла (перед #include). Алсо, оно обычно предупреждение, а не ошибка, как ты это сделал?
Раз тут такая нюфаго-движуха началась. Вот я, например, студентота, 2 курс.
Узнал от старшекуров, что С на кафедре очень востребован, и есть смысл его учить к дополнению к преподающимся предметам, чтобы участвовать во всяких кафедральных движухах, преподских проектах и прочем ботанстве
И, собственно, вопрос: насколько чистый С востребован сейчас, и сложно ли потом перекатиться на плюсы(который сейчас, думаю, всяко популярней)?
>>846404 > >Узнал от старшекуров, что С на кафедре очень востребован, и есть смысл его учить к дополнению к преподающимся предметам, чтобы участвовать во всяких кафедральных движухах, преподских проектах и прочем ботанстве
Ты уверен что тебе по пути с этими чуханами?
>И, собственно, вопрос: насколько чистый С востребован сейчас,
Самые крупные проекты написаны на нём, каждый кодер обязан его хотя бы уметь читать.
> и сложно ли потом перекатиться на плюсы(который сейчас, думаю, всяко популярней)?
>>846404 >насколько чистый С востребован сейчас Скорее всего будет востребован всегда, покуда архитектура кампуктеров не будет меняться. Язык простой. Можно за месяц выучить целиком и полностью. В отличии от крестов писать на нем приятно. Хоть и гемморно местами.
>>846397 Пишу на Си больше десяти лет, и до сих пор его не знаю. За короткий срок можно научиться только писать наполненный UB и зависимый от платформы код, который сломается в следующей версии компилятора. Ну и тривиальные хелловорлды, состоящие из библиотечных функций, в которых налажать просто негде.
>>846496 +1 same shit от себя добавлю: положим, я вот в собственном кодинге не юзаю вещественные типы (не та прикладная облвсть в общем), дак вот скажу честно - что и не знаю всех подводных камней с плавающей точкой или вот, в принципе, на нелокальных переходах можно сэмулировать исключения (в потрохах постри, например, так сделано), но я не делал так, так чтож не могу сказать что я знаю это то есть сишка хоть и выглядить маленьким языком (строк нет, встроенных средств работы с массивами нет, управления динамической памяти нет и прочее и прочее), но в ней хватает тех областей, которые ты не будешь знать, тк это не будет покрывать круг твоих практических испльзований
>>846404 Работаю разрабом электронных девайсов, кодю на сях контроллеры и под венду в среде лабвиндовс, для моих потребностей хватает с лихвой. Мой коллега тоже сишник, недавно вкатился в плюсы без проблем.
>>846584 Динамически менять стиль в зависимости от либы? Да ты охуел. Будь последователен: или пиши всю программу, как майкрософт заповедал, или используй свой стиль везде. Я вот, например, camelсase предпочитаю даже в сишечке (fooBar для переменных и функций, FooBar для типов), брат жив, на хейтеров похуй.
>>846589 >Будь последователен: или пиши всю программу, как майкрософт заповедал Тогда не получится определять функции с именами типа ReadFile. Использование read_file стиля здесь бы выручило.
>>846595 Иметь ReadFile и read_file в одной программе? Да ну его нахуй. Если это какой-то конкретный тип файлов, я бы отразил это в имени - ReadConfigurationFile, например, а если это просто обертка, то это тоже стоит как-то показать. Ты же почему-то ее пишешь вместо вызова ReadFile, вот и называй соответственно.
>>846576 Вообще не читал книжек, всë по примерам и руководствам различным. На сайтах производителей контроллеров обычно тысячи примеров, как правило привязанных к периферии. Компилишь пример, проверяешь работоспособность на железе, а дальше уже смотришь что из него взять в свой проект, что доработать.
Посоны, посоны, снова та студентота со всё той же подгорающей лабой и кое-чем ещё Условие: в тексте правильно написанной программы на С выделить заголовки функций. Пикрил - результат работы. Очевидно, что 4-ая непустая строка не обрабатывается (а очень бы хотелось) Прога: http://pastebin.com/nEdEyQC7 Возможно, более важную роль должны играть круглые скобки, но я просто вот ни..чего не могу заделать :(
Мб кто поможет
Можно разбивать строку на части от ; до ; и проверять эти части.. Но так у меня получается правильно только для 4-й строки пикрила, а всё прочее через кое-что подгорающее
>>846642 Какой курс-то? Препод тебя затроллил скорее всего. В таком виде это нереализуемо (алсо, >>844171). Да даже просто для такого вот: int foo = 1; и int foo (void); тебе придется заглядывать вперед, и ты никак подсветку на лету не сделаешь.
>>846589 >Я вот, например, camelсase предпочитаю даже в сишечке (fooBar для переменных и функций, FooBar для типов), брат жив, на хейтеров похуй. Бро, я ещё и отступы по Оллману делаю, все смеются и показывают пальцем.
>>846648 Курс 2, Си 2-й семестр идёт. Я был бы рад, будь это троллинг, но на то не похоже. Как мне кажется, ему надо, чтобы были рассмотрены случаи, что у меня на пике, но как бы не то чтобы у меня и они все получились
>>846651 Ну попробуй немного другой алгоритм (он тоже кривой, но словит чуть больше функций). Тебе надо прочитать весь файл, удалить (или скипать по ходу дела, что сложнее) все комментарии и директивы препроцессора. Дальше идешь по тексту в поисках открывающих top-level { и ; top-level - значит, что ты увеличиваешь счетчик фигурных скобок всякий раз, когда найдешь открывающую, и уменьшаешь, когда найдешь закрывающую, и тебя интересуют { и ; только когда этот счетчик равен 0. Варианты развития событий: 1) Ты встретил по пути =, это инициализированная глобальная переменная, ищешь точку с запятой. Если этот вариант не проверять, сломаешься на int foo = (1); . 2) Ты встретил { - это либо struct/union/typedef/массив/итд, либо это начало функции, узнаешь это по наличию ) прямо перед {. Пробелы и переводы строк, разумеется, игнорируешь. Затем ищешь закрывающую } этой функции. 3) И, наконец, ты встретил ; - это какая-то декларация, проверяешь по наличию ) перед ; . Вот как-то так.
Как это сломать: атрибуты гцц, old-style (K&R) functions, static_assert, на программах с синтаксическими ошибками тоже сломается, но в целом, наверное, должно работать. Хотя хуй знает, я не пробовал.
Естественно, выводить очередной блок текста ты начинаешь, когда встретил ; у декларации (1, 3) или } у функции (2).
>>846663 Алсо, вариации вот такого void foo(char a[1+(sizeof((int){1})==2)]); сломают и условие про =, и условие про ){, а код, между тем, вполне валидный.
>>846404 >И, собственно, вопрос: насколько чистый С востребован сейчас Платиновый вопрос. Пока будут существовать UNIX-like системы, этот язык будет востребован. Но работу на нём (особенно в рашке) ты в лучшем случае найдёшь только для эмбедеда.
Ну это бесполезно в приведенном примере, но вообще, это compound literal. Оно создает безымянный int равный 1. Слева тип, справа инициализаторы для него. Как если бы ты сделал: int foo = {1}; но только без имени. Для int оно нахуй не нужно, но, например, у тебя есть функция, принимающая указатель на вектор, и ты можешь не создавать лишнюю переменую явно, а сделать: result = some_function(&(Vector) { 1.0f, 0.0f, 0.0f }); Это C99, если что.
Привет, программачик, я ньюфаг в C. Поясни, можно ли сделать в нём адекватный гуй? С чего начать? Я спермоблядь, на линукс нет места в данный момент. Сейчас я поставил Code::Blocks IDE и вроде как запустил свой первый хэлловорлд. Как мне высрать окошко, формочку, кнопочку? Какую библиотеку для этого посоветуешь использовать?
>>847206 Ну в крайнем случае, ты можешь нарисовать интерфейс на Windows API, а чтобы не ебаться с созданием окошечек вручную и прочиими циклами обработки сообщений, используй dialog manager (загугли DialogBoxParam), тогда диалоги сможешь рисовать в любом редакторе ресурсов.
>>847206 Я знаю, C++ для этого куда больше подходит, но я бы всё же хотел именно на сишечке. Что такое GTK? Как его установить? Сам я пытался, но ничего не вышло.
>>847226 >>847303 Визуальный конструктор со своей библиотекой контролов типа показометров, индикаторов, тумблеров, кнопок. Есть также текстовые элементы, таблицы, графики, обработка данных, сеть, многопоточность, еще куча всего. Можно и для прикладных задач использовать, почему бы и нет. Винапи поддерживается, но для своих задач я только Sleep использовал из винапи, больше не потребовалось. Куча примеров есть в дистре и на сайте.
>>847556 также на крестах можно писать winrt приложения, gui включительно, доступные с windows 8 также на крестах можно писать UWP приложения, доступные с windows 10
>>847556 >>847562 > также на крестах Ты тредом ошибся. Алсо, если уж выбирать кресты, то сразу кутэ. > WinRT, UWP Нинужно. Это такой сервелат, который в отличие от сервелата еще не стух.
Что почитать о деклараторе __declspec(naked) и для чего он используется? Я его заюзал просто потому, что нужна была функциональная обертка для моего ассемблера. Но возникла проблема при компиляции FindGetProcAddr: error #2202: 'auto' not allowed in function with __declspec(naked)
Почему так? Как использовать результат вызова GetKernel32 внутри другой naked-функции?
>>847639 Ты сказал, что тебе не нужно создавать стековый фрейм. Естественно, что теперь компилятор не может выделить KERNELBASE на стеке. Можешь сам выделить, можешь KERNELBASE в регистре хранить. Можешь выкинуть нахуй naked.
Сап, первый курс не знающий нихуя язык и его возможности, а лабы делать уже надо, много. С целью экономии времени и более легкого вкатывания в язык, нужен анон, который сможет дописать бегинер уровня лабу в 80 строк и объяснить мне ее в скупе за денежное вознаграждение , либо прямо со мной вместе ее в скупе сделать http://ipm.ifmo.ru/wp-content/uploads/2016/09/pb-s1-lab2.pdf - лаба, вариант 12 Вот то что успел накатать сам http://pastebin.com/K3dQy9QM Skype: atomraspad
Как можно получить счет как в виндовом калькуляторе? Т.е когда я ввожу 480 / 1024 я получаю ноль int foo, bar foo = bar/baz А в калькуляторе я получаю 0.46875, можно ли получить такой ответ если не делать foo = bar/baz foo2 = bar%baz printf("%d%d",foo,foo2) ?
У меня есть такой код, который я скопипастил из своего проекта на C++ и переписываю на си: http://pastebin.com/BZ9yE3mm
Почему-то ничего не компилируется. Выдаются ебанутые ошибки:
error #2001: Syntax error: expected ')' but found 'msg'. Extraneous old-style parameter list. Syntax error: expected ';' but found ')'. Syntax error: expected ')' but found 'msg' Extraneous old-style parameter list
сисюны, решительно пояснили за архитектуру. как трушней, чтобы функция возвращала значения установив код ошибки в ссылочном параметре или наоборот, возвращать код ошибки инициализировав значение в ссылочном параметре?
>>849187 Честно говоря, мне представляется только одна ситуация, когда использование первого варианта обосновано. Это когда любое возвращаемое функцией значение может быть интерпретировано как корректное. Но даже в этом случае я не стал бы для кода ошибки заводить отдельный ссылочный параметр, т.к. если функций, потенциально завершающихся с ошибкой, будет много, то это что, каждой такой параметр заводить? И тогда в каждой обособленной части программы должна быть своя переменная для хранения кода ошибки? Или что, делать несколько способов обработки ошибок в одной програме? Ну это 100% отсос и лишняя путаница. Так что советую второй вариант. Либо же возвращать значние, а в случае ошибки возвращать некорректное значение. Например, если программа возвращает указатель, то в случае ошибки возвращай NULL. Если функция при нормальном завершении возвращает положительные числа, то в случае ошибки пускай возвращает отрицательные. Если по возвращаемому значению нельзя сказать, произошла ошибка или нет, то код/флаг ошибки можно устанавливать в глобальной переменной или определеить целую глобальную структуру, хранящую состояние программы/модуля и несколько полей внутри нее для хранения кодов ошибок от разных источников. Доступ к полям такой структуры, разумеется, лучше обеспечить через процедуры.
>>849195 >каждой такой параметр заводить? да. но не каждая функция будет его использовать. зато все API будет выглядеть охуено.
void fun1(int ★param, int ★err); void fun2(int ★param1, int ★param2, int ★err); void fun3(int ★param1, int ★param2, int ★rval, int ★err); void fun3(int ★param1, int ★param2, int ★rval1, int ★rval2, int ★err);
>>849206 > зато все API будет выглядеть охуено Это охуенное API? Я должен в каждую функцию передавать указатель под код ошибки, даже когда мне на него насрать? Притом, мне вообще в большинстве случаев нужно знать, произошла ли ошибка, а какая конкретно - интересно только при взаимодействии с ОС. Если тебе так хочется выдавать вменяемую информацию об ошибках - сделай явный или неявный (per-thread) контекст. В остальных случаях return false/return NULL/return -error/return SIZE_MAX будет вполне достаточно.
Суп, хеккеры. Где можно почитать о том, что такое extern "C" и для чего это нужно? Как я понимаю, эта штука позволяет объявлять функции так, чтобы их имена были без декораторов.
>>849401 Именно extern "C" в си нету, это плюсовая хуитка, для обратной совместимости. Просто extern – это о линковке и у него дохуя предназначений, открой гугл.
>>849328 > передавать указатель под код ошибки, даже когда мне на него насрать можешь пихать 0, если он не используется. хотя мне такой подход тоже уже разанравился. ща еще пару десятков функций накидаю и буду посмотреть, может действитьльно хуйня выйдет.
>>849328 и да контекст есть, но он не везде используется, такая же хуйня как с еррорами, только в профиль. а вот если везде пихать контекст, в нем ставить ошибку и все функции возвращают как бул? хм...
>>849428 > контекст есть, но он не везде используется > если везде пихать контекст Зачем везде что-то пихать. Я ведь писал уже: сделай его глобально доступным через процедуры (см. пикрел, например).
>>849458 У такого подхода есть недостаток - у тебя может быть только один инстанс (или, если контекст thread_local - один инстанс на поток). Для твоего примера это вполне нормально, но представь, что у тебя не приложение, а либа, которая как-то обрабатывает данные и выделяет память по необходимости. Чаще всего, у тебя будет какой-то стейт, и вот тут-то логично хранить в нем и код ошибки тоже. Стейт придется пихать в каждую функцию или делать его текущим, как контексты в OpenGL/OpenAL. Алсо, никогда не начинай идентификаторы с подчеркиваний. И других не приучай к плохому.
>>849477 > А где у меня там такое? __APPCONTEXT_H__ же. Да, вероятность проблем в данном случае околонулевая, но лучше раз и навсегда отучиться. И с одного подчеркивания тоже нельзя, если, конечно, ты не пилишь свой компилятор.
>>849613 Там есть глобальный скрытый активный контекст, ты можешь в него писать и читать соответствующими функциями (glClearColor, например), только в него, и только через API, но не напрямую. Ты можешь создать сколько угодно других контектстов и делать их активными по необходимости. Так как основной юзкейс таких библиотек - один контекст, это позволяет упростить код, избавившись от передачи контекста в каждую функцию, но и не проебать возможность иметь несколько контекстов (неосновной юзкейс), пусть и ценой некоторого неудобства.
>>849618 А вот стандарт сишечки говорит, что с __имена и _Имена зарезервированы языком. Приватные переменные и функции с одного подчеркивания начинать можно, если они static (не торчат наружу).
>>849629 >А вот стандарт сишечки говорит, что с __имена и _Имена зарезервированы языком. Приватные переменные и функции с одного подчеркивания начинать можно, если они static (не торчат наружу). вся это хуйня от приплюснутых блядей, всервано их конпилятор символ '_' приставляет.
>>849638 Нет, эта хуйня, чтобы в новом стандарте могли беспрепятственно запилить _Static_assert, а твой код из-за этого не сломался. И, что важнее, чтобы не сломался код тысяч пользователей твоей либы. И чтобы разработчики компилятора могли без помех для тебя объявлять в хедерах стандартной библиотеки всякие _printf_locked и прочие детали реализации.
>>849612 > в мире линуксов все срать хотели на стандарты Боюсь, что в данном случае на стандарт насрать абсолютно всем. На пике хедеры из состава MS Developer Studio, Solaris, OpenBSD и IRIX. Таким образом объявлять хедеры учит даже Таненбаум в своей книжке по разработке ОС.
>>849685 Никто, разумеется. Просто как-то неуютно становится, когда отходишь от общепринятой практики. Все таки, не язык для стандарта, а стандарт для языка.
>>849689 > Все таки, не язык для стандарта, а стандарт для языка. твоему стандарту пять лет в обед и его еще будут переписывать и переписывать если не забьют, а соглашения пошли когда и с99 небыло.
Зачем меня студентоту учат хардкорному байтоебству? У вас было такое? Я понимаю реальные задачки - маски, сдвиги и проч, реально нужно для ембедщиков. Но есть абстрактное говно чтобы заебаться. Например проверить можно ли сложить два целых числа без переполнения. Нельзя никаких циклов и операторов вообще (if && || < > и тд) только битовые | & ^ и тп. Это на интервью что ли такие вопросы задают? Ответы легко гуглятся но там какая то тарабарщина из ^ ~() & () , просто пиздец.
>>850092 > там какая то тарабарщина Вот чтобы это не было для тебя тарабарщиной, чтобы ты понимал, а не выучивал шаблонные действия, тебе и дают странные задачки. Хотя стоило бы потратить время на подбор реальной задачи, но нашим преподам обычно лень.
Учи все до чего дотянешься не ной, во-первых мозги развивает, во-вторых однажды таки понадобится и будешь хоть иметь предствавление что есть такая штука.
>>850210 Вот смотрите, нужно написать функцию которая сравнивает два числа и возвращает 0 или 1.
То есть вместо простого if (a > b)
нужно как-то так:
return !!(((( ~(x ^ y) ) & (y + ~x + 1) ) | ( y & ( x ^ y ) ) ) >> 31 );
Сириусли? Реальный синьор программер сможет такое написать? Оно нужно ему? Как это развивает? Не ною просто спрашиваю. Анон ты бы устроился на работу, где бы тебя заставили искать баг в таком коде?
>>850217 нытик ебаный, на тебе риал пример, есть сорта вафель 1-325, и есть группы к которым эти вафли относятся, например малиновые: 1, 7, 9, 20, 55, 85, 90, 253...321. на вход поступает вафля и нужно в риалтайме определить входит ли она в группу. вот здесь и начинается битоебство с масками и сдвигом, чтобы было быстро и понятно, а ифы и свитчи в этом случае для таких вот плачущих пидоров как ты.
>>850250 Надуманный пример. Как думаешь, во сколько инструкций развернется битоебля и что будет быстрее - битоебля или один лукап в таблице? В общем-то, большинство обоснованных случаев битоебли перечислено здесь: https://graphics.stanford.edu/~seander/bithacks.html А задачки, как раз, чтобы понимать, а не гуглить и копировать.
>>850253 >битоебля или один лукап в таблице? а вот здесь ты ошибаешься, битоебство дает пасасать свитчу, я тут даже примеры выкладывал, но всем как всегда.
>>837592 (OP) Ананасы, посоветуйте какие-нибудь анализаторы использования динамической памяти, чтобы получить более-менее интуитивно понятные результаты в виде текста и, может быть, графики.таблицы. Я, конечно, могу LD_PRELOADнуть какой-то свой хук для malloc и сыпать дебажной инфой, но может быть есть какие-то элегантные решения?
Привет, антошки. Допустим есть на локальном компе прога которая обменивается пакетами с сервером. Каким образом можно отловить их и посмотреть содержимое?
>>850464 Если у тебя ключ есть, можешь плагин написать, чтобы парсило. Если нет - отлаживай софт и вытаскивай из него ключ, но если у софта ассиметричное шифрование, и его писали не дебилы, то это тебе ничего не даст.
Котаны, можно ли в макросах работать с подстановкой? Например, если второй аргумент макроса не ноль, вызвать выполнить подстановку одной функции, иначе другой:
>>851719 Почему бы и нет? Или выражение можно посчитать на этапе компиляции, то компилятор с любой минимальной оптимизацией ненужную ветку выкинет. Только не забывай скобочки расставлять, а то 2 * func(1, 2) может посчитаться не так, как ты предполагаешь.
>>851738 смотри, есть функция для получения значения из хеша: hash_get(hash, key, len) третий параметр длина строки. в коде, мне нужно иметь доступ как по литеральным строкам, так и по динамическим: hash_get(hash, "name", sizeof("name")) hash_get(hash, str, l)
так вот, хочу макрос где если третий параметр равен нулю, то длина будет вычисляться как sizeof(key) иначе использовать переданное значение.
>>851812 > как то через жопу Лол, ты просто не видел, наверное, как препроцессор по-настоящему ебут. Я вот могу тебе сделать то, что ты просил (>>851769 с проверкой на литеральный 0), и вот уж это точно будет через жопу.
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int error C2146: syntax error: missing ';' before identifier 'h' warning C4081: expected 'newline'; found ';'
При этом еще и на выражение HHOOK hHook = NULL; компилятор ругается: не может найти определение NULL. В чем тут проблема?
Аноны, подскажите есть [code] int revolution = 20; float Tdr = 1.12345; float tm = int * Tdr; printf("T\t%f", tm); [/code] Получаю хуйню округленную до сотых! Какого хуя? Собственно вопросы 1. Если умножаю int на float, результать какого типа получаю в итоге? 2. Почему такое дикое округление? 3. Физический смысл, умножаю натуральное число на вещественное, хочу получить вещественное число, как это сделать на си? 4. Где эти моменты описаны в стандарте?
1. Указывай нужную точность. Например, %.8f. 3. Просто умножить эти два числа, компилятор сам сконвертирует натуральное до вещественного. 4. С11 (в шапке), 6.3.1.8, Usual arithmetic conversions; 7.21.6.1, The fprintf function.
>>851825 >как препроцессор по-настоящему ебут. нет не видел, это наверное мамкины хипстеры, нормальные люди делают без выебонов >Я вот могу тебе сделать то, сделай
>>851939 Открой исходники любого сишного проекта (например исходники питона, за них ручаюсь), папкин нехипстер. Будешь очень удивлён насколько они вымазаны макросами с ног до головы и как ими долбятся во все щели.
>>851979 Нет, когда у тебя проект из 10 подкпроектов с подпроектами состоит, и в каждом подпроекте таргет - shared object, то становится крайне геморрой мейк писать.Еще проблемы с переносимостью и зависимостями. У тебя в мейке нет нормального способа определить целевую платформу или компилятор системы.
>>851939 > сделай Наслаждайся: http://ideone.com/4seDQT У первого варианта есть очевидные проблемы - оно матчит именно литерал, т.е., если третьим аргументом 0+0 передать, то будет бида-бида. И, что гораздо хуевее, оно в целом не работает, если третий аргумент начинается не с идентификатора.
>>851971 > Симейк Хуета с синтаксисом похуже сишного препроцессора, с прибитыми гвоздями путями и ключами компилятора, которую не понимают даже ее разработчики. Шаг вправо, шаг влево от того, что оно считает нормальным? Добро пожаловать в ад, снова. Нет макросов для твоего компилятора? У тебя персональный ад. Кросскомпиляция? Нутыпонел.
Можете попробовать объяснить далбаёбу? Не могу понять работу cin.clear(); хотя и прочитал уже много где чего. К примеру почему при неправильном вводе (вводе букв в int переменную) я попадаю в бесконечный цикл?
int main() {
int i = 0; int j = 0;
while (1) { i++;
cin >> j;
if (cin.fail()) { cout << "Fail!" << endl; cin.clear(); }
>>852000 насладился. в первом случае variadic macros со всеми вытекающими, во втором не соответствует условию, т.е. нужно разворачивание на этапе препроцессинга. два однострочных макроса с различными именами - вин. хотя очень странно, почему препроцессор не имеет своего полноценного языка, хотябы типа мэйка, с циклами условиями и прочим.
>>851952 Я специально для тебя прошёлся поиском по кучке ведущих сишных ПИДАРСКИХ проектов, итого вымазано в макросах с ног до головы: - OpenSSL; - Его БИЖАПАШНЫЙ форк из которого по заверениям авторов вырезано 2/3 всего - LibreSSL (макросов там реальзо заметно меньше, но всё равно дохуени); - Cpython; - Ruby; - Erlang; - Perl (лол); - GCC (там от плюсов только перегрузка операторов и отсутствие большинства shadow cast-ов, лол, хз нахуя они вообще с си слезали официально); - Linux (да, их там дохуя, хотя учитывая кол-во драйверов, хуиток вроде perf и пр. в одной репе нельзя сказать что всё ядро ими измазано, но всё на удивление легко читаемо - и ничего сложнее коротких побитовых смещений из 2-3 действий, вот как действительно надо писать); - jemalloc; - gdb; - а дальше заебался, алсо, во многих кроме того ещё сторонние кодогенераторы/скрипты были.
После этого ты приводишь аргумент о непидорстве mysql - самой обоссаной бд особенно в 2к16 когда настолько уёбищно масшабируемая бд даже вебмартышкам не упала нахуй, которую любят и не поносят только пхпшники, лол. Про долбоебизм людей, которые полностью пишут бд на си, при том что 95% времени своей работы она записывает и считывает что-то с жд: это, конешно, кек. Алсо, пхп кстати тоже так же писался чисто и без макросов, что как бы намекает.
>>852140 ой бля, я обосрался, не майэскюэл, а эскюэлайт. ну во первых, тут разговор не в количестве макросов, макросы это заебись, а в их сложности. второе, в таких проектах много опционального и платформозависимого кода разруливаемого препроцессором.
>>852149 >эскюэлайт Лол. >второе, в таких проектах много опционального и платформозависимого кода разруливаемого препроцессором. Всякую хуиту с условной компиляцией я и не учитывал если что.
>>852151 >Лол нет, погугли его часто ставят как пример хорошего кода, это можно сказать мем. так вот, здесь вопрос в том как ебут макросы, ты там много встречал наподобии >>852000, или они все довольно просты? в нормальных проектах, они сходу читаемы и никакого мозгоебства с ними нет.
>>852140 >mysql - самой обоссаной бд >особенно в 2к16 когда настолько уёбищно масшабируемая бд даже вебмартышкам не упала нахуй Такие категоричные заявления могут себе позволить только люди мало что понимающие в БД. Что собственно подтверждается >Про долбоебизм людей, которые полностью пишут бд на си, при том что 95% времени своей работы она записывает и считывает что-то с жд: это, конешно, кек. Видно студентика или человека который о БД знает понаслышке. мимокрокодил
>>852174 >А о чём вообще спор? В любом сишном проекте макросов туева хуча. Сложно найти проект, где бы их не было Спор о том, что тот госопдин спизданул что-то в стиле "макросами всё вымазывают только пидары". >Это ты хуитка. perf отличная тулза. Хуитка по кол-ву кода относительно всего кода в репе. >>852164 >так вот, здесь вопрос в том как ебут макросы Мальчик, ты не видел что такое "ебут макросы". >нет, погугли его часто ставят как пример хорошего кода, это можно сказать мем. Исходники гита тоже часто так называют. Тольк вот суть их простоты как и у ядра линукса - они сами по себе максимально простые, и десятиэтажными макросами срать там негде. >или они все довольно просты? Это как шаблоны в плюсах. Пока их мало - всё хорошо читается, когда разрастаются в вложенные 10 раз хуитки - получается write-only говно с магией. >>852177 >пук
>>852179 > "макросами всё вымазывают только пидары". ой не пизди, господин писал, что >нормальные люди делают без выебонов без хитровыебанныз макррсов, капиш >>852175 >2 место - Perl. Присуждаются премии "самое нечитабельное говнокодище" и "лучшее наименование полей": Здесь ты обосрался, Sv это скалярный вектор, ну и остальные буковки имеют смысл.
>>852202 Sv это как Gv, только Sv? Наименование-то может и осознанное, но выглядит как конченное говно из-за экономии на буквально паре символов, как и весь перл. >>852203 Ну лан.
>>852208 >фигасе пару Да, пару. Можно назвать хотя бы в стиле s_vec — на клавиатуру нужно нажать на 2 кнопки больше, зато читаемость несравнимо выше. >да Бля, а я-то забыл что сижу в си треде с ретроградо-неосиляторами. >>852215 >главное незабыть документашк Всегда помнить документацию чтобы знать что это за тип — это блять просто максимальное днище в мире стилей кодирование. Хорошо что перл умер.
>>852108 > variadic macros со всеми вытекающими Какой variadic macros? Там три фиксированных аргумента - hash(a, b, c). Ты __VA_ARGS__ увидел и испугался? Там нам нем if реализован. Но там есть другие проблемы, и я о них уже сказал
> нужно разворачивание на этапе препроцессинга Впервые слышу. Оно на этапе компиляции разворачивается, зачем тебе именно препроцессором?
Алсо, да, я тоже хочу более мощный препроцессор в сишечке. Но, видимо, не в этой жизни.
>>852175 1 место норм код, не вижу никакой проблемы вообще, это идиома. Если платформ полторы, то можно inline/forceinline, если нужно C89, то приходится так.
ребзя, после того, как я отредактировал текст, в консоле в конце иногда печатается пикрелейтед ( a n d l e r f g ШcXH). причем по разному, иногда просто _ h a n d l e r ШсХН, всякие квадратики, которых там быть не должно например. что за хуета?
>>852946 void в аргументах по историческим причинам. Раньше в декларациях функций не нужно было указывать типы аргументов. Чтобы отличить древние декларации с какими-то аргументами* от современных функций без аргументов, в сишечке в функциях без аргументов пишут void, а использующих пустые скобки всячески обоссывают за неспособность учиться.
>>853793 Вопрос не правильно поставил. Сейчас более менее вник. Суть API этого - обращение к дб. Т.е если я хочу использовать JavaScript, мне нужно просто переписать все функции на нем.
Другой вопрос, не лучше ли будет написать скрип в JS, который будет запускать С программу (child process) и output из этого С скрипа передавать обратно (через pipe)? Т.е использовать С библиотеку все-таки.
Это будет экономнее по времени, чем переписывать функции в JavaScript? По производительности?
ребят, есть способ посмотреть код стандартных функций? сейчас на обучение часто встречаю задачки из разряда "репродюс такуе то функцию", и иногда не понимаю до конца логику функции из мана (саму идею понял но потом встречаю пару исключений и появляются вопросы)
>>853934 >>853924 Таки нет. Хотя я не программист. Я не могу дать определение разрядности процессора, но могу привести примеры.
1) Древний 8-разрядный 6502. АЛУ работает с 8-разрядными числами, адресное пространство 64КБ. Соответственно указатели 16-битные. 2) x86. Адресное пространство ограничено системой команд до 64ГБ. Регистры общего назначения 32-разрядные. Указатели 32-битные. Но есть всякие SSE, в которых есть регистры с большей разрядностью.
То есть разрядностью процессора нельзя назвать ни разрядность АЛУ, ни разрядность шины адреса. Может быть разрядность процессора это разрядность регистров общего назначения, но что называть регистром общего назначения? Так что по моему нельзя дать однозначное определение.
>>854108 > x86. Адресное пространство ограничено системой команд до 64ГБ Один дурак сказал, все повторяют. 4 ГБ адресного пространства. Иди еще раз посмотри на картинку дескриптора сегмента из мануалов.
> есть всякие SSE, в которых есть регистры с большей разрядность Прочитай память по адресу, содержащемуся в SSE-регистре, а потом приходи спрашивать, что называют регистром общего назначения.
>>854055 Гитхаб, различные опенсорсные сишные рантаймы. Вижуал студия, исходники CRT в комплекте.
>>854142 Ты еще про оверлеи расскажи. PAE - это те самые оверлеи, когда ты в разное время маппишь разные участки физической памяти в виртуальную. Адресное пространство остается 4 ГБ, такие дела.
Решил заняться настоящим программированием, но послее ООП головного мозга не очень понятно как в процедурщине реализовать тру шаблоны проектирования. Существуют ли они вообще? Конкретно шаблоны проектирования под Си, не под си с объектами, а именно в том виде каким он должен быть? Киньте ссылку на литературу годную. Поиск выдает какую-то поебень типа Objective-C и тому подобное.
>>854203 >Object-oriented ansi c книга годная, но бля это же пиздец пиздецовый, для ооп есть плюсы и жаба, зачем страдать хуйней то? >>854161 чем тебя ооп не устраивает
Разработайте программу,которая вводит целое положительное число в промежутке от 1 до 100 (необходимо предусмотреть обработку ошибок при вводе). В соответствии с этим числом сформировать записи трех видов: "Ваш возраст 1 год", "Ваш возраст 22 года", "Ваш возраст 75 лет" ''Вам до совершеннолетия 17 лет'',''Вы совершеннолетний 4 года'','''Вы совершеннолетний 57 лет" "Вам до пенсии 59 лет", "Вам до пенсии 48 лет", "Вы на пенсии 15 лет"
Наваял программку, она компилируется, но ничего не выводит (параша, да). http://ideone.com/oUP7qD
>>854853 У тебя в main декларации функций т.е., ты как бы говоришь "сап, гцц, есть одна функция", а не их вызовы. Вызовы делаются так же, как и у всяких библиотечных printf(): имяфункции(тут аргументы, если есть);
По отдельности все работает, специально отдельно проверял каждую из функций с разными значениями, вот только все вместе не работает, хотя и ошибки не выдает.
>>854874 > Не прокатило. Ты так говоришь, как будто это было единственной проблемой твоего кода: > return dy[3]; Ты, вероятно, думал, что возвращаешь массив из трех элементов? Нет, ты читаешь значение за пределами массива (всего три элемента, а ты читаешь четвертый), а возвращать массивы напрямую нельзя, используй указатели или, на худой конец, объяви глобальную переменную.
>>854888 Легковесное: берешь gcc (и msys/msys2 заодно), берешь любой текстовый редактор (например, саблайм). Отлаживаешь чем придется (x64dbg, IDA, gdb). Если хочется IDE, есть Pelles C, там свой компилятор и свой source-level отладчик.
>>854891 Саблайм лучше ноутпада плюх-плюх? >Отлаживаешь чем придется (x64dbg, IDA, gdb) Во что проще вкатиться, что удобнее? Gcc под шиндоус - mingw? Или что?
>>854896 > Саблайм лучше ноутпада плюх-плюх? Дело вкуса.
> Gcc под шиндоус - mingw? Или что? Да. Ставится в комплекте msys.
> что удобнее? Удобнее - нормальный отладчик с человеческим лицом типа студийного но студия весит в районе 5-10 Гб или Pelles C. В принципе, если потребность есть, то и gdb несложно осилить.
>>854901 А легковесные аналоги студии есть адекватные? Помню, в студенчестве пытался угорать по опенсорсу и лабы делал в code blocks. Не особо был от него в восторге. Студия годная, но жирная и платная, я не уверен, что такой софт на работе можно ставить себе. Да и мне по мелочам иногда использовать надо будет, так как я в большинстве случаев под arm/avr пишу, а на пекарне для тестов и облегчения себе жизни проще змею использовать.
>>854911 > студия ... платная Есть Community-версия, она бесплатная, но на работе ее использовать действительно нельзя.
Code::Blocks никуда не делся, оброс фичами и, возможно, стал более юзабельным. Есть еще всякие IDE на Java, тот же эклипс и CLion - они достаточно удобные, но как по мне, слишком уж неповоротливые.
>>854915 >на работе ее использовать действительно нельзя Ну вот о том и речь. Code blocks вообще юзабельный? Лет семь назад он мне показался весьма корявым. Но он как раз вроде легкий был весьма. CLion же тоже вроде платная.
>>854911 Юзаю NetBeans. Легковесной ее не назвать (ибо Java), но в остальном вполне удовлетворяет моим потребностям.
>>854915 >эклипс По функционалу норм. Но лично мне не подходит из-за очень крупных элементов интерфейса; на моем экране ничего толком не умещается. Хотя, может быть, оно и настраивается.
>CLion Платная же. Хотя, я слышал, они еще распространяют какую-то кастрированную версию.
>>854853 кун на связи. Я понял, что я полный еблан. Я не знаю, почти нихуя про функции, и в этой программе нагородил полнейшую херню. Как это лечить? Это пройдет? Что посоветуете?
>>854934 Вот твоя программа: http://ideone.com/1KfgB8 Удиви препода. На первый взгляд может показаться, что я издеваюсь. На самом деле я просто не люблю городить многоэтажные if'ы и терпеть не могу наличия в одной функции нескольких return'ов. Но если хочешь, можешь переписать как тебе надо.
>>854985 Баги специально оставил, чтобы >>854934 помучался? grammatic_form показывает нам все, что нужно знать о тернарном операторе. Алсо, твоя enter() сломана - введи a и нажми Enter. Вангую, что ты сам недавно выучил язык. Если будешь писать на нем, то с годами все перекосы пройдут.
>>854996 Один баг уже успел пофиксить (в последней функции). enter() тоже переделал. scanf - зло. Изменения внем прямо на ideone.
>Вангую, что ты сам недавно выучил язык. Лол. Так или иначе связан с Сишкой уже больше 10 лет. Просто внимательность никогда не была моей сильной стороной. Ну и да, прогу через отладчик не прогонял.
>>855004 > Так или иначе связан с Сишкой уже больше 10 лет. Ну хуй знает. Я не про баги. Я про комментарии с линиями, const int абсолютно ничем не отличается от int с точки зрения компилятора, разве что изменять нельзя напрямую, многострочные тернарные операторы нечитаемы, прототипы в .c, inline на который всем насрать... будем считать, что мой детектор дал сбой.
>>855010 >комментарии с линиями Вопрос вкуса, ящитаю. Просто мне так удобнее визуально воспринимать код. Первый раз такие коменты увидел в 2004 году и стех пор сам их использую.
>const int >inline Я это не для компилятора пишу, а для себя и для потенциальных читателей кода. Согласен, в маленьких учебных прогах можно забить на все эти нюансы. Как и на static в объявлении функции (файл-то один). Это уже чистая привычка. Я всегда так пишу. Да что там говорить, я даже restrict юзаю.
>прототипы в .c ideone же. Там нельзя создать отдельный буфер для хедера. Можно было, конечно, определить все функции перед main, но я делал методом "сверху вниз" и, как мне кажется, это затруднило бы чтение.
>тернарные операторы Ну тут я полностью согласен. Разумеется, в продакшн-коде такому говну не место. Но и давать очевидно наивное решение тоже не хотелось. Мне кажется, что >>854853 не помешает немного напрячь мозг.
Пока решил забить хуй на SDL, хочу попросить у анона совета насчет ncurses. Читал ли анон что-то по нкурсес охуенное, или ничего охуенней документации не придумано?
Поставил msys2 и code blocks. Mingw не заметил, что вместо установщика там менеджер пакетов, поэтому не поставилось. Инета на рабочем компе нет. Code blocks mingw из msys сам не находит, я пути руками указал, жму конпелировать, он пишет, что конпелятор вернул 0, но при этом нихуя не происходит. Как подружить его с msys2?
>>855354 Код не читал, хуй знает, что там считается, а ссылка на дуро^Wмэйлру не открывается. Но раз x и a типа double, то, их разность может быть достаточно малой, и при этом не нулевой. Сравнивать числа с плавающей точкой операторами == и != можно только в очень редких случаях. Используй вместо != 0 что-нибудь типа >= N, где N - достаточно маленькое ненулевое число.
>>855473 > вместо установщика там менеджер пакетов > Инета на рабочем компе нет Можно выкачать пакеты в офлайн (/etc/pacman.d/mirrorlist.*) и поставить с помощью pacman -U.
> жму конпелировать, он пишет, что конпелятор вернул 0, но при этом нихуя не происходит У Code::Blocks есть окно с логом компиляции. Компилятор там точно правильный и по правильному пути вызывается? Все ли длл оно находит наиболее частая проблема? Попробуй из виндовой консольки руками gcc сказать, проставив все пути так же, как в Code::Blocks.
Алсо у Code::Blocks есть дистр со включенным в него mingw.
>>855969 Твоя программа написана на C++. Ну это сильно сказано. Потому что если ты пользуешься iostream, то зачем подключать stdio? conio.h, насколько мне известно, не входит ни в стандарт C, ни в стандарт С++. В Си не бывает iostream, cin, cout и using namespace std. Попробуй мое решение. Оно довольно грубое, поскольку в идеале надо бы проверку на переполнение запилить. А я пока отойду не надолго. Если что, пиши.
>>855972 >В каком смысле плохо? Выдавала совсем не тот результат >В си нет cin/cout. бляяяяяя, точно сука сорян, просто уже 10 часов подряд сижу за математиками, вообще голова едет завтра ещё эту прогу надо сдать помоги пожалуйста переписать убрать >У тебя двойной цикл, который совсем не нужен >>855976 Да. Ну крч, мне тут один чел помог именно с циклом, видимо он не так поонял и написал на крестах но надо на Си щас чекну твое
>>856036 Лол, я даже не знаю, ожидает ли препод такого решения от >>855962 Обычно же хватает варианта "на отъебись". Если конечно это не лаба по мат. программированию.
>>856041 > Если конечно это не лаба по мат. программированию. Нет >ожидает ли препод Вряд ли, у меня преподша очень странная, я для себя пытаюсь понять просто
>>856038 >l что это перед d? Раньше в прогах писал >scanf("%f,%f", &a, &n) и работало
>>856064 >не копировать бездумно код, который тебе дали на дваче Ты сам хоть понимаешь, что пишешь? >>856071 Бляя, я надеюсь ты когда нибудь попадешь на мой факультет
>>856071 Ну, все таки, вопросы использования stdio - это специфика Сишки. Можно, конечно, было отправить его в ньюфаг-тред, но к чему умножать сущности? Как мне кажется, в данном случае, лучше показать, как решить проблему с printf/scanf, чем тупо отправить читать маны. Чисто чтобы потом у него не возникло отвращения к языку из-за одной единственной говнолабы.
>>856070 >И прочитай все таки доки на stdio. Спасибо большое, добра
>>856074 >Проблемы? Пруфани, что я код с двачей скопировал
Да и вообще, как я могу это знать? В школе у нас вообще не было информатики (к егэ сам готовился) В универе на странного препода попал, щас зайду с телефона кину тебе задание на допуск к этой самой лабе Все, что она обьяснила это int, while, for, do while и как кубриками этими ебаными рисовать блок-схемы
p.s. уже 11ый час сижу за расчетками по математикам, поэтому туплю довольно жестко
>>856083 >Пруфани, что я код с двачей скопировал У тебя в >>856047 вконце printf, а следом scanf. Может это конечно у тебя сделано, чтобы press any key before continue, но что-то мне подсказывает, что просто копирнул.
Пацаны, можно ли в sublime 3: а) запилить подсказку по функциям (ну типа когда вызов пишешь, чтобы он находил в указанных заранее директориях прототип и писал, какие параметры надо передавать. Ну типа как анаконда для пистона) б) запилить форматирование всего файла хоткеем? в) отображение определения макросов, а не названия файла, в котором оно находится
>>856247 > подсказку SublimeCodeIntel, но оно это одна большая проблема. В целом, проще считать, что нет.
> форматирование хоткеем Обертки вокруг astyle и clangformat, тысячи их.
> определения макросов Хуй знает, поковыряй, как оно там индексирует. Мне достаточно Goto definition (назначь хоткей, по умолчанию вроде нету) и потом Jump Back (Alt -).
Вопрос неуча. Это нормально, что scanf не может прочитать короткое целое число 255>=x>=0 в однобайтовый unsigned char, когда в строке формата стоит %d? На ideone читает, но не читает в signed. Какое-то непредсказуемое поведение...
>>856276 На том же ideone читает, если вместо %d указать %u, но на моем компьютере по прежнему ведет себя странно. Хм. Ну и ладно, проще считать в int и привести к char тогда. Наверное. Я же нуб и могу ошибаться.
>>856254 >SublimeCodeIntel Там по-моему нет C, а для пистона анаконда ну просто конфета. >Обертки вокруг astyle В смысле, обертки? Алсо, сниппеты - это типа как code templates в iar? Нихуя только не понятно, как их самому создавать?
>>856655 > SublimeCodeIntel > Там по-моему нет C И правда, извини.
> В смысле, обертки? В смысле, есть много плагинов, у которых внутри бинарник astyle в том или ином виде. Например, SublimeAStyleFormatter, там внутри pyastyle.
Есть одно приложение, которое отправляет DNS запросы. Нужно перехватить момент отправки. Но не пойму, как оно отправляет. Ставлю брекпойнт на send, sendto, WSASend, WSASendTo, gethostbyname - не использует их. Как отловить?
Что читать:
- Классика от Отцов: 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 2015 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)
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/
Шапка: http://piratepad.net/bJ1SdmkZyu