Вы видите копию треда, сохраненную 6 ноября 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Что читать:
- Классика от Отцов: 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/~ats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (он же C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт) не драфт ищем на торрентах
- Стандарт ISO/IEC 9899:2011 (он же C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- man/dash/zealdocs
Чем конпелировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio 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
>2016
>C
/thread
а то слишком СЛОЖНА.
Тем более я только начал учить, не бейте.
> как комить на gcc?
Кодить? Компилировать? Если второе, то cc file.c (или даже make file). А если первое, то книжки у нас в шапке.
K&R есть на русском (ищи третье издание перевода), Прата тоже. Обе книги гуглятся.
Нашел & Схоронил. Спасибо.
Есть один цикл
while ( read(client_socket, &c, 1) > 0)
Теперь тело. Варианты:
putchar(c) - всё окей, результат устраивает.
putchar(c)
printf("%d ", c)
После каждого символа он ещё и код поясняет.
А теперь внимание:
printf("%d ", c) выдает совсем другой результат. По крайней мере, коды последних символов не совпадают с вариантом, в котором есть putchar(c). Что за говно? С сокета гарантировано постуают одинаковые символы.
лошара
Не, вполне себе стандарт.
Если не достигаешь полного понимания, попробуй посмотреть отладчиком или порисовать ячейки памяти на бумаге.
Не, мне не очень зашло именно это видео, хотя все что я услышал на этих лекциях про указатели я понял сразу же. У меня теперь другая проблема, хорошо запомнить это., усвоить, и свободно использовать, и я не могу придумать как этого достичь. Читаю сейчас рекомендованную литературу для этого курса, хоть и просрочил все их "сроки" на джве недели уже.
>>839217
Спасибо, именно так всегда и делаю. Когда не ищу отговорочки.
Там в задании на сервер (6 сет) наебешься с указателями на указатели
Да, но у шланга местами лучше диагностические сообщения.
Поясни пожалуйста про регистры и RAM model.
К примеру, у меня есть регистры размера w и слова размера w.
Насколько я понял, то чтобы добавить 2 числа мне нужно:
1. Из памяти по указателю достать первое значение
2. Записать его в регистр
3. Из памяти по указателю достать второе значение
4. Совершить арифметическую операцию
5. Выгрузить результат из регистров в память
Что будет если у меня будет регистры размера w и слова такие, что l > w ?
Смогу ли я их записать в регистры?
Насколько я понял, то могу передавать на указатель на начало ячейки и размер самого слова.
> Насколько я понял, то могу передавать на указатель на начало ячейки и размер самого слова.
Не совсем понятно, о чем ты спрашиваешь. Ты не можешь записать слова размером l в регистры - получатся только остатки от деления, если у тебя little endian или частные, если у тебя big endian.
> Насколько я понял, то могу передавать на указатель на начало ячейки и размер самого слова.
Кому передавать?
Если числа не влезают в регистры, ты складываешь по кускам, используя аппаратный флаг переполнения (если у процессора он есть) или вручную (если сумма меньше одного из слагаемых, добавляешь в следующий раз 1 к слагаемым).
Антуаны-железячники и мимопроходящие, подскажите, может быть кто-то знает, как решить мою проблему. Есть один CRC32, реализованный в железе. Соответственно, доступа к алгоритму нет. Есть файл и хеш к нему. Как узнать алгоритм, чтобы рассчитать контрольную сумму для других файлов? Перебором полинома? Может быть, какие-то методики есть?
Брутфорс - крайне медленное, но, похоже, единственное решение.
Ну а ты как хотел? Другого способа найти конец нет сроки нет, ты же не передаешь длину.
еще раз. есть подсторка, ее длину я знаю, как ее распечатать то? с чотом того, что внутри нее можеть буть нуляка
fwrite(string, sizeof(char), length, stdout)
чето я не думал, что все так с принтф хуево
где тут волшебство? нахуй на ноль проверять если длину строки я ее в ебало тычу?
Почему бы и нет?
>>840170
>>840183
>>840203
По определению, строка — это последовательность символов, оканчивающаяся нулём.
Или ты из тех, кто лезет кодить даже не выучив определений?
>По определению, строка — это последовательность символов, оканчивающаяся нулём.
нет, ты пытаешься умничать про лексические строки
и да, как насчет 'превед'?
да конечно
я ссу в ротешник твоему стандарту. лексическая строка это строка доступная на этапе конпиляции и вычисляемая по sizeof.
А вот если бы ты не читал кривые переводы, то знал бы общепринятый термин string literal. Алсо, string literal - не строка, а последовательность символов. И если ты не хочешь следовать формату строк, который ожидает printf, можешь тупо вывести свою последовательность символов через fwrite, который как раз и предназначен для вывода последовательностей элементов.
Вот код: http://pastebin.com/04TWJ0Vg
flush buffer
добавь ещё один scanf("%c", &answer); в конец цикла (после 26ой строки)
или при работе с программой жми Ctrl+D (или что там в винде нужно жать, чтобы дать знать, что ты закончил input) вместо Enter, а то получается, что ты ещё вводишь знак переноса строки и он также считывается scanf'ом
https://ideone.com/FH1jwK
Давай разберем:
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) Подумай, что ты передашь, если захочешь элемент в начало (сделать его первым). Алсо подумай, как в таком случае ты уведомишь вызывающего о том, что его начало списка - уже не начало списка (можешь либо всегда возвращать указатель на правильное начало списка, либо принимать указатель на указатель на начало и модифицировать его по необходимости).
Грандмерси! Все тепреь работает, вот я олух
Пасиба большое :3
Дебил, стандартные, значит описанные в литературе, значит те о которых ты прочитаешь на вики.
У меня есть функция
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);
Как фиксить? не бейте только
Такс, все равно все спят или всем похуй, но я всё таки нашел решение. Если возвращать не array, а создать новый массив в функции, например ar, и сделать
ar=array;
return ar;
то всё будет работать. Стоит ли в это вникать новичку, или забить?
Понял, спасибо. Пошел изучать malloc()
Pelles C хватит с головой.
1) В строке 6 scanf хочет указатель на int, а не int.
2) В строке 8 printf хочет первым аргументом форматную строку (%d), а не int.
Почитай как правильно работает scanf и printf.
man scanf
всё это заставляет меня пить, пить много. хотя не это, а воля. попёр ка я до ночного незаконного
Ну есть sizeof на худой конец и всякие UINT_MAX. Нормальным людям этого достаточно, а ненормальные могут посмотреть в сторону _Generic.
Это вам в кресты, батенька. Алсо, вот сколько пишу, никогда из-за этого проблем не было. Из-за == были, на единичку ошибался, маски неправильно писал, промоушены эти блядские опять же. Но вот чтобы структуры перепутать - это надо суметь!
всё это для бедных, и не как не поможет от ошибки. поможет, только от ошибки во второй части выражения.
идиот. ну в общем-то чтец жопой и не должен быть умным.
Я тебе сейчас очередной секрет открою: когда компилируешь с высоким уровнем оптимизации (в современных компиляторах не обязательно) от этой директивы не зависит вот совсем нихуя.
Погугли про weak функции в си, насколько я помню инлайн так же для этого используется.
разбазариватель секретов, плеаз. статик функция ограничивает область видимости функции в файле, а вот инлайн да.
Однако, даже когда просто вывожу символы, выходит лютая хуита.
Что почитать, чтобы разобраться?
В гугле ничего толкового не нашёл.
Узнай, что такое "кодировка".
Есть всякие __forceinline компиляторозависимые.
fopen(..., 'rb')/fseek по вкусу/fwrite/fclose или CreateFile(..., OPEN_EXISTING, ...)/SetFilePointer по вкусу/WriteFile/CloseHandle.
>CreateFile(..., OPEN_EXISTING, ...)/SetFilePointer по вкусу/WriteFile/CloseHandle
Что-то не работает. https://ideone.com/mXM6HC
Солидарен с предыдущем ананасом.
Прога должна выделять заголовки функций в тексте программы
Пикрил - результат работы
Подкинете тестовых примеров? Какие подводные камни? Что не учтено?
Так, я вас понял и благодарю..
Невалидного объявления не может же быть в правильно написанной программе?
Заголовок может находиться в одной строке с объявлением глобальных переменных, да?(
Алсо, может подскажешь, можно ли эту всю задачу делать без регулярных выражений, но и не каким-то тупым посимвольным перебором?
>Невалидного объявления не может же быть в правильно написанной программе?
Это да. Но ведь твоя программа только исходник получает на вход и не может знать, правильная программа или нет. Или я что-то не так понимаю?
>Заголовок может находиться в одной строке с объявлением глобальных переменных, да?
Компилятору все равно. Главное, чтобы это было разделено точкой с запятой.
>без регулярных выражений
Синтаксический анализ. Если не хочешь заморачиваться вручную, то найди описание синтаксиса сишки в формате БНФ, возьми оттуда правила, которые описывают объявление функций (со всеми зависимостями, разумеется) и задействуй ебическую силу flex+yacc.
> можно ли эту всю задачу делать без регулярных выражений, но и не каким-то тупым посимвольным перебором?
Выделяешь формальные грамматику, атомарные и не очень структуры и описываешь все через ооп.
>ебёшься такой с генераторами парсеров и лексеров
>целуешь писос когда они генерируют этот самый посимвольный перебор с милиардами goto
А вообще, есть куча более современных и функциональных генераторов, чем это говно зверя с логотипа ГНУ.
Ну какбе выхлоп генератора тебя волновать не должен, вне зависимости от его вида. В этом же весь его смысл. Другое дело, если имеется требование наговногодить парсер вручную. В таком случае надо получше смазать анус и попытаться сесть им на дерево грамматического разбора, попутно теребя лексемы и надрачивая на алгоритм сортировочной станции.
> Другое дело, если имеется требование наговногодить парсер вручную.
Все парсеры сколько-нибудь не-хипсторских языков "наговнокожены" вручную.
Насколько я понял, у анона была задача написать детектор объявлений функций, а не полноценный язык. Поэтому я и говорю, что в данном случае проще воспользоваться генератором, если не стоит жесткого условия ручной реализации.
>>844014
>>844050
>>844073
Спасибо каждому анону за сочувствие , но я почти ничего не понял
Условия задачи: тестовая программа написана правильно, а сама задача - лаба (2 курс), стандартные библиотеку подключать можно
Чет орнул.
Задача гораздо сложнее, чем ты думаешь. http://pastebin.com/Gf25Psct - абсолютно валидный синтаксис, хоть и бессмысленный. Для лабы норм и то, что у тебя.
Бывают не-легковесные?
http://pastebin.com/wyYEPvQZ
вывод:
1->one
2->one
хочу:
1->one
2->two
Ты передаешь по значению указатель на массив символов. Внутри функции ты присваиваешь указателю адрес другого массива символов. После выхода из функции этот указатель перестает существовать. Чего же ты ожидал? Тебе нужно две звездочки, а не одна.
>Тебе нужно две звездочки, а не одна.
а вот нихуя, утаквот тоже работает http://pastebin.com/RaYwCp6v
з.ы. тока конпилятор ругаецо сильно
Работает лишь по недоразумению. По счастливому совпадению указатели на две строки отличаются только младшим байтом: 0xaaaaaa10 и 0xaaaaaa14, например. И внутри функции ты пишешь единственный char, и этим char ты правишь младший байт указателя с 0x10 на 0x14, например. Но если конфигурация (количество строк в программе, компилятор, опции компиляции) изменится, магия может не случиться, и на выходе будет мусор. Не делай так больше никогда.
Начинать изучать язык с чтения стандарта не стоит. Возьми Прату сначала хотя бы. Если язык знаешь, и хочешь почитать именно стандарт, читай C11.
char *str;
scanf("%s", str);
printf("%s placed on %p and contains %i\n",str, &str, sizeof(str));
Как бы я не пытался, sizeof выдает 4 (очевидно, размер указателя).
Как получить всё-таки размер строки?
strlen
Заодно подумай, а куда у тебя scanf строку-то пишет? Вот str - указатель, а НА ЧТО он указывает?
Первый элемент массива, который заканчивается на '\0'?
Я же правильно понимаю, что ОС просто выделяет адрес памяти, начиная с которого я могу что угодно сохранить, но не задену ли я что-то другое в памяти, если введу слишком большую строку?
> Первый элемент массива, который заканчивается на '\0'?
Ну да, только если ты этот массив в str присвоил. Ты присвоил?
> Я же правильно понимаю, что ОС просто выделяет адрес памяти, начиная с которого я могу что угодно сохранить
Неправильно. По счастливой случайности str указывает на какую-то область данных, в которую у scanf получается насрать без видимых последствий. В следующий раз может повезти меньше. Алсо, ОС тебе ничего не выделит, пока ты не попросишь. Тебе нужно char str[скольконадо] или str = malloc(скоканадо) или char buffer[скольконадо]; str = buffer.
> не задену ли я что-то другое в памяти, если введу слишком большую строку
Заденешь. Поэтому стоит указать максимальный размер строки, которую scanf скопирует по твоему указателю (%32s, например).
https://ideone.com/IlQ4GL
Нашел, неверно вычисляю индекс для буквы из k
Спасибо, даже не ожидал от двачей таких ответов, лол.
curses
Установил, не могу найти Си, только шарп и плюсы
Что делать?
В гугле не могу найти
Создавай пустой проект C++, создавай файл, сохраняй с расширением .c. Компилятор там один и тот же, язык определяет по расширению (ну или в свойствах можно насильно указать).
Я и так создал сначала С++, написал свою программку на Си и мне выдало тип
int не поддерживается
Думаешь, если сохранить и запустить, поможет?
Да забей, я даун
Нажал консольное приложение С++, а не пустой проект
Вот пустой проект, сори за тупой вопрос, но куда тут писать? Ахахахаахах
да это вряд ли можно кодом назвать
int a, b, c;
a = 14; b = 15; c = 14;
if (a==b) printf(3); exit;
if (a==c) printf(2); exit;
printf(1); exit;
это просто вообще первое, что я написал, ахххахахх
а через 7 часов уже сдавать
>printf(1)
Вот это не будет работать. Откуда ты знаешь про эту функцию, ты видел как она используется?
Ох, как все тяжко. Нагугли хелловорлд что ли, вставляй код в функцию main(), а не просто в файл.
> exit
Для вызова функций надо () обязательно указать. А у exit() еще и аргумент есть - код возврата. 0, например.
> if ... printf(3); exit;
if действует только на первое после скобочек выражение. Если хочешь условно выполнить несколько выражений, заключи их в {}: if (a==b) { printf(...); exit(...); }
> printf(3)
Принтф не печатает числа, он их форматирует, и ему нужно указать, как именно. Например, printf("%d\n", 3), чтобы отформатировать 3 как целое число (со знаком, если есть), а \n добавляет переход на новую строку.
И написать простейший скрипт, который конвертит координаты из того формата, в котором они у тебя сейчас, в сишный код. А то заебешься вручную.
Нет, ну я типо знаю что в паскале вывод это println, тут printf
Поэтому и написал
В общем, вся суть:
Даны три числа, одно из которых отлично от двух других, равных между собой. Определить порядковый номер числа отличных от остальных.
Нам просто нихуя не показали в универе, даж за компы не пускали ещё, хахх
>>846355
Хелловоорлд запускал кстати, сразу как установил. Все работало в консоли.
Обосрался с закрывающей кавычкой
iostream - это кресты. Тебе нужно #include <stdio.h>. Алсо, одинарные кавычки - для символов. Для строк - двойные. А у тебя еще и открывается одинарной, а закрывается двойной. Так даже в этих ваших паскалях нельзя.
А ну лан
(Устранил все ошибки которые мог)
Напиши #define _CRT_SECURE_NO_WARNINGS в самой первой строке файла (перед #include). Алсо, оно обычно предупреждение, а не ошибка, как ты это сделал?
Да забей ты, сходи в армейку
>как ты это сделал?
Что именно?
>Алсо, оно обычно предупреждение, а не ошибка
Если ты про это, то я хз
Спасибо, помогло
Теперь 0 ошибок, вроде все должно работать
Написал - не помогло
#include <locale.h> в начало файла
setlocale(LC_CTYPE, "Russian"); в начало main(). Или латиницей пиши. И переконпелировать не забудь.
А как сделать, что бы консоль не сразу закрывалась?
Она выдает ответ на секунду после ввода чисел и закрывается
Вот я, например, студентота, 2 курс.
Узнал от старшекуров, что С на кафедре очень востребован, и есть смысл его учить к дополнению к преподающимся предметам, чтобы участвовать во всяких кафедральных движухах, преподских проектах и прочем ботанстве
И, собственно, вопрос: насколько чистый С востребован сейчас, и сложно ли потом перекатиться на плюсы(который сейчас, думаю, всяко популярней)?
>
>Узнал от старшекуров, что С на кафедре очень востребован, и есть смысл его учить к дополнению к преподающимся предметам, чтобы участвовать во всяких кафедральных движухах, преподских проектах и прочем ботанстве
Ты уверен что тебе по пути с этими чуханами?
>И, собственно, вопрос: насколько чистый С востребован сейчас,
Самые крупные проекты написаны на нём, каждый кодер обязан его хотя бы уметь читать.
> и сложно ли потом перекатиться на плюсы(который сейчас, думаю, всяко популярней)?
Легко перекатываться
>насколько чистый С востребован сейчас
Скорее всего будет востребован всегда, покуда архитектура кампуктеров не будет меняться. Язык простой. Можно за месяц выучить целиком и полностью. В отличии от крестов писать на нем приятно. Хоть и гемморно местами.
Пишу на Си больше десяти лет, и до сих пор его не знаю. За короткий срок можно научиться только писать наполненный UB и зависимый от платформы код, который сломается в следующей версии компилятора. Ну и тривиальные хелловорлды, состоящие из библиотечных функций, в которых налажать просто негде.
+1
same shit
от себя добавлю: положим, я вот в собственном кодинге не юзаю вещественные типы (не та прикладная облвсть в общем), дак вот скажу честно - что и не знаю всех подводных камней с плавающей точкой
или вот, в принципе, на нелокальных переходах можно сэмулировать исключения (в потрохах постри, например, так сделано), но я не делал так, так чтож не могу сказать что я знаю это
то есть сишка хоть и выглядить маленьким языком (строк нет, встроенных средств работы с массивами нет, управления динамической памяти нет и прочее и прочее), но в ней хватает тех областей, которые ты не будешь знать, тк это не будет покрывать круг твоих практических испльзований
Sleep(10000);
Работаю разрабом электронных девайсов, кодю на сях контроллеры и под венду в среде лабвиндовс, для моих потребностей хватает с лихвой. Мой коллега тоже сишник, недавно вкатился в плюсы без проблем.
>кодю на сях контроллеры
Аноны, посоветуйте книгу по архитектуре и программированию ARM с акцентом на практику.
Динамически менять стиль в зависимости от либы? Да ты охуел. Будь последователен: или пиши всю программу, как майкрософт заповедал, или используй свой стиль везде. Я вот, например, camelсase предпочитаю даже в сишечке (fooBar для переменных и функций, FooBar для типов), брат жив, на хейтеров похуй.
>Будь последователен: или пиши всю программу, как майкрософт заповедал
Тогда не получится определять функции с именами типа ReadFile. Использование read_file стиля здесь бы выручило.
Иметь ReadFile и read_file в одной программе? Да ну его нахуй. Если это какой-то конкретный тип файлов, я бы отразил это в имени - ReadConfigurationFile, например, а если это просто обертка, то это тоже стоит как-то показать. Ты же почему-то ее пишешь вместо вызова ReadFile, вот и называй соответственно.
Вообще не читал книжек, всë по примерам и руководствам различным. На сайтах производителей контроллеров обычно тысячи примеров, как правило привязанных к периферии. Компилишь пример, проверяешь работоспособность на железе, а дальше уже смотришь что из него взять в свой проект, что доработать.
Условие: в тексте правильно написанной программы на С выделить заголовки функций.
Пикрил - результат работы. Очевидно, что 4-ая непустая строка не обрабатывается (а очень бы хотелось)
Прога: http://pastebin.com/nEdEyQC7
Возможно, более важную роль должны играть круглые скобки, но я просто вот ни..чего не могу заделать :(
Мб кто поможет
Можно разбивать строку на части от ; до ; и проверять эти части.. Но так у меня получается правильно только для 4-й строки пикрила, а всё прочее через кое-что подгорающее
Какой курс-то? Препод тебя затроллил скорее всего. В таком виде это нереализуемо (алсо, >>844171). Да даже просто для такого вот:
int foo
= 1;
и
int foo
(void);
тебе придется заглядывать вперед, и ты никак подсветку на лету не сделаешь.
>Я вот, например, camelсase предпочитаю даже в сишечке (fooBar для переменных и функций, FooBar для типов), брат жив, на хейтеров похуй.
Бро, я ещё и отступы по Оллману делаю, все смеются и показывают пальцем.
Курс 2, Си 2-й семестр идёт.
Я был бы рад, будь это троллинг, но на то не похоже. Как мне кажется, ему надо, чтобы были рассмотрены случаи, что у меня на пике, но как бы не то чтобы у меня и они все получились
Ну попробуй немного другой алгоритм (он тоже кривой, но словит чуть больше функций). Тебе надо прочитать весь файл, удалить (или скипать по ходу дела, что сложнее) все комментарии и директивы препроцессора. Дальше идешь по тексту в поисках открывающих top-level { и ; top-level - значит, что ты увеличиваешь счетчик фигурных скобок всякий раз, когда найдешь открывающую, и уменьшаешь, когда найдешь закрывающую, и тебя интересуют { и ; только когда этот счетчик равен 0. Варианты развития событий:
1) Ты встретил по пути =, это инициализированная глобальная переменная, ищешь точку с запятой. Если этот вариант не проверять, сломаешься на int foo = (1); .
2) Ты встретил { - это либо struct/union/typedef/массив/итд, либо это начало функции, узнаешь это по наличию ) прямо перед {. Пробелы и переводы строк, разумеется, игнорируешь. Затем ищешь закрывающую } этой функции.
3) И, наконец, ты встретил ; - это какая-то декларация, проверяешь по наличию ) перед ; . Вот как-то так.
Как это сломать: атрибуты гцц, old-style (K&R) functions, static_assert, на программах с синтаксическими ошибками тоже сломается, но в целом, наверное, должно работать. Хотя хуй знает, я не пробовал.
Естественно, выводить очередной блок текста ты начинаешь, когда встретил ; у декларации (1, 3) или } у функции (2).
Алсо, вариации вот такого void foo(char a[1+(sizeof((int){1})==2)]); сломают и условие про =, и условие про ){, а код, между тем, вполне валидный.
>И, собственно, вопрос: насколько чистый С востребован сейчас
Платиновый вопрос. Пока будут существовать UNIX-like системы, этот язык будет востребован. Но работу на нём (особенно в рашке) ты в лучшем случае найдёшь только для эмбедеда.
int foo = {1};
но только без имени. Для int оно нахуй не нужно, но, например, у тебя есть функция, принимающая указатель на вектор, и ты можешь не создавать лишнюю переменую явно, а сделать:
result = some_function(&(Vector) { 1.0f, 0.0f, 0.0f });
Это C99, если что.
массив, который приводится к int, видимо
Из худо-бедно кроссплатформенных гуев есть только GTK. Но я бы порекомендовал сделать либу, а морду нарисовать на крестах с Qt.
Ну в крайнем случае, ты можешь нарисовать интерфейс на Windows API, а чтобы не ебаться с созданием окошечек вручную и прочиими циклами обработки сообщений, используй dialog manager (загугли DialogBoxParam), тогда диалоги сможешь рисовать в любом редакторе ресурсов.
Я знаю, C++ для этого куда больше подходит, но я бы всё же хотел именно на сишечке.
Что такое GTK? Как его установить? Сам я пытался, но ничего не вышло.
Первый свой гуй под винду писал в среде лабвиндовс. Правда это весьма специфичная среда, для разработки виртуальных приборов.
>Сам я пытался, но ничего не вышло.
тебе здесь не место. пиздуй к плюсанам и юзай божественеый кьют для гуя
>>847303
Визуальный конструктор со своей библиотекой контролов типа показометров, индикаторов, тумблеров, кнопок. Есть также текстовые элементы, таблицы, графики, обработка данных, сеть, многопоточность, еще куча всего. Можно и для прикладных задач использовать, почему бы и нет. Винапи поддерживается, но для своих задач я только Sleep использовал из винапи, больше не потребовалось. Куча примеров есть в дистре и на сайте.
В Windows 10 теперь есть apt-get. В младших версиях Windows есть MSYS2 и pacman.
>xor ebx, ebx // clear ebx
>mov ebx, fs:[ 0x30 ]
Для чего здесь сначала обнулили регистр, а потом записали в него адрес PEB? Зачем тратить байты на обнуление, когда и так адрес займет весь регистр?
> Для чего здесь сначала обнулили регистр
Ни для чего. Скорее всего, код написан вручную, и человек НИРАЗБИРАЕТСЯ.
также на крестах можно писать winrt приложения, gui включительно, доступные с windows 8
также на крестах можно писать UWP приложения, доступные с windows 10
Что почитать о деклараторе __declspec(naked) и для чего он используется? Я его заюзал просто потому, что нужна была функциональная обертка для моего ассемблера. Но возникла проблема при компиляции FindGetProcAddr: error #2202: 'auto' not allowed in function with __declspec(naked)
Почему так? Как использовать результат вызова GetKernel32 внутри другой naked-функции?
Ты сказал, что тебе не нужно создавать стековый фрейм. Естественно, что теперь компилятор не может выделить KERNELBASE на стеке. Можешь сам выделить, можешь KERNELBASE в регистре хранить. Можешь выкинуть нахуй naked.
https://ideone.com/IFtNF8
> Что за залупа здесь происходит?
Нет такого синтаксиса в си. Видимо, кто-то попытался объявить указатель на функцию, но не смог.
Пиратка онли, на руборде есть активатор.
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) ?
И ведь блять логично.
Тыкаешь последовательно: 4 8 0 / 1 0 2 4 | 0
Разница минимальна. Читай плюсовые, а если что-то не сможешь переделать на Си - показывай, мы поможем.
Почему-то ничего не компилируется. Выдаются ебанутые ошибки:
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
Что я делаю не так?
Может быть, ты лучше у него спросишь? Или он уже и на кывте не появляется?
У него и спроси, если он там еще в лепешку не разбился со своими парашютными делами
Честно говоря, мне представляется только одна ситуация, когда использование первого варианта обосновано. Это когда любое возвращаемое функцией значение может быть интерпретировано как корректное. Но даже в этом случае я не стал бы для кода ошибки заводить отдельный ссылочный параметр, т.к. если функций, потенциально завершающихся с ошибкой, будет много, то это что, каждой такой параметр заводить? И тогда в каждой обособленной части программы должна быть своя переменная для хранения кода ошибки? Или что, делать несколько способов обработки ошибок в одной програме? Ну это 100% отсос и лишняя путаница.
Так что советую второй вариант.
Либо же возвращать значние, а в случае ошибки возвращать некорректное значение.
Например, если программа возвращает указатель, то в случае ошибки возвращай NULL.
Если функция при нормальном завершении возвращает положительные числа, то в случае ошибки пускай возвращает отрицательные.
Если по возвращаемому значению нельзя сказать, произошла ошибка или нет, то код/флаг ошибки можно устанавливать в глобальной переменной или определеить целую глобальную структуру, хранящую состояние программы/модуля и несколько полей внутри нее для хранения кодов ошибок от разных источников. Доступ к полям такой структуры, разумеется, лучше обеспечить через процедуры.
>каждой такой параметр заводить?
да. но не каждая функция будет его использовать. зато все 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);
> зато все API будет выглядеть охуено
Это охуенное API? Я должен в каждую функцию передавать указатель под код ошибки, даже когда мне на него насрать? Притом, мне вообще в большинстве случаев нужно знать, произошла ли ошибка, а какая конкретно - интересно только при взаимодействии с ОС. Если тебе так хочется выдавать вменяемую информацию об ошибках - сделай явный или неявный (per-thread) контекст. В остальных случаях return false/return NULL/return -error/return SIZE_MAX будет вполне достаточно.
Именно extern "C" в си нету, это плюсовая хуитка, для обратной совместимости. Просто extern – это о линковке и у него дохуя предназначений, открой гугл.
> у него дохуя предназначений
У extern в Си одно предназначение - явно указать, что декларация относится к публичному (внешнему) символу.
Одно предназначение не всегда означает применения для одной цели.
> передавать указатель под код ошибки, даже когда мне на него насрать
можешь пихать 0, если он не используется. хотя мне такой подход тоже уже разанравился. ща еще пару десятков функций накидаю и буду посмотреть, может действитьльно хуйня выйдет.
и да контекст есть, но он не везде используется, такая же хуйня как с еррорами, только в профиль.
а вот если везде пихать контекст, в нем ставить ошибку и все функции возвращают как бул? хм...
> контекст есть, но он не везде используется
> если везде пихать контекст
Зачем везде что-то пихать. Я ведь писал уже: сделай его глобально доступным через процедуры (см. пикрел, например).
У такого подхода есть недостаток - у тебя может быть только один инстанс (или, если контекст thread_local - один инстанс на поток). Для твоего примера это вполне нормально, но представь, что у тебя не приложение, а либа, которая как-то обрабатывает данные и выделяет память по необходимости. Чаще всего, у тебя будет какой-то стейт, и вот тут-то логично хранить в нем и код ошибки тоже. Стейт придется пихать в каждую функцию или делать его текущим, как контексты в OpenGL/OpenAL.
Алсо, никогда не начинай идентификаторы с подчеркиваний. И других не приучай к плохому.
Ну ясное дело, что тут универсального решения нет. Надо учитывать многие вещи. Для этого и нужна стадия проектирования.
>никогда не начинай идентификаторы с подчеркиваний
А где у меня там такое?
> А где у меня там такое?
__APPCONTEXT_H__ же. Да, вероятность проблем в данном случае околонулевая, но лучше раз и навсегда отучиться. И с одного подчеркивания тоже нельзя, если, конечно, ты не пилишь свой компилятор.
Нахуй ты в итмо пошёл, если сам кодить не можешь?
Объявляют. И это еще раз иллюстрирует, как в мире линуксов все срать хотели на стандарты.
>как контексты в OpenGL/OpenAL.
поясни по быстрому, чем их подход отличается от других подходов?
? с подчеркиваний начинаются еще приватные функции, ничего в этом нет плохого.
Там есть глобальный скрытый активный контекст, ты можешь в него писать и читать соответствующими функциями (glClearColor, например), только в него, и только через API, но не напрямую. Ты можешь создать сколько угодно других контектстов и делать их активными по необходимости. Так как основной юзкейс таких библиотек - один контекст, это позволяет упростить код, избавившись от передачи контекста в каждую функцию, но и не проебать возможность иметь несколько контекстов (неосновной юзкейс), пусть и ценой некоторого неудобства.
>>849618
А вот стандарт сишечки говорит, что с __имена и _Имена зарезервированы языком. Приватные переменные и функции с одного подчеркивания начинать можно, если они static (не торчат наружу).
>А вот стандарт сишечки говорит, что с __имена и _Имена зарезервированы языком. Приватные переменные и функции с одного подчеркивания начинать можно, если они static (не торчат наружу).
вся это хуйня от приплюснутых блядей, всервано их конпилятор символ '_' приставляет.
Нет, эта хуйня, чтобы в новом стандарте могли беспрепятственно запилить _Static_assert, а твой код из-за этого не сломался. И, что важнее, чтобы не сломался код тысяч пользователей твоей либы. И чтобы разработчики компилятора могли без помех для тебя объявлять в хедерах стандартной библиотеки всякие _printf_locked и прочие детали реализации.
>_Static_assert, _printf_locked
я вод даже не знаю что это такое, а тем более подстраиваться под эту хуету нет никакого желания.
> в мире линуксов все срать хотели на стандарты
Боюсь, что в данном случае на стандарт насрать абсолютно всем.
На пике хедеры из состава MS Developer Studio, Solaris, OpenBSD и IRIX. Таким образом объявлять хедеры учит даже Таненбаум в своей книжке по разработке ОС.
Хотя с другой стороны, я тоже не понимаю, почему бы не объявлять хедеры просто заглавными буквами.
У нас тут был околофилософский срач о том, как правильно, а не кто мешает.
Никто, разумеется. Просто как-то неуютно становится, когда отходишь от общепринятой практики. Все таки, не язык для стандарта, а стандарт для языка.
> Все таки, не язык для стандарта, а стандарт для языка.
твоему стандарту пять лет в обед и его еще будут переписывать и переписывать если не забьют, а соглашения пошли когда и с99 небыло.
> там какая то тарабарщина
Вот чтобы это не было для тебя тарабарщиной, чтобы ты понимал, а не выучивал шаблонные действия, тебе и дают странные задачки. Хотя стоило бы потратить время на подбор реальной задачи, но нашим преподам обычно лень.
Программисты ебуться с реальными задачами, а с не битоебством без задач.
Учи все до чего дотянешься не ной, во-первых мозги развивает, во-вторых однажды таки понадобится и будешь хоть иметь предствавление что есть такая штука.
Вот смотрите, нужно написать функцию которая сравнивает два числа и возвращает 0 или 1.
То есть вместо простого if (a > b)
нужно как-то так:
return !!(((( ~(x ^ y) ) & (y + ~x + 1) ) | ( y & ( x ^ y ) ) ) >> 31 );
Сириусли? Реальный синьор программер сможет такое написать? Оно нужно ему? Как это развивает? Не ною просто спрашиваю. Анон ты бы устроился на работу, где бы тебя заставили искать баг в таком коде?
нытик ебаный, на тебе риал пример, есть сорта вафель 1-325, и есть группы к которым эти вафли относятся, например малиновые: 1, 7, 9, 20, 55, 85, 90, 253...321. на вход поступает вафля и нужно в риалтайме определить входит ли она в группу. вот здесь и начинается битоебство с масками и сдвигом, чтобы было быстро и понятно, а ифы и свитчи в этом случае для таких вот плачущих пидоров как ты.
Надуманный пример. Как думаешь, во сколько инструкций развернется битоебля и что будет быстрее - битоебля или один лукап в таблице?
В общем-то, большинство обоснованных случаев битоебли перечислено здесь: https://graphics.stanford.edu/~seander/bithacks.html А задачки, как раз, чтобы понимать, а не гуглить и копировать.
>битоебля или один лукап в таблице?
а вот здесь ты ошибаешься, битоебство дает пасасать свитчу, я тут даже примеры выкладывал, но всем как всегда.
и к свичу у меня какоето оивращение, наверное перл сказывается.
Покаже пример такого ирл кода. Ты просто пиздишь мне. Зачем? Даже в ассемблере есть условные операторы.
ищи в архиваче
Что такое "малиновые" - это сорт или группа? Ничего не понятно из условия, что это за цифры.
Ананасы, посоветуйте какие-нибудь анализаторы использования динамической памяти, чтобы получить более-менее интуитивно понятные результаты в виде текста и, может быть, графики.таблицы. Я, конечно, могу LD_PRELOADнуть какой-то свой хук для malloc и сыпать дебажной инфой, но может быть есть какие-то элегантные решения?
valgrind? http://valgrind.org/docs/manual/ms-manual.html
>>850454
Если тебе нужен софт Wireshark, то тебе в /s/. Если ты сам написать хочешь - гугли pcap для начала.
Ах да,
>А если зашифрована информация, как с не работать?
Если что-нибудь вроде AES-128 и выше - никак не работать, только соснуть хуйца.
Если у тебя ключ есть, можешь плагин написать, чтобы парсило. Если нет - отлаживай софт и вытаскивай из него ключ, но если у софта ассиметричное шифрование, и его писали не дебилы, то это тебе ничего не даст.
Реверси прогу, извлекай пакеты из памяти до их шифрования
Например, если второй аргумент макроса не ноль, вызвать выполнить подстановку одной функции, иначе другой:
#define fun1(a, b)
b > 1 ? calla(a) : callb(a)
Почему бы и нет? Или выражение можно посчитать на этапе компиляции, то компилятор с любой минимальной оптимизацией ненужную ветку выкинет. Только не забывай скобочки расставлять, а то 2 * func(1, 2) может посчитаться не так, как ты предполагаешь.
если выражение можно посчитать
не, мне нужно чтобы макрос разворачивался на этапе препроцессинга в зависимости от условия
типа условный макрос
Опиши, как ты это использовать собрался. Если у тебя константное выражение, то #if expr никто не отменял.
смотри, есть функция для получения значения из хеша:
hash_get(hash, key, len)
третий параметр длина строки. в коде, мне нужно иметь доступ как по литеральным строкам, так и по динамическим:
hash_get(hash, "name", sizeof("name"))
hash_get(hash, str, l)
так вот, хочу макрос где если третий параметр равен нулю, то длина будет вычисляться как sizeof(key) иначе использовать переданное значение.
На _Generic из C11 посмотри. Или сделай:
#define myhash_(a, b, c, ...) myhash(a, b, c)
#define myhash(a, ...) hash_(a, __VA_ARGS__, sizeof(c)-1,)
myhash(hash, "name");
myhash(hash, ptr, strlen(ptr));
Но этот подход не детектит ошибки типа:
myhash(hash, ptr); // Развернется в myhash(hash, ptr, sizeof(ptr) - 1).
> как то через жопу
Лол, ты просто не видел, наверное, как препроцессор по-настоящему ебут. Я вот могу тебе сделать то, что ты просил (>>851769 с проверкой на литеральный 0), и вот уж это точно будет через жопу.
http://pastebin.com/QR3Q7XXm
http://pastebin.com/qUwxGFmh
Из-за HHOOK h = 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. В чем тут проблема?
#include <windows.h>
есть
[code]
int revolution = 20;
float Tdr = 1.12345;
float tm = int * Tdr;
printf("T\t%f", tm);
[/code]
Получаю хуйню округленную до сотых! Какого хуя? Собственно вопросы
1. Если умножаю int на float, результать какого типа получаю в итоге?
2. Почему такое дикое округление?
3. Физический смысл, умножаю натуральное число на вещественное, хочу получить вещественное число, как это сделать на си?
4. Где эти моменты описаны в стандарте?
> Получаю хуйню округленную до сотых!
Где? http://ideone.com/L2KZNL
1. Указывай нужную точность. Например, %.8f.
3. Просто умножить эти два числа, компилятор сам сконвертирует натуральное до вещественного.
4. С11 (в шапке), 6.3.1.8, Usual arithmetic conversions; 7.21.6.1, The fprintf function.
>как препроцессор по-настоящему ебут.
нет не видел, это наверное мамкины хипстеры, нормальные люди делают без выебонов
>Я вот могу тебе сделать то,
сделай
Открой исходники любого сишного проекта (например исходники питона, за них ручаюсь), папкин нехипстер. Будешь очень удивлён насколько они вымазаны макросами с ног до головы и как ими долбятся во все щели.
>питона
так это изначально пидерская параша, еще бы опенэсэсл посоветовал. открой исходники майскюэл и посмотри как нужно писать.
К сожалению, Си -это тебе не кресты.
Неймспейсов и енумов там нет. И дохуя чего нет, и шаблонов - не завезли.
Поэтому - макросы там рулят.
Ненавижу эту хуету.
Как вы эту херню терпите только..
Хорошо все в меру.
Это хороший компромис между строгой статической типизацией и обобщенным программированием.
Не пистон, конечно, но в разы быстрее, зато.
И в грамотных руках не так уж и сильно увеличивает время компиляции...
Нет, это шаг к динамической типизации.
К ООП оно отношения не имеет.
Шаблоны функций были бы полезны и в чистых Си, тем более с ограничением на их перегрузку,которая однако - синтаксический сахар, опять таки.
Ты свыше тысячи строчек не писал, поди.
Хотя, да, можно всё делать на мейках, но проебать что-то гораздо проще.
СиМейк более нагладен.
Вот что действительно говно - это сконс всякий.
>К ООП оно отношения не имеет.
о до, вначале обобщишь до структур, потом подумаешь чому бы структуры сами себя не приводили к типам
Нет, когда у тебя проект из 10 подкпроектов с подпроектами состоит, и в каждом подпроекте таргет - shared object, то становится крайне геморрой мейк писать.Еще проблемы с переносимостью и зависимостями.
У тебя в мейке нет нормального способа определить целевую платформу или компилятор системы.
> сделай
Наслаждайся: http://ideone.com/4seDQT
У первого варианта есть очевидные проблемы - оно матчит именно литерал, т.е., если третьим аргументом 0+0 передать, то будет бида-бида. И, что гораздо хуевее, оно в целом не работает, если третий аргумент начинается не с идентификатора.
>>851971
> Симейк
Хуета с синтаксисом похуже сишного препроцессора, с прибитыми гвоздями путями и ключами компилятора, которую не понимают даже ее разработчики. Шаг вправо, шаг влево от того, что оно считает нормальным? Добро пожаловать в ад, снова. Нет макросов для твоего компилятора? У тебя персональный ад. Кросскомпиляция? Нутыпонел.
Можешь хелпануть кое с чем, тут вообще треш
int main() {
int i = 0;
int j = 0;
while (1) {
i++;
cin >> j;
if (cin.fail())
{
cout << "Fail!" << endl;
cin.clear();
}
cout << "Integer " << i << ": " << j << endl;
}
}
тут ещё и табуляция прописывается, наверное я действительно далбаёб.
В глаза ебусь.
насладился. в первом случае variadic macros со всеми вытекающими, во втором не соответствует условию, т.е. нужно разворачивание на этапе препроцессинга. два однострочных макроса с различными именами - вин. хотя очень странно, почему препроцессор не имеет своего полноценного языка, хотябы типа мэйка, с циклами условиями и прочим.
Бамп.
Навесь любой внешний препроцессор.
Я вон на руби генерирую код (в руби удобная подстановка в строках)
Я специально для тебя прошёлся поиском по кучке ведущих сишных ПИДАРСКИХ проектов, итого вымазано в макросах с ног до головы:
- OpenSSL;
- Его БИЖАПАШНЫЙ форк из которого по заверениям авторов вырезано 2/3 всего - LibreSSL (макросов там реальзо заметно меньше, но всё равно дохуени);
- Cpython;
- Ruby;
- Erlang;
- Perl (лол);
- GCC (там от плюсов только перегрузка операторов и отсутствие большинства shadow cast-ов, лол, хз нахуя они вообще с си слезали официально);
- Linux (да, их там дохуя, хотя учитывая кол-во драйверов, хуиток вроде perf и пр. в одной репе нельзя сказать что всё ядро ими измазано, но всё на удивление легко читаемо - и ничего сложнее коротких побитовых смещений из 2-3 действий, вот как действительно надо писать);
- jemalloc;
- gdb;
- а дальше заебался, алсо, во многих кроме того ещё сторонние кодогенераторы/скрипты были.
После этого ты приводишь аргумент о непидорстве mysql - самой обоссаной бд особенно в 2к16 когда настолько уёбищно масшабируемая бд даже вебмартышкам не упала нахуй, которую любят и не поносят только пхпшники, лол. Про долбоебизм людей, которые полностью пишут бд на си, при том что 95% времени своей работы она записывает и считывает что-то с жд: это, конешно, кек.
Алсо, пхп кстати тоже так же писался чисто и без макросов, что как бы намекает.
ой бля, я обосрался, не майэскюэл, а эскюэлайт.
ну во первых, тут разговор не в количестве макросов, макросы это заебись, а в их сложности. второе, в таких проектах много опционального и платформозависимого кода разруливаемого препроцессором.
>эскюэлайт
Лол.
>второе, в таких проектах много опционального и платформозависимого кода разруливаемого препроцессором.
Всякую хуиту с условной компиляцией я и не учитывал если что.
>Лол
нет, погугли его часто ставят как пример хорошего кода, это можно сказать мем.
так вот, здесь вопрос в том как ебут макросы, ты там много встречал наподобии >>852000, или они все довольно просты? в нормальных проектах, они сходу читаемы и никакого мозгоебства с ними нет.
А о чём вообще спор? В любом сишном проекте макросов туева хуча. Сложно найти проект, где бы их не было
>хуиток вроде perf
Это ты хуитка. perf отличная тулза.
1 место - libjit. Присуждается премия "Самые вложенные макросы в макросах".:
#define x86_mov_memindex_imm(inst,basereg,disp,indexreg,shift,imm,size)\
do {\
if ((size) == 1) {\
(inst)++ = (unsigned char)0xc6;\
x86_memindex_emit ((inst), 0, (basereg), (disp), (indexreg), (shift));\
x86_imm_emit8 ((inst), (imm));\
} else if ((size) == 2) {\
(inst)++ = (unsigned char)0x66;\
(inst)++ = (unsigned char)0xc7;\
x86_memindex_emit ((inst), 0, (basereg), (disp), (indexreg), (shift));\
x86_imm_emit16 ((inst), (imm));\
} else {\
(inst)++ = (unsigned char)0xc7;\
x86_memindex_emit ((inst), 0, (basereg), (disp), (indexreg), (shift));\
x86_imm_emit32 ((inst), (imm));\
}\
} while (0)
2 место - Perl. Присуждаются премии "самое нечитабельное говнокодище" и "лучшее наименование полей":
# define GvNAME_HEK(gv) \
(({ GV const _gvname_hek = (GV *) (gv); \
assert(isGV_with_GP(_gvname_hek)); \
assert(SvTYPE(_gvname_hek) == SVt_PVGV || SvTYPE(_gvname_hek) >= SVt_PVLV); \
assert(!SvVALID(_gvname_hek)); \
&(GvXPVGV(_gvname_hek)->xiv_u.xivu_namehek); \
}))
3 место - GCC. Присуждаются премии "самые длинные макросы" и "самое большое число копипасты":
#define DEF_PRIMITIVE_TYPE(ENUM, VALUE) \
case ENUM: return make_primitive_type (ENUM);
#define DEF_FUNCTION_TYPE_0(ENUM, RETURN) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 0);
#define DEF_FUNCTION_TYPE_1(ENUM, RETURN, ARG1) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 1, ARG1);
#define DEF_FUNCTION_TYPE_2(ENUM, RETURN, ARG1, ARG2) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 2, ARG1, ARG2);
#define DEF_FUNCTION_TYPE_3(ENUM, RETURN, ARG1, ARG2, ARG3) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 3, ARG1, ARG2, ARG3);
#define DEF_FUNCTION_TYPE_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 4, ARG1, ARG2, ARG3, \
ARG4);
#define DEF_FUNCTION_TYPE_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 5, ARG1, ARG2, ARG3, \
ARG4, ARG5);
#define DEF_FUNCTION_TYPE_6(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
ARG6) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 6, ARG1, ARG2, ARG3, \
ARG4, ARG5, ARG6);
#define DEF_FUNCTION_TYPE_7(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
ARG6, ARG7) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 7, ARG1, ARG2, ARG3, \
ARG4, ARG5, ARG6, ARG7);
#define DEF_FUNCTION_TYPE_8(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
ARG6, ARG7, ARG8) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, \
ARG4, ARG5, ARG6, ARG7, ARG8);
#define DEF_FUNCTION_TYPE_9(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
ARG6, ARG7, ARG8, ARG9) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 9, ARG1, ARG2, ARG3, \
ARG4, ARG5, ARG6, ARG7, ARG8, ARG9);
#define DEF_FUNCTION_TYPE_10(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
ARG6, ARG7, ARG8, ARG9, ARG10) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 10, ARG1, ARG2, ARG3, \
ARG4, ARG5, ARG6, ARG7, ARG8, ARG9, \
ARG10);
#define DEF_FUNCTION_TYPE_11(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
ARG6, ARG7, ARG8, ARG9, ARG10, ARG11) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 11, ARG1, ARG2, ARG3, \
ARG4, ARG5, ARG6, ARG7, ARG8, ARG9, \
ARG10, ARG11);
#define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \
case ENUM: return make_fn_type (ENUM, RETURN, 1, 0);
#define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \
case ENUM: return make_fn_type (ENUM, RETURN, 1, 1, ARG1);
#define DEF_FUNCTION_TYPE_VAR_2(ENUM, RETURN, ARG1, ARG2) \
case ENUM: return make_fn_type (ENUM, RETURN, 1, 2, ARG1, ARG2);
#define DEF_FUNCTION_TYPE_VAR_3(ENUM, RETURN, ARG1, ARG2, ARG3) \
case ENUM: return make_fn_type (ENUM, RETURN, 1, 3, ARG1, ARG2, ARG3);
#define DEF_FUNCTION_TYPE_VAR_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \
case ENUM: return make_fn_type (ENUM, RETURN, 1, 4, ARG1, ARG2, ARG3, \
ARG4);
#define DEF_FUNCTION_TYPE_VAR_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) \
case ENUM: return make_fn_type (ENUM, RETURN, 1, 5, ARG1, ARG2, ARG3, \
ARG4, ARG5);
#define DEF_FUNCTION_TYPE_VAR_6(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
ARG6) \
case ENUM: return make_fn_type (ENUM, RETURN, 1, 6, ARG1, ARG2, ARG3, \
ARG4, ARG5, ARG6);
#define DEF_FUNCTION_TYPE_VAR_7(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
ARG6, ARG7) \
case ENUM: return make_fn_type (ENUM, RETURN, 1, 7, ARG1, ARG2, ARG3, \
ARG4, ARG5, ARG6, ARG7);
#define DEF_POINTER_TYPE(ENUM, TYPE) \
case ENUM: return make_ptr_type (ENUM, TYPE);
1 место - libjit. Присуждается премия "Самые вложенные макросы в макросах".:
#define x86_mov_memindex_imm(inst,basereg,disp,indexreg,shift,imm,size)\
do {\
if ((size) == 1) {\
(inst)++ = (unsigned char)0xc6;\
x86_memindex_emit ((inst), 0, (basereg), (disp), (indexreg), (shift));\
x86_imm_emit8 ((inst), (imm));\
} else if ((size) == 2) {\
(inst)++ = (unsigned char)0x66;\
(inst)++ = (unsigned char)0xc7;\
x86_memindex_emit ((inst), 0, (basereg), (disp), (indexreg), (shift));\
x86_imm_emit16 ((inst), (imm));\
} else {\
(inst)++ = (unsigned char)0xc7;\
x86_memindex_emit ((inst), 0, (basereg), (disp), (indexreg), (shift));\
x86_imm_emit32 ((inst), (imm));\
}\
} while (0)
2 место - Perl. Присуждаются премии "самое нечитабельное говнокодище" и "лучшее наименование полей":
# define GvNAME_HEK(gv) \
(({ GV const _gvname_hek = (GV *) (gv); \
assert(isGV_with_GP(_gvname_hek)); \
assert(SvTYPE(_gvname_hek) == SVt_PVGV || SvTYPE(_gvname_hek) >= SVt_PVLV); \
assert(!SvVALID(_gvname_hek)); \
&(GvXPVGV(_gvname_hek)->xiv_u.xivu_namehek); \
}))
3 место - GCC. Присуждаются премии "самые длинные макросы" и "самое большое число копипасты":
#define DEF_PRIMITIVE_TYPE(ENUM, VALUE) \
case ENUM: return make_primitive_type (ENUM);
#define DEF_FUNCTION_TYPE_0(ENUM, RETURN) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 0);
#define DEF_FUNCTION_TYPE_1(ENUM, RETURN, ARG1) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 1, ARG1);
#define DEF_FUNCTION_TYPE_2(ENUM, RETURN, ARG1, ARG2) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 2, ARG1, ARG2);
#define DEF_FUNCTION_TYPE_3(ENUM, RETURN, ARG1, ARG2, ARG3) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 3, ARG1, ARG2, ARG3);
#define DEF_FUNCTION_TYPE_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 4, ARG1, ARG2, ARG3, \
ARG4);
#define DEF_FUNCTION_TYPE_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 5, ARG1, ARG2, ARG3, \
ARG4, ARG5);
#define DEF_FUNCTION_TYPE_6(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
ARG6) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 6, ARG1, ARG2, ARG3, \
ARG4, ARG5, ARG6);
#define DEF_FUNCTION_TYPE_7(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
ARG6, ARG7) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 7, ARG1, ARG2, ARG3, \
ARG4, ARG5, ARG6, ARG7);
#define DEF_FUNCTION_TYPE_8(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
ARG6, ARG7, ARG8) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, \
ARG4, ARG5, ARG6, ARG7, ARG8);
#define DEF_FUNCTION_TYPE_9(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
ARG6, ARG7, ARG8, ARG9) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 9, ARG1, ARG2, ARG3, \
ARG4, ARG5, ARG6, ARG7, ARG8, ARG9);
#define DEF_FUNCTION_TYPE_10(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
ARG6, ARG7, ARG8, ARG9, ARG10) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 10, ARG1, ARG2, ARG3, \
ARG4, ARG5, ARG6, ARG7, ARG8, ARG9, \
ARG10);
#define DEF_FUNCTION_TYPE_11(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
ARG6, ARG7, ARG8, ARG9, ARG10, ARG11) \
case ENUM: return make_fn_type (ENUM, RETURN, 0, 11, ARG1, ARG2, ARG3, \
ARG4, ARG5, ARG6, ARG7, ARG8, ARG9, \
ARG10, ARG11);
#define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \
case ENUM: return make_fn_type (ENUM, RETURN, 1, 0);
#define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \
case ENUM: return make_fn_type (ENUM, RETURN, 1, 1, ARG1);
#define DEF_FUNCTION_TYPE_VAR_2(ENUM, RETURN, ARG1, ARG2) \
case ENUM: return make_fn_type (ENUM, RETURN, 1, 2, ARG1, ARG2);
#define DEF_FUNCTION_TYPE_VAR_3(ENUM, RETURN, ARG1, ARG2, ARG3) \
case ENUM: return make_fn_type (ENUM, RETURN, 1, 3, ARG1, ARG2, ARG3);
#define DEF_FUNCTION_TYPE_VAR_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \
case ENUM: return make_fn_type (ENUM, RETURN, 1, 4, ARG1, ARG2, ARG3, \
ARG4);
#define DEF_FUNCTION_TYPE_VAR_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) \
case ENUM: return make_fn_type (ENUM, RETURN, 1, 5, ARG1, ARG2, ARG3, \
ARG4, ARG5);
#define DEF_FUNCTION_TYPE_VAR_6(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
ARG6) \
case ENUM: return make_fn_type (ENUM, RETURN, 1, 6, ARG1, ARG2, ARG3, \
ARG4, ARG5, ARG6);
#define DEF_FUNCTION_TYPE_VAR_7(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
ARG6, ARG7) \
case ENUM: return make_fn_type (ENUM, RETURN, 1, 7, ARG1, ARG2, ARG3, \
ARG4, ARG5, ARG6, ARG7);
#define DEF_POINTER_TYPE(ENUM, TYPE) \
case ENUM: return make_ptr_type (ENUM, TYPE);
>mysql - самой обоссаной бд
>особенно в 2к16 когда настолько уёбищно масшабируемая бд даже вебмартышкам не упала нахуй
Такие категоричные заявления могут себе позволить только люди мало что понимающие в БД. Что собственно подтверждается
>Про долбоебизм людей, которые полностью пишут бд на си, при том что 95% времени своей работы она записывает и считывает что-то с жд: это, конешно, кек.
Видно студентика или человека который о БД знает понаслышке.
мимокрокодил
>А о чём вообще спор? В любом сишном проекте макросов туева хуча. Сложно найти проект, где бы их не было
Спор о том, что тот госопдин спизданул что-то в стиле "макросами всё вымазывают только пидары".
>Это ты хуитка. perf отличная тулза.
Хуитка по кол-ву кода относительно всего кода в репе.
>>852164
>так вот, здесь вопрос в том как ебут макросы
Мальчик, ты не видел что такое "ебут макросы".
>нет, погугли его часто ставят как пример хорошего кода, это можно сказать мем.
Исходники гита тоже часто так называют. Тольк вот суть их простоты как и у ядра линукса - они сами по себе максимально простые, и десятиэтажными макросами срать там негде.
>или они все довольно просты?
Это как шаблоны в плюсах. Пока их мало - всё хорошо читается, когда разрастаются в вложенные 10 раз хуитки - получается write-only говно с магией.
>>852177
>пук
> "макросами всё вымазывают только пидары".
ой не пизди, господин писал, что
>нормальные люди делают без выебонов
без хитровыебанныз макррсов, капиш
>>852175
>2 место - Perl. Присуждаются премии "самое нечитабельное говнокодище" и "лучшее наименование полей":
Здесь ты обосрался, Sv это скалярный вектор, ну и остальные буковки имеют смысл.
> ядра линукса
>гит
лол, этоже образец говнокодинга и непродуманной архитектуры в одном флаконе
>без хитровыебанныз макррсов, капиш
У господина "хитровыебанными" считаются генерик-макросы из си11, лол.
фигасе пару, я тоже такой подход с буквенным кодированием активно пользую, очень удобно.
>>852206
>из си11
да
з.ы. и да, вот смотри как в перл кодируют http://perldoc.perl.org/perlapi.html#svtype
я считаю это охуенчик, главное незабыть документашку.
>фигасе пару
Да, пару. Можно назвать хотя бы в стиле s_vec — на клавиатуру нужно нажать на 2 кнопки больше, зато читаемость несравнимо выше.
>да
Бля, а я-то забыл что сижу в си треде с ретроградо-неосиляторами.
>>852215
>главное незабыть документашк
Всегда помнить документацию чтобы знать что это за тип — это блять просто максимальное днище в мире стилей кодирование. Хорошо что перл умер.
Двачую, кончил.
>>852224
Что угодно из того >>852140 списка кроме перла. Настолько нечитаемого стиля кода нигде блять нету.
Скажи мне, что ты не долбоёб и пытаешься меня потралить, а не на полом серьёзе не видишь тут сарказма, пожалуйста.
> variadic macros со всеми вытекающими
Какой variadic macros? Там три фиксированных аргумента - hash(a, b, c). Ты __VA_ARGS__ увидел и испугался? Там нам нем if реализован. Но там есть другие проблемы, и я о них уже сказал
> нужно разворачивание на этапе препроцессинга
Впервые слышу. Оно на этапе компиляции разворачивается, зачем тебе именно препроцессором?
Алсо, да, я тоже хочу более мощный препроцессор в сишечке. Но, видимо, не в этой жизни.
>>852175
1 место норм код, не вижу никакой проблемы вообще, это идиома. Если платформ полторы, то можно inline/forceinline, если нужно C89, то приходится так.
3 место должно быть на первом.
Если бы я это воспринял на полном серьёзе, я бы не уточнял. Но я рад, что всё не так с тобой плохо.
Чем редактировал? Это линукс? Делал ли clear/reset? Что на самом деле записано в файле?
Забудь, проблема решена.
Например дан такой массив -
int arr[15] = {3,7,8,2,8,2,2,4,6,3,1,0,0,0,5};
нужно что бы вывело только = 7,2,2,4,3,0,0
Так просто, спасибо
Ловкач Джэк
слишком очевидно
Мой компилятор ругается если пишу без int.
Как правильно?
clang ругается, а gcc нет.
В последних двух стандартах неявный int запрещен. Поэтому правильно: int main(void) или вариант с аргументами.
> clang ругается, а gcc нет.
gcc -std=c11 file.c
>int main(void)
вангую, что void конпилицо как main с нулевыми аргументами. иже есть сахарок
void в аргументах по историческим причинам. Раньше в декларациях функций не нужно было указывать типы аргументов. Чтобы отличить древние декларации с какими-то аргументами* от современных функций без аргументов, в сишечке в функциях без аргументов пишут void, а использующих пустые скобки всячески обоссывают за неспособность учиться.
вдруг поймал себя на мысли, что практически не встречал функций без аргументов в большинстве исходников
Нормальные программисты минимизируют число побочных эффектов, а функция без аргументов и есть один сплошной побочный эффект.
Проблема в том, что я незнаю с чего начать, составьте для меня небольшой todo-лист, кто понимает.
Вот даже уже готовый пример есть https://github.com/dariuszdziuk/wordnet, но мне нужно разобраться как это делается впринципе.
Вопрос не правильно поставил.
Сейчас более менее вник. Суть API этого - обращение к дб. Т.е если я хочу использовать JavaScript, мне нужно просто переписать все функции на нем.
Другой вопрос, не лучше ли будет написать скрип в JS, который будет запускать С программу (child process) и output из этого С скрипа передавать обратно (через pipe)?
Т.е использовать С библиотеку все-таки.
Это будет экономнее по времени, чем переписывать функции в JavaScript?
По производительности?
Да.
>>853924
Таки нет. Хотя я не программист.
Я не могу дать определение разрядности процессора, но могу привести примеры.
1) Древний 8-разрядный 6502. АЛУ работает с 8-разрядными числами, адресное пространство 64КБ. Соответственно указатели 16-битные.
2) x86. Адресное пространство ограничено системой команд до 64ГБ. Регистры общего назначения 32-разрядные. Указатели 32-битные. Но есть всякие SSE, в которых есть регистры с большей разрядностью.
То есть разрядностью процессора нельзя назвать ни разрядность АЛУ, ни разрядность шины адреса. Может быть разрядность процессора это разрядность регистров общего назначения, но что называть регистром общего назначения?
Так что по моему нельзя дать однозначное определение.
> x86. Адресное пространство ограничено системой команд до 64ГБ
Один дурак сказал, все повторяют. 4 ГБ адресного пространства. Иди еще раз посмотри на картинку дескриптора сегмента из мануалов.
> есть всякие SSE, в которых есть регистры с большей разрядность
Прочитай память по адресу, содержащемуся в SSE-регистре, а потом приходи спрашивать, что называют регистром общего назначения.
>>854055
Гитхаб, различные опенсорсные сишные рантаймы. Вижуал студия, исходники CRT в комплекте.
>> x86. Адресное пространство ограничено системой команд до 64ГБ
>Один дурак сказал, все повторяют. 4 ГБ адресного пространства.
https://en.wikipedia.org/wiki/Physical_Address_Extension
Ты еще про оверлеи расскажи. PAE - это те самые оверлеи, когда ты в разное время маппишь разные участки физической памяти в виртуальную. Адресное пространство остается 4 ГБ, такие дела.
Ок.
Решил заняться настоящим программированием, но послее ООП головного мозга не очень понятно как в процедурщине реализовать тру шаблоны проектирования.
Существуют ли они вообще? Конкретно шаблоны проектирования под Си, не под си с объектами, а именно в том виде каким он должен быть?
Киньте ссылку на литературу годную. Поиск выдает какую-то поебень типа Objective-C и тому подобное.
>Object-oriented ansi c
книга годная, но бля это же пиздец пиздецовый, для ооп есть плюсы и
жаба, зачем страдать хуйней то? >>854161 чем тебя ооп не устраивает
Разработайте программу,которая вводит целое положительное число в промежутке от 1 до 100 (необходимо предусмотреть обработку ошибок при вводе). В соответствии с этим числом сформировать записи трех видов:
"Ваш возраст 1 год", "Ваш возраст 22 года", "Ваш возраст 75 лет"
''Вам до совершеннолетия 17 лет'',''Вы совершеннолетний 4 года'','''Вы совершеннолетний 57 лет"
"Вам до пенсии 59 лет", "Вам до пенсии 48 лет", "Вы на пенсии 15 лет"
Наваял программку, она компилируется, но ничего не выводит (параша, да).
http://ideone.com/oUP7qD
У тебя в main декларации функций т.е., ты как бы говоришь "сап, гцц, есть одна функция", а не их вызовы. Вызовы делаются так же, как и у всяких библиотечных printf(): имяфункции(тут аргументы, если есть);
> Не прокатило.
Ты так говоришь, как будто это было единственной проблемой твоего кода:
> return dy[3];
Ты, вероятно, думал, что возвращаешь массив из трех элементов? Нет, ты читаешь значение за пределами массива (всего три элемента, а ты читаешь четвертый), а возвращать массивы напрямую нельзя, используй указатели или, на худой конец, объяви глобальную переменную.
>>854888
Легковесное: берешь gcc (и msys/msys2 заодно), берешь любой текстовый редактор (например, саблайм). Отлаживаешь чем придется (x64dbg, IDA, gdb). Если хочется IDE, есть Pelles C, там свой компилятор и свой source-level отладчик.
Саблайм лучше ноутпада плюх-плюх?
>Отлаживаешь чем придется (x64dbg, IDA, gdb)
Во что проще вкатиться, что удобнее?
Gcc под шиндоус - mingw? Или что?
> Саблайм лучше ноутпада плюх-плюх?
Дело вкуса.
> Gcc под шиндоус - mingw? Или что?
Да. Ставится в комплекте msys.
> что удобнее?
Удобнее - нормальный отладчик с человеческим лицом типа студийного но студия весит в районе 5-10 Гб или Pelles C. В принципе, если потребность есть, то и gdb несложно осилить.
А легковесные аналоги студии есть адекватные? Помню, в студенчестве пытался угорать по опенсорсу и лабы делал в code blocks. Не особо был от него в восторге. Студия годная, но жирная и платная, я не уверен, что такой софт на работе можно ставить себе. Да и мне по мелочам иногда использовать надо будет, так как я в большинстве случаев под arm/avr пишу, а на пекарне для тестов и облегчения себе жизни проще змею использовать.
> студия ... платная
Есть Community-версия, она бесплатная, но на работе ее использовать действительно нельзя.
Code::Blocks никуда не делся, оброс фичами и, возможно, стал более юзабельным. Есть еще всякие IDE на Java, тот же эклипс и CLion - они достаточно удобные, но как по мне, слишком уж неповоротливые.
>на работе ее использовать действительно нельзя
Ну вот о том и речь.
Code blocks вообще юзабельный? Лет семь назад он мне показался весьма корявым. Но он как раз вроде легкий был весьма.
CLion же тоже вроде платная.
Юзаю NetBeans. Легковесной ее не назвать (ибо Java), но в остальном вполне удовлетворяет моим потребностям.
>>854915
>эклипс
По функционалу норм. Но лично мне не подходит из-за очень крупных элементов интерфейса; на моем экране ничего толком не умещается. Хотя, может быть, оно и настраивается.
>CLion
Платная же. Хотя, я слышал, они еще распространяют какую-то кастрированную версию.
Я понял, что я полный еблан. Я не знаю, почти нихуя про функции, и в этой программе нагородил полнейшую херню. Как это лечить? Это пройдет? Что посоветуете?
1) Написать функцию, которая выводит правильное склонение год/года/лет (printf) или возвращает указатель на правильное склонение слова.
2) Написать функцию ввода (читать ввод, проверять на ошибки, возвращать 1 int, ты это умеешь).
3) Написать функцию, выводящую информацию о текущем возрасте.
4) Написать/исправить функции совершеннолетия и пенсий.
В результате получится:
int get_age(void) { ... }
void print_years(int age) { ... }; // Или char *get_years_declenision(int age) { ... }
void print_current_age(int age) { ... }
void print_adult_status(int age) { ... }
void print_pension_status(int age) { ... }
int main(void) {
int age = get_age();
print_current_age(age);
print_adult_status(age);
print_pension_status(age);
}
Пиши по-порядку и сразу тестируй написанное. Ничего сложного в задании нет, а все, что тебе нужно знать, уже есть в том коде, что ты постил выше.
Вот твоя программа: http://ideone.com/1KfgB8
Удиви препода. На первый взгляд может показаться, что я издеваюсь. На самом деле я просто не люблю городить многоэтажные if'ы и терпеть не могу наличия в одной функции нескольких return'ов. Но если хочешь, можешь переписать как тебе надо.
Баги специально оставил, чтобы >>854934 помучался? grammatic_form показывает нам все, что нужно знать о тернарном операторе. Алсо, твоя enter() сломана - введи a и нажми Enter. Вангую, что ты сам недавно выучил язык. Если будешь писать на нем, то с годами все перекосы пройдут.
Один баг уже успел пофиксить (в последней функции). enter() тоже переделал. scanf - зло. Изменения внем прямо на ideone.
>Вангую, что ты сам недавно выучил язык.
Лол. Так или иначе связан с Сишкой уже больше 10 лет. Просто внимательность никогда не была моей сильной стороной. Ну и да, прогу через отладчик не прогонял.
> Так или иначе связан с Сишкой уже больше 10 лет.
Ну хуй знает. Я не про баги. Я про комментарии с линиями, const int абсолютно ничем не отличается от int с точки зрения компилятора, разве что изменять нельзя напрямую, многострочные тернарные операторы нечитаемы, прототипы в .c, inline на который всем насрать... будем считать, что мой детектор дал сбой.
>комментарии с линиями
Вопрос вкуса, ящитаю. Просто мне так удобнее визуально воспринимать код. Первый раз такие коменты увидел в 2004 году и стех пор сам их использую.
>const int
>inline
Я это не для компилятора пишу, а для себя и для потенциальных читателей кода. Согласен, в маленьких учебных прогах можно забить на все эти нюансы. Как и на static в объявлении функции (файл-то один). Это уже чистая привычка. Я всегда так пишу. Да что там говорить, я даже restrict юзаю.
>прототипы в .c
ideone же. Там нельзя создать отдельный буфер для хедера. Можно было, конечно, определить все функции перед main, но я делал методом "сверху вниз" и, как мне кажется, это затруднило бы чтение.
>тернарные операторы
Ну тут я полностью согласен. Разумеется, в продакшн-коде такому говну не место. Но и давать очевидно наивное решение тоже не хотелось. Мне кажется, что >>854853 не помешает немного напрячь мозг.
http://pastebin.com/dK5gYxG3
https://pp.vk.me/c637922/v637922388/16006/V3EM_Qn_rI8.jpg
Код не читал, хуй знает, что там считается, а ссылка на дуро^Wмэйлру не открывается. Но раз x и a типа double, то, их разность может быть достаточно малой, и при этом не нулевой. Сравнивать числа с плавающей точкой операторами == и != можно только в очень редких случаях. Используй вместо != 0 что-нибудь типа >= N, где N - достаточно маленькое ненулевое число.
> вместо установщика там менеджер пакетов
> Инета на рабочем компе нет
Можно выкачать пакеты в офлайн (/etc/pacman.d/mirrorlist.*) и поставить с помощью pacman -U.
> жму конпелировать, он пишет, что конпелятор вернул 0, но при этом нихуя не происходит
У Code::Blocks есть окно с логом компиляции. Компилятор там точно правильный и по правильному пути вызывается? Все ли длл оно находит наиболее частая проблема? Попробуй из виндовой консольки руками gcc сказать, проставив все пути так же, как в Code::Blocks.
Алсо у Code::Blocks есть дистр со включенным в него mingw.
Скачал пакеты, попробую завтра. Ну и заодно дистр codeblocks вместе с mingw. Спасибо за помощь, анон.
Дано натуральное n и действительное a. Вычислить: ПИК
CODE(ОЧЕНЬ КРИВОЙ):
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <conio.h>
using namespace std;
int main()
{
int n;
double a;
cin >> a;
cin >> n;
double result = 0;
for (int i = n; i = n; i++)
{
double temp = a;
for (int j = 1; j < i; j++)
{
temp *= (a + j);
}
result += 1 / temp;
}
cout << result;
return 0;
_getch();
}
Дано натуральное n и действительное a. Вычислить: ПИК
CODE(ОЧЕНЬ КРИВОЙ):
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <conio.h>
using namespace std;
int main()
{
int n;
double a;
cin >> a;
cin >> n;
double result = 0;
for (int i = n; i = n; i++)
{
double temp = a;
for (int j = 1; j < i; j++)
{
temp *= (a + j);
}
result += 1 / temp;
}
cout << result;
return 0;
_getch();
}
Код лучше на pastebin скинь. Или скрин сделай. Так нечитаемо. Но я сразу могу сказать, что твоя программа написана не на Си.
>for (int i = n; i = n; i++)
тут опечатался, у меня
for (int i =0; i < n; i++) было, и работала она пплохо
В каком смысле плохо? У тебя двойной цикл, который совсем не нужен.
>>855969
В си нет cin/cout.
Твоя программа написана на C++. Ну это сильно сказано. Потому что если ты пользуешься iostream, то зачем подключать stdio? conio.h, насколько мне известно, не входит ни в стандарт C, ни в стандарт С++. В Си не бывает iostream, cin, cout и using namespace std.
Попробуй мое решение. Оно довольно грубое, поскольку в идеале надо бы проверку на переполнение запилить. А я пока отойду не надолго. Если что, пиши.
>В каком смысле плохо?
Выдавала совсем не тот результат
>В си нет cin/cout.
бляяяяяя, точно
сука
сорян, просто уже 10 часов подряд сижу за математиками, вообще голова едет
завтра ещё эту прогу надо сдать
помоги пожалуйста переписать убрать
>У тебя двойной цикл, который совсем не нужен
>>855976
Да. Ну крч, мне тут один чел помог именно с циклом, видимо он не так поонял и написал на крестах
но надо на Си
щас чекну твое
http://pastebin.com/QXqi1dWH довел прогу до ума, теперь она работает.
Осталось переписать с С++ на Си.
Это возможно?
Фиксанул, вроде. Допустим, a = 1, n = 2. Должно получиться 1 + (1/(1∙(1+1))) + (1/(1∙(1+1)∙(1+2))) = 1 + 1/2 + 1/6 ~= 1.667, так ведь?
http://ideone.com/ArHkgC
Ну я сразу написал, что решение грубое. Я же не буду детально прорабатывать чужую лабу. Эпсилон и проверка на переполнение легко гуглятся.
Лол, я даже не знаю, ожидает ли препод такого решения от >>855962 Обычно же хватает варианта "на отъебись". Если конечно это не лаба по мат. программированию.
> Если конечно это не лаба по мат. программированию.
Нет
>ожидает ли препод
Вряд ли, у меня преподша очень странная, я для себя пытаюсь понять просто
>>856038
>l
что это перед d?
Раньше в прогах писал
>scanf("%f,%f", &a, &n)
и работало
А ты ман по scanf/printf почитай. Там эротика.
Где я ошибся?
где они тут?
я думал, что это *xxxxxxxxxxxx
Прочитать ман по printf и scanf. А еще не копировать бездумно код, который тебе дали на дваче. Понятно, что для тебя это невыполнимо.
Да я троллю, успокойся.
>не копировать бездумно код, который тебе дали на дваче
Ты сам хоть понимаешь, что пишешь?
>>856071
Бляя, я надеюсь ты когда нибудь попадешь на мой факультет
>Ты сам хоть понимаешь, что пишешь?
Понимаю. Проблемы?
>Бляя, я надеюсь ты когда нибудь попадешь на мой факультет
Зачем?
Ну, все таки, вопросы использования stdio - это специфика Сишки. Можно, конечно, было отправить его в ньюфаг-тред, но к чему умножать сущности? Как мне кажется, в данном случае, лучше показать, как решить проблему с printf/scanf, чем тупо отправить читать маны. Чисто чтобы потом у него не возникло отвращения к языку из-за одной единственной говнолабы.
>И прочитай все таки доки на stdio.
Спасибо большое, добра
>>856074
>Проблемы?
Пруфани, что я код с двачей скопировал
Да и вообще, как я могу это знать?
В школе у нас вообще не было информатики (к егэ сам готовился)
В универе на странного препода попал, щас зайду с телефона кину тебе задание на допуск к этой самой лабе
Все, что она обьяснила это int, while, for, do while и как кубриками этими ебаными рисовать блок-схемы
p.s. уже 11ый час сижу за расчетками по математикам, поэтому туплю довольно жестко
>Пруфани, что я код с двачей скопировал
У тебя в >>856047 вконце printf, а следом scanf. Может это конечно у тебя сделано, чтобы press any key before continue, но что-то мне подсказывает, что просто копирнул.
eto ne vichislimo po turingu
а) запилить подсказку по функциям (ну типа когда вызов пишешь, чтобы он находил в указанных заранее директориях прототип и писал, какие параметры надо передавать. Ну типа как анаконда для пистона)
б) запилить форматирование всего файла хоткеем?
в) отображение определения макросов, а не названия файла, в котором оно находится
> подсказку
SublimeCodeIntel, но оно это одна большая проблема. В целом, проще считать, что нет.
> форматирование хоткеем
Обертки вокруг astyle и clangformat, тысячи их.
> определения макросов
Хуй знает, поковыряй, как оно там индексирует. Мне достаточно Goto definition (назначь хоткей, по умолчанию вроде нету) и потом Jump Back (Alt -).
Это нормально, что scanf не может прочитать короткое целое число 255>=x>=0 в однобайтовый unsigned char, когда в строке формата стоит %d?
На ideone читает, но не читает в signed. Какое-то непредсказуемое поведение...
На том же ideone читает, если вместо %d указать %u, но на моем компьютере по прежнему ведет себя странно.
Хм. Ну и ладно, проще считать в int и привести к char тогда. Наверное. Я же нуб и могу ошибаться.
Анон, отчего в этом коде Example 5 может быть сегфолт? Очепяток нету, написано вроде все верно.
Нет пока, не пробовал, только домой сейчас доберусь, где смогу.
>SublimeCodeIntel
Там по-моему нет C, а для пистона анаконда ну просто конфета.
>Обертки вокруг astyle
В смысле, обертки?
Алсо, сниппеты - это типа как code templates в iar? Нихуя только не понятно, как их самому создавать?
> SublimeCodeIntel
> Там по-моему нет C
И правда, извини.
> В смысле, обертки?
В смысле, есть много плагинов, у которых внутри бинарник astyle в том или ином виде. Например, SublimeAStyleFormatter, там внутри pyastyle.
> Алсо, сниппеты - это типа как code templates
Ну да. Создавать через Tools->Developer->New snippet, описание http://docs.sublimetext.info/en/latest/extensibility/snippets.html
Как скажешь.
Вы видите копию треда, сохраненную 6 ноября 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.