Это копия, сохраненная 29 сентября 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Что читать:
- Классика от Отцов: http://www.ime.usp.br/~pf/Kernighan-Ritchie/C-Programming-Ebook.pdf
- Годное пособие для гуманитариев: http://c.learncodethehardway.org/book/
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~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/
Шапка: http://piratepad.net/bJ1SdmkZyu
стандарт ISO/IEC 9899:1999 - http://libgen.io/ads.php?md5=AE47DE5575CD798E7BB355405B0A2080
стандарт ISO/IEC 9899:2011 - http://libgen.io/ads.php?md5=4CC5C8494FDC76ECB56A927E802FF25E
Спасибо. Но ведь нет никаких значимых различий между последними драфтами и этими pdf?
Что за бомжевское рыло? Наверно, долго сопли и квашенную капусту из бороды выковыривал перед фотканьем.
пасиб
так вижуалстудия поддерживает только С89, а остальные требуют гцц
ну а зачем мне тогда нужен IAR?
> какие подводные камни
Никаких. Для вкатывания самое то, если IDE из комплекта не вызывает отвращения.
Можно читать K&R, второе издание. Если чего-то вдруг не соберется (Pelles C не любит до-ансишный способ декларации функций), спросишь тут, да и все.
Можешь и в С11, один хуй там разница минимальна.
Прохожу значит cs50 я и решил выложить код на кодревью, если кому-то захочется покритиковать код, буду очень рад.
Суть кода в том, чтобы залезть в card.raw файл, с которого по заданию были удалены jpg фотки и восстановить их в текущую директорию http://pastebin.com/804RAvLH комментарии есть (первый раз писал комменты реально). Код работает, интересны замечания в реализации.
http://rgho.st/6LtnFPmRJ - исходный файл (если нужно)
Это из четвертого псета? Не буду смотреть чтобы не заспойлерить, я еще не осилил его. Слошна было?
Да из 4, первые два задания норм, третье (которое я скинул) довольно напряженное для меня было, байтоебство началось во всей красе.
Ну первое то вообще фигня, второе я осилил еле еле, теперь читаю всю доступную литературу, сделал паузу пока. Потом вернусь, переделаю весь сет. Кстати, первое я тоже зафейлил, потмоу что думал что там Дэвид изображен а там рикролл
Запускаю "time ./heapsort < input", показывает 0.106 s, а второй и последующие разы 0.46 s, причем первый раз всегда зависит от размера input, а при повторном запуске время всегда 0.46 s. Можно от этого как-то избавиться? Это типа оптимизации какие-то?
Хотя как-то странно, на 100000 и 1000000 чисел время 0.46 s, а на 1000 0.60 s
Ну да тоже сначала про Девида подумал.
Во втором я на самом деле решение подсмотрел частично, у меня получилось увеличить изображение, но я увеличивал только по длине, а по ширине забывал, в итоге часть пикселей пропадало.
> если кому-то захочется покритиковать код, буду очень рад.
Что ты хочешь услышать? Насколько читабельный код или насколько правильно задание сделал? Если первое:
1. #define BUF_SIZE 512 нуу или хотя бы sizeof(buffer) вместо указывания размера при каждом использовании. Да и в целом все константы-имена мог бы и задефайнить.
2. Где блять проверка ошибок вызываемых библиотечных функций?
3. Глобальные переменные в main запихнуть зачем ты вообще решил сделать их глобальными?
4. Не используй sprintf если можно использовать snprintf
5. 99% комментариев не нужны, код и так понятен.
6. (-1 * 512 ) - нахуя так делать?
По первым пунктам согласен, а в 6 не понял, а как еще сделать было? -sizeof(buffer)?
> Где блять проверка ошибок вызываемых библиотечных функций?
Это проверка на NULL? Просто еще не очень понимаю суть этих проверок.
Суть в том, что если по каким то причинам fopen вернул нулл, то нужно все прекращать. Ну, так в кусре говорили. Же.
Да я вот особо и не понял, зачем это надо, с какого он вообще должен NULL возвращать, если файл на месте?
Ну он может быть поврежден например, или формат непонятный, или еще чего. Вобщем, это хорошая привычка
Ты ведь не на ОСРВ запускаешь код, чему удивляешься?
Да нет же, это после быдлокодерства тебе не привычно. В бидоне тоже нужно исключения ловить.
>а в 6 не понял, а как еще сделать было? -sizeof(buffer)?
Ну да, ебать, какой смысл добавлять умножение на единицу если нужно просто добавить минус.
В схеме. А схема не лисп. В общелиспе это зависит от имплементации, поэтому там сплошная ебля с goto, присыпанная сахарком.
Кроме того, что уже сказали, что за tens/ones, что за нахуй? Кто запретил %02i сделать?
Да я так и думал, что можно проще это сделать, слаб в форматировании, где можно почитать про все возможности форматирования строк?
В стандарте, в википедии, тут http://www.cplusplus.com/reference/cstdio/printf/ (не смотри на plusplus).
Спасибо
Код как код...
da
Говноедствовать интереснее?
Объявить переменную?
Хуле ты свое говно по двум тредам размазал, уебок? https://2ch.hk/pr/res/821402.html#822061 (М)
Алсо ты долбоеб, потому что ты только что форк-бомбу, уоторая даже если не упадет, будет работать медленнее однотредового сорта.
только что что?
> x = (void@@)a ;
> assignment from incompatible pointer type
> x = (void@)a ;
> ...
заебись. x указатель на указатель к опр. структуре. и первый каст видимо дохуя неправильный... каждый раз сгорает от этого.
Что не так? Все правильно же.
Сравни "указатель на что угодно" и "указатель на указать на что угодно". Во втором случае есть конкретный тип, поэтому компилятор и ругается. Вот дереференснешь если - тогда не будет.
Да на указатели
Прошу сплоеты писать
Пайду в председатели!
бред.
> struct @t = void @t
если это валидно
> struct t @@t = void @@t
то и это должно быть, ведь фактически, это оба void@.
int counter = 0;
char string[10];
string[counter++] = 'a';
Почему 'a' присваивается в string[0], а не string[1]?
Не бред.
void ∗ - указатель на что угодно. По стандарту, ты можешь без каста присвоить void ∗ любому другому указателю плюс-минус квалификаторы (и обратно).
Грубо говоря, если у тебя указатель на T, и T == void, есть магия. Если у тебя T == int, T == int ∗, T == struct ∗, T == void ∗, T == что-то еще, тогда магии нет.
Я не эксперт, но наверное потому, что сперва присвоение, а уже потом постинкремент
Ты ебанутый? Я же написал - разберись, что значит два плюсика перед переменной (преинкремент) и после (постинкремент). Копипасть инфу с книги я не буду, сам найдешь охуели вообще
Да уже нашел)
1. ты не хуя не объясняешь, а только путаешь.
2. нахуй ты мне объясняешь стандарт, я и так знаю что такое void@.
3. я говорю как было бы правильней, потому что так наглядней и меньше путает. и я не хочу писать всю структуру, чтобы иметь столько @ сколько захочу...
4. и вообще, если вспомнить asm... короче, плохо.
и ещё, я тут понял для чего нужен + в указании знака числу, чтобы конструкция вида #if (SOMEVER + 0 > 1) работала, даже если SOMEVER не объявлен.
>и ещё, я тут понял для чего нужен + в указании знака числу, чтобы конструкция вида #if (SOMEVER + 0 > 1) работала, даже если SOMEVER не объявлен.
Ну тут ты уже придираешься, препроцессор не должен вместо отсутствующей директивы лепить какого-то хуя 0).
> потому что так наглядней и меньше путает
> я не хочу писать
Посоны, я тут гуманитария поймал. Что с ним сделать?
> препроцессор не должен
Как раз таки должен. Все имена, которые #if не смог развернуть, он заменяет на литерал 0. Нахуя >>822483 воткнул +0 в #if - совершенно непонятно.
#if (SOMEVER + 0 > 1) развернется в #if (0 + 0 > 1) если SOMEVER не определен, в #if (что-то + 0 > 1), если SOMEVER определен, ну или свалится, если SOMEVER не разворачивается в число или выражение.
Но ведь он прав. Похожая проблема существует даже в более высокоуровневых языках, например, в жабе при работе с дженериками. Там никто никого гуманитариями не обзывает, но по-другому (не с помощью ебли с приведениями типов) красиво решить проблему в языке нельзя.
да есть такое, но если он не неопределён, а определён без значения - тогда такая конструкция поможет. просто в коде это видел.
Попытался реализовать стек, через двусвязный список, все вроде ок компилится и работает, но валгринд ругается, причем не на утечку памяти, а хз на что, посмотри плиз, а то я не вижу явных косяков.
printf ("%2d", a)
Он должен выдать "a" в поле из двух позиций, да? Но оно выводит все число, и трехзначное и четырехзначное. Я предполагал, что мне выдаст два первых разряда только. Чего я не понимаю? Ткни носом, анон. Гугл не помог.
Как минимум сделай человеческую проверку на ошибки malloc-а. Если malloc в push фейлится, то при pop будет обращение к нулевому указателю, на что, возможно, ругается valgrind. Ну и на счет free:
temp = real_first;
while (real_first != NULL)
{
// ТЫ ТУТ ОСВОБОДИЛ память по указателю temp и real_first
free(temp);
// А ТУТ ТЫ ОБРАЩАЕШЬСЯ К ЭТОЙ ПАМЯТИ. ЕБАНУТЫЙ!
real_first = real_first->next;
temp = real_first;
}
> из двух позиций
из МИНИМУМ двух позиций
> два разряда только
Подели или возьми остаток или форматни в строку и сделай %.2s.
Да чет с памятью тупанул, там оказалось вообще этот цикл не нужен, а что значит человеческая проверка?
Короче понял в чем косяки, он ругается на те строчки, где я сравниваю со значением NULL в циклах while, как это фиксить?
Спасибо.
Как предписывает стандарт?
старый, да. там что-то про отсутствие контроля за числом аргументов... и только void явно указывал, что нету их.
Уже не помню лол, сделал рефакторинг, ошибки исчезли, какой-то косяк был с временными указателями в функциях.
а может я и путаю, и небыло обязательного правила, и это причуда компилятора, хуй их знает на что они ворнинги выбрасывают, вон, на тот же & без скобочек - только так.
>а что значит человеческая проверка?
да в принципе я пересмотрел код, и так сойдет для начала.
Важная ошибка в коде - ты не инициализируешь newptr->next когда делаешь push первого элемента (то бишь когда (first == NULL)), а надо делать newptr->next = NULL.
В целом реализация алгоритма не очень красивая, подумай как лучше сделать
Ругается в смысле выбрасывает ворнинги? Если так, то всё правильно делает.
>Что это блять за говно такое этот ваш Pelles C?
Да исправил уже этот косяк, на самом деле только сейчас в курсе начались структуры данных, первый день и это по большей части эксперименты по реализации.
https://ideone.com/TAV3uO вот реализация, valgrind не жалуется, только тут я по типу очереди сделал, удаляет первые элементы, а не последние.
Чувствую с хеш-таблицами будет сложнее...
http://pastebin.com/7mSBJVny
Попытался реализовать дерево, авл дерево, все вроде ок компилится и работает, хочу внимания.
Пытаюсь написать интерпретатор/терминал/оболочку (не знаю как назвать) для парочки команд в микроконтроллер, чтобы через последовательный порт можно было заставлять его что-то делать прямым текстом (командами а-ля баш). Пока пишу под ПК на линуксе.
Вопрос следующий: как перехватить стрелочки, чтобы не выводился мусор типа "^[[D", а каретка перемещалась по вводимой строке? Пробовал getchar() и scanf() с одинаковым результатом, но я понятия не имею как предотвратить вывод этого мусора. Остальное я представляю себе как реализовать. Обязательный момент - это использование только функций из страндартной библиотеки.
И, кстати, вводимую строку пишу в массив символов - это нормально так делать или стоит переехать на указатели?
> как перехватить стрелочки
> мусор
vt 100 esc sequence
хер знает о чём ты там, <termios.h>. noncanonical.
> использование только функций из страндартной библиотеки
лол, нет)
> И, кстати...
что?
ну так сделай визуалку работать с гцц
>а остальные требуют гцц
А в чем проблема с гцц? Минг же проще ставить, чем гигобайты студии.
> <termios.h>. noncanonical
Ты хочешь сказать что этот хидер неканоничный? Как ни странно, на его включение компилятор под мой контроллер не ругнулся, значит им можно пользоваться. Я попробую.
НО! Посмотрев исходный код fgetc(), я понял, что его вообще не ебёт, что там у меня отображается при вводе, потому что это просто поток символов, который он потом, будучи выполнен несколько раз в цикле, по одному символу проглотит. В таком случае я просто не буду пользоваться стрелками для перемещения каретки - только бекспейс.
> > И, кстати...
> что?
Если не понятно выражаюсь, то здесь я имел в виду, что всё полученное через getchar() я складываю в массив char, чтобы потом использовать. Насколько я знаю, последовательность символов можно строкой записать по указателю. Возможно, я не прав или это совсем аутизм.
>Ты хочешь сказать
>неканоничный
это режим терминала - не каноничный, там ты можешь что хочешь почти. и что такого сложного в этом потоке символов распарсить стрелочки, в esc последовательностях? там делов то, да и есть, наверно, какие-то функции. но стандарт ц тут нипричём.
> то совсем аутизм.
вот ты ещё раз написал, и я снова нихуя не понял.
> Ты хочешь сказать что этот хидер неканоничный? Как ни странно, на его включение компилятор под мой контроллер не ругнулся, значит им можно пользоваться.
Я не понял, ты подключаешь клавиатуру к микроконтроллеру что ли?
Не совсем. Я пользуюсь Serial Wire Debug JTAGом. Это просто последовательный порт для отладки исполняемой программы в мк, который, в том числе, работает... как терминал, ёпта. Всякие там printf'ы блекджек и шлюхи, всё включено.
>>823506
Я не понимаю слово "распарсить". Я просто хочу, чтобы у меня не было пикрилейтед при вводе с клавиатуры, когда я нажимаю стрелочки. Я хочу чтобы каретка двигалась! Мне теперь кажется, что программа что-то должна сообщить терминалу, чтобы он переключился в необходимый режим, который будет обрабатывать стрелочки как указание передвижения каретки, а не как символы и это будет решением.
> вот ты ещё раз написал, и я снова нихуя не понял.
Ну и хрен с ним. Просто надеялся, что мне подскажут другой (возможно, более удобный или правильный) вариант хранения полученных данных из getchar или scanf, кроме как в массиве типа char для дальнейшей обработки.
>кроме как в массиве типа char
ну а как ты себе это представляешь? может, система сома должна под каждую эвалбл порцию данных выделять кусок памяти и на него выдавать указатель? что тебе хочется то?
Хочется сома научиться писать правильный код.
Я слышал про malloc, так что тут можно так и сказать, что она сама лично и будет мне выделять память. И никто иной кроме неё.
Спасибо за терпение и ответы
Там должен быть шаблонный hello world. Посмотри хотябы видеоуроки на ютьюбе же!
>>823588
А, я только сейчас догнал, что в VS ориентирован на С++. Просто создавай проект для C++ и поменяй расширение файла с .cpp на .c
http://www.swarthmore.edu/NatSci/tali/E15/Visual_C.html
> Посмотрев исходный код fgetc(), я понял, что его вообще не ебёт, что там у меня отображается при вводе
Далеко ходишь. Достаточно поискать по pdf-ке стандарта слова типа "консоль" "терминал" или "отображается" (на английском, есс-но), чтобы понять, что C и его стандартная библиотека о таком не знают.
> Вопрос следующий: как перехватить стрелочки, чтобы не выводился мусор типа "^[[D", а каретка перемещалась по вводимой строке?
gnu readline
> gnu readline
Спасибо, конечно, но, мне кажется, я не осилю портировать её на микроконтроллер.
Сейчас читаю про termios.h. Похоже, что это то, что нужно, но трудно даже взять в толк что это вообще такое.
Решил пока ограничиться избеганием нажатия стрелок. Моя поделка вряд ли кому-то ещё понадобится, а я могу и потерпеть это безобразие.
Во за гайд спасибо!
Читаю K&R.
Имею кусок кода:
int c;
while ((c = getchar()) != EOF)
putchar (c);
В таком виде программа читает все символы что я ввожу и выводит все в терминал(xterm). При этом, при нажатии Enter, все что я вводил вставляется в новую строку, а писать я начинаю на третьей.
Если убрать скобки вокруг "c = getchar()", то судя по книге программа должна печатать нули либо единицы, но все что меняется у меня - перестает копироваться все что я ввел в строку на новую, при нажатии Enter. При этом, при нажатии EOF, текст становится нестираемым бэкспейсом и лишь при втором его нажатии программа завершает работу.
Обьясните кто-то что происходит. Вряд-ли это из-за эмулятора терминала. Пробовал Sakura и Urxvt - все так-же.
Издание K&R - третье.
компилятор поменяй
Не для cs50, а вообще, я на будущее скачал, так как сей замечательный курс уже подходит к концу, эх... и нужно отправляться в свободное плавание по морям it океана.
Надо было в следующем году его проходить, будет версия для очков виртуальной реальности.
Деема, ты?
Если ты уберешь скобки то получится
(c = getchar() != EOF) и в этом случае сначала будет выполняться getchar() != EOF, а только после этого c = getchar(), из-за этого так и получается.
Чегооо? Если убрать скобки, у != приоритет выше, поэтому выполнится getchar() значение сравнится с EOF, результат подвыражения будет 0 или 1, это результат запишется в c, результат выражения будет все тот же 0 или 1, и этот результат уже обработает while. Никаких спецэффектов быть не должно, проблема, скорее всего, в терминале.
В оригинале смотрю. Вообще лучше в оригинале смотреть хотя бы с сабами, да и без sections будет сложно под конец.
>Если убрать скобки вокруг "c = getchar()", то судя по книге программа должна печатать нули либо единицы
лол, нет. она будет печатать символы с кодом 1, а потом когда будет 0, цикл завершится
я знаю английский на уровне прочитать какую-нибудь книгу по программированию, иногда заглядывая в словарь. а в cs50 субтитры идут очень быстро и я не могу сразу прочитать и понять
Ну тогда норм, хотя бы задачники в оригинале читай. Перевод от джаварашей в принципе норм, сам первые видео так смотрел, а потом они начали выпускать раз в 2 недели блин.
Почти ничего не потеряешь, если устраивает линуксячий софт - radare2 очень даже норм. А компилятор виндовый иногда пригодится (ну там, посмотреть, как он что-нибудь кодогенерит) - рипни его из студии (у них где-то build tools даже отдельно релизились недавно). Чаще всего вайна будет вполне достаточно, но какую-нибудь хитровыебанную защиту без реальной винды ты не снимешь.
Ничего. Пиши хороший код и не мешай компилятору. Ну криса касперски почитай, ничего особо не поменялось с тех пор.
Выставляй static где можно, inline где нужно, не объявляй переменные с типом меньше int если тебе похуй на переполнение и т.п. А вообще, оптимизация - дело мутное и всё придет с опытом.
какое охуенно выражение!теперь всегда буду его использовать
Вот в том то и проблема!
Я каким-то чудом скомпилил либу без OpenSSL, ну а для компиляции с ссл просто нету нужных заголовочных файлов (я тщательно искал на сайте OpenSSL, там только новые версии)
Поешь говна
Это что блять за петух тут раскукарекался?
И это https://curl.haxx.se/docs/install.html читал?
>(я тщательно искал на сайте OpenSSL, там только новые версии)
Нихуя не понял. Новые версии чего? OpenSSL?
https://github.com/openssl/openssl/releases
>И это https://curl.haxx.se/docs/install.html читал?
Естественно.
А вот на гитхабе не шарил.
>Нихуя не понял. Новые версии чего? OpenSSL?
Да. В своих поисках я случайно где-то наткнулся на туториал по компиляции, там кажется нужна была версия 1.0.1d или что-то такое. Полез на сайт, не нашёл нужной версии (1.0.2h скачал, хули), и обосрался при компиляции.
Чужие исходники почитай. Вот, например, первый попавшийся из гугла: https://sourceforge.net/p/virtualaudiopip/virtualaudiopip/ci/c775b372412f6d306d96e09b460593696ebe1927/tree/Virtual Audio Pipeline/adapter.cpp
хомяки, посоветуйте, пожалуйста, книгу по сишке, где автор не синтаксис неофитам разжевывает, а подробно рассказывает о особенностях
Удвою, закончил cs50 сишную часть и понял, что не хочу этот язык забрасывать, что дальше читать/учить и чтобы с интересными задачами.
>Object-oriented Programming with ANSI-C (Free PDF) - Axel-Tobias Schreiner
А разве в си есть ООП?
Этот прав.
Понял
Завтра ищешь книгу дайв инту си.
Не страдай хернёй и используй стандартные реализации управление контроллером типа FreeModBus. Если функционала будет нехватать - просто расширь список выполняемых команд.
>>826599
Я то не всю хочу портировать, а только малую часть, вроде векторов, map, и прочих контейнеров.
Все равно основа - шаблоны, а шаблоны в сишечке достижимы только через #define T int #include "mymap.h" #undef T и прочие подобные извращения.
https://blogs.msdn.microsoft.com/vcblog/2016/03/31/cc-extension-for-visual-studio-code/
http://bydlokoder.ru/index.php?p=books_WinAPI
> VS Code
Все равно надо mingw/cygwin использовать для конпеляции и отладки под виндой, так что пока НИНУЖНО.
делают двумя способами:
на *void, но как следствие полностью выключает контроль типов, зато можно передавать через границы бинарных модулей
второй способ - на макросах, это сохранит типизацию, но через бинарные модули уже не перекинуть будет
дополнительно можно сэмулировать variant на структурах и объединениях, минус - типы будут изначально ограничены теми, что есть в variant
еще способ - запилить компонентую инфраструктуру типа com или gobject и поверх этого уже делать обобщенные структуры и алгоритмы
я сегодня весь день аутировал в спеки, поэтому нихуя не понял о чем ты
серьёзно, ты пытаешься устроить срач иде против редакторов в си треде?
Ну, именно весь их функционал никто и не использует в 99% случаев. Автодополнение и базовая навигация прикручиваются куда угодно на раз-два (а в сишке большего и не надо при всём желании, разве что дебаггер, который тоже прикручивается), и студию с её 10+ гигами в самой базовой конфигурации и говном размазанным по всей системе ради этого тащить явно не нужно.
Рефакторинг? Охуенный отладчик и профилировщик? Инкрементальная конпеляция? Edit & Continue? Без этого всего можно жить, но с этим жить приятнее.
>Рефакторинг
после встроенного в иде рефакторинга, получаешь неработоспособное говно, особенно с макросами
>Охуенный отладчик и профилировщик
юзают внешние тулзы
могу сказать, что большего говна чем VS я еще не видел, даже clion не таким уебищем кажется.
>Рефакторинг?
Есть в clang-analyzere, как и автокомплит и навигация. Тулзы есть для всех редакторов.
>Охуенный отладчик и профилировщик?
GDB, valgrind
>Инкрементальная конпеляция?
Voobshe ohuet. Даже мейк это умеет.
>Edit & Continue?
Спорная фича, но gdb умеет код патчить в рантайме.
Только винда, 1С и дельфи!
Но он удобный, хорошо, что в cs50 показали эти ништяки, а то думал, что пределами винды нет жизни, а нет, намного круче все сделать через командную строку, вот!
> gdb умеет код патчить в рантайме.
Ох, как же я проиграл.
Алсо, сравнивать GDB с любым отладчиком, у которого есть GUI, просто неприлично. Именно из-за отсутствия нормального отладчика в мире nix люди до сих пор предпочитают отлаживаться printf-ами. GDB хорош только тем, что он есть везде и для всего, ну и ядро отладить еще.
>люди до сих пор предпочитают отлаживаться printf-ами
Логи - это просто в принципе другой способ отладки, который хождение по брейкпойнтам с отладчиком дополняет. От задачи зависит. Где-то удобнее дамп памяти смотреть, где-то сложную динамику работы отслеживать.
>у которого есть GUI, просто неприлично
Гуй для GDB у всех ИДЕ есть, даже у емакса, плюс у самого GDB встроенный текстовый. Да и консольный режим там довольно удобный.
>люди до сих пор предпочитают отлаживаться printf-ами.
Они это делают не из-за того, что с gdb сложно работать, а потому что отладчик - зло, особенно на встраиваемом железе.
rt = NewRuntime(1024L);
cx =NewContext(rt, 8192);
как перевести runtime? контекст выполнения это понятно, но рантайм?
з.ы. как 'окружение'?
Дергаю спайдерманки за яйцы, просто JS может ввести в заблуждение
> Классика от Отцов:
В чём профит давать ссылку на кривой скан? У меня даже пекарня тормозит при открытии. Неужели в сети нет пдфа с нормальным форматированием?
AVR Studio или Bascom-AVR?
Профит в том, чтобы лишний раз послушать нытье
Мне это в атмегу залить нужно
Нихуя не нужно менять, пдфка - действительно кривой скан, который нужно заменить, в интернетах легко найти нормальную версию.
Дай ссылку тогда. И удостоверься, что это не одна из многих криво распозанных версий, где l/i/1 перепутаны и некоторых ; нет.
Ну скан-то действительно кривой, но если у него вьювер тупит на том, что без проблем жует суматра на 800Mhz целероне, это повод задуматься.
Лень искать, скину книгу в тред когда приду домой. Ну а ты пока проверь вот это http://www.cypress.com/file/56651/download, у меня вроде такая же. Охуенно, книга лежит на официальном сайте Cypress. Это вообще законно?
Во-первых, в ОП-посте тоже английская версия, но в хуевом качестве. Во-вторых, не советую быть тупорылым сишником, который не может в английский ибо это - очень печально.
> захотел перекатиться на полноценную ide, скачал visual studio 2015
https://connect.microsoft.com/VisualStudio/feedback/details/506745/visual-studio-2008-c-fatal-error-c1020-unexpected-endif всё, что нужно знать про "полноценную" ide
Ну баг, ну добавят диагностику слегка более вменяемую. Это прекомпилированные заголовки - костыль, который создает множество странных проблем и имеет множество ограничений. Ничего удивительного, что если ты хочешь странного и получаешь странное поведение.
Нихуя не поменялось, инфа 100%
Это же Microsoft, там обратная совместимость на первом месте. В том числе и по багам.
Вот объясните мне, нахуя нужны в линуксе статические библиотеки? В каких слуаях вообще они используются, если приемущества только у динаических? В инете толком про них не пишут.
Возможно, нубский вопрос. Сегодня начал красноглазить, можете прописчать обряд посвящения.
Можешь грузить статически слинкованные бинарники если ФС с [/usr]/lib не подмонтирована.
Впрочем, от этого давно отказались.
закрытый коммерческий код распространяется не только динамически подключаемыми библиотеками, но и статическими библиотеками
и они в том числе
Не нужно срать в треде бампами и однотипными постами, пожалуйста.
В книге с оппоста такое упражнение. Упражнение 1.16. Перепишите main предыдущей программы так, чтобы она могла печатать самую длинную строку без каких-либо ограничений на её размер. Предыдущая программа из книги: http://ideone.com/wI6z53. Помогите анончики, я озадачен. Пробовал маллоки\риаллоки - ничего не выходит.
>>828458
не сейванул
#include <stdio.h>
#include <stdlib.h>
/ run this program using the console pauser or add your own getch, system("pause") or input loop /
#define SIZE 100
int getline(char s[], int lim){
int c, i;
for(i = 0; i < lim-1 && (c=getchar())!=EOF && c != '\n'; i++){
s=c;
}
if(c=='\n'){
s=c;
++i;
}
s='\0';
return i;
}
void copy(char to[], char from[]){
int i =0;
while((to=from)!='\0') ++i;
}
int main(){
int len;
int max;
char line[SIZE];
char longest[SIZE];
max = 0;
while((len = getline(line, SIZE)) > 0){
if(len > max) {
max = len;
copy(longest, line);
}
}
if(max > 0)
printf("%s", longest);
return 0;
}
>>828458
не сейванул
#include <stdio.h>
#include <stdlib.h>
/ run this program using the console pauser or add your own getch, system("pause") or input loop /
#define SIZE 100
int getline(char s[], int lim){
int c, i;
for(i = 0; i < lim-1 && (c=getchar())!=EOF && c != '\n'; i++){
s=c;
}
if(c=='\n'){
s=c;
++i;
}
s='\0';
return i;
}
void copy(char to[], char from[]){
int i =0;
while((to=from)!='\0') ++i;
}
int main(){
int len;
int max;
char line[SIZE];
char longest[SIZE];
max = 0;
while((len = getline(line, SIZE)) > 0){
if(len > max) {
max = len;
copy(longest, line);
}
}
if(max > 0)
printf("%s", longest);
return 0;
}
На джаве разработку вести гораздо быстрее и легче, чем на С или C++, и это привлекает множество неосиляторов в разработку на этой платформе.
В оригинале это упражнение гласит так:
> Revise the main routine of the longest-line program so it will correctly print the
length of arbitrary long input lines, and as much as possible of the text.
Т.е вроде как надо напечатать ТОЛЬКО ДЛИНУ самой большой строки, а не саму строку
Мог бы и объяснить ньюфагу. Если лень, хотя б скажи где читать.
Есть большой проект, и есть идея немного его ускорить, но с чего начинать хз. Может есть какие-то виртуалочки или профайлеры которые смогли бы оценить что в первую очередь требует мув операций?
hexdump
Как ты это реализовывать собрался? Там же предполагается, что читатель еще не знает ни про указатели, ни про realloc
Печатать надо length, а текста столько, сколько получится. Звать getline() в цикле, пока введенная строка не закончится на \n (т.е., не будет введена полностью), длины полученных в этом цикле строк складывать, первый кусок хранить. Никаких маллоков и указателей не нужно при такой постановке задания.
Нет. По умолчанию оно обычно как-то так и выравнивается, но лучше посмотреть, как в твоем компиляторе указывается выравнивание и указать его явно.
просто ещё не сделали лучше. ос на мобилки совсем недавно завезли. впрочем нахуй они нужны сейчас - хер знает. наверное, так на остаточном и двигаются.
чтож, впендюрю _Static_assert . вообще, про компоновку структур в какой главе?
> про компоновку структур в какой главе?
По всему стандарту размазано, как обычно. Но вообще, 6.2.6 (Representation of types) и 6.7.2 (Type specifiers).
Алсо, _Static_assert не стоит использовать (как и _Bool, _Complex, _Noreturn и прочие новые имена). Их сделали такими только затем, чтобы не сломать чей-нибудь код своими нововведениями. Подключай <assert.h> и используй нормальный static_assert.
>6.2.6 (Representation of types)
ебанутая конечно глава, не знал что с99 такой битодрочерский.
http://wischner.blogspot.ru/2014/06/so-you-wanna-be-zx-spectrum-developer.html
http://wischner.blogspot.ru/2014/06/so-you-wanna-be-zx-spectrum-developer_15.html
Вопрос по FASM.
Возможно ли более адекватно переместить число с плавающей точкой из [var1] в [var2]? Вот мой говнокод:
fld [var1]
fstp [var2]
Почему так? Как задать нестандартную точку входа, чтобы оставить место ниже?
>>829707
Разобрался.
Блять, как сделать исполняемый файл не 7 кб, а 1.5? Оптимизатор настроил на уменьшение размера, отключил исключения, смержил секции данных, отключил манифест и стэк канарис, отключил дебаг инфо и убрал релоки.
Как еще можно выебать бинарник?
Делал под шиндошсом в mingw, но у красноглазиков может тоже скомпилиться.
У кого запустится/не запустится - отпишитесь.
Вишмастеров нету, бля буду.
http://rgho.st/64H2jkvBg
За музыку лойс
от сборки остались же
крестобляди как есть - сами создают себе проблемы а потом героически их преодолевают посредством темплейтной магии, подключения буста и прочей блевоты
Одинарную точность можно вообще таскать обычным mov через обычные регистры. Двойную тоже можно, но уже возникает вопрос, нахуя.
>>829709
Рантайм статический? Возьми дизасм и посмотри, чего там компилятор напихал.
>Рантайм статический?
Отключил его. Кстати, если я убрал CRT, и сишные библиотеки теперь не инициализаруются при запуске программы, можно ли использовать функции стандартной библиотеки си, или без рантайма можно использовать только WIN API, в котором и так все нужное есть?
> можно ли использовать функции стандартной библиотеки си
Как ты сам сказал, они не инициализируются, поэтому не стоит. Если очень хочется, можно сходить в дизасм и исходники CRT и посмотреть, чему нужна инициализация, а чем нет. Но зачем тебе вообще этот дроч на размер?
>CRT и посмотреть, чему нужна инициализация
а чего там инициализируется то? хотя-бы примерно.
и понятно, это же по идее, зависит от реализации, как и что будет инициализироваться, и что вы там собрались вручную делать тогда?
Куча, локаль (ctype, в частности), stdint/stdout/stderr, tls.
> зависит от реализации
Да, даже от конкретной версии библиотеки. Но можно проверить, например, что memcpy не требует (или требует, например, если копирует через SSE) инициализации.
> что вы там собрались вручную делать тогда
Я вообще не понимаю, нахуя анону это нужно. Бинарники до метра даже для хелловорлда норм.
может он хочет максимально минимализировать чтобы выиграть в спец олимпиаде, но тогда, наверно, нужно основу написать на ассемблере, а остальное линковать из ц/чегоещё. или как?
reverse(char str[], int size){
int right = size - 2;
int left;
int el;
for(left = 0; left != right || left + 1 != right; right--, left++){
el = str[left];
str[left] = str[right];
str[right] = el;
}
str[size+1]='\0';
printf("%s", str);
}
int
main(void){
char string[100];
int stream, index = 0;
while((stream = getchar())!=EOF){
if(stream == '\n') {
string[index++] = stream;
break;
}
string[index] = stream;
index++;
}
reverse(string, index);
return 0;
}
возникает ошибка при любом вводе в строчке el = str[left]; разобраться в чем проблема не могу уже 2-й час. когда дебажу выдает sigsegv, то есть я обращаюсь к несуществующему месту.
reverse(char str[], int size){
int right = size - 2;
int left;
int el;
for(left = 0; left != right || left + 1 != right; right--, left++){
el = str[left];
str[left] = str[right];
str[right] = el;
}
str[size+1]='\0';
printf("%s", str);
}
int
main(void){
char string[100];
int stream, index = 0;
while((stream = getchar())!=EOF){
if(stream == '\n') {
string[index++] = stream;
break;
}
string[index] = stream;
index++;
}
reverse(string, index);
return 0;
}
возникает ошибка при любом вводе в строчке el = str[left]; разобраться в чем проблема не могу уже 2-й час. когда дебажу выдает sigsegv, то есть я обращаюсь к несуществующему месту.
>Есть ли смысл постигать ASM с более игрушечных архитектур, а не с 32битой
как появится время, очень хочу вкатится в arm, купить миникампутер за $10 и исследовать эту божественную архитектуру с запилом своей ос. x86 считаю сраным уебищем не достойным благородного дона.
>Есть ли смысл постигать ASM с более игрушечных архитектур, а не с 32битой?
Его и есть смысл постигать ТОЛЬКО для игрушечных архитектур если ты не собираешься заниматься реверс инжинирингом или ковыряться в ведре.
Ядро любой ОС да и там в большинстве случаев тебе редко нужно будет что-либо писать на ассемблере, но его знания все-равно не помешают.
А, понятно
До первой отсутствующей библиотеки, наверное.
Мама, смотри скорее? я драйвер к своей Ардуино-машинке написал в свои 30 лет, теперь я крутой кулцхакер, божешь ты мой.
Ладно хоть среди вас нет мудаков, которые учат АСМ и Аду.
Через 5 лет, когда Линус уйдёт из проекта, Linux перепишут на плюсах.
>Я вообще не понимаю, нахуя анону это нужно
>маленький размер
>win api
Кажется, я догадался, чего хочет тот анон. Поесть говна
Благородный дон может интересоваться арм как хобби, это и вправду интересно, никто благородному дону препон чинить не будет
Ну тогда мне он не особо нужен. Хотя я с прицелом как раз на RE и ковыряние, и видел сайт CTF подобный, где играешься с MIPS архитектурой
> left != right || left + 1 != right
Попробуй прогнать свой цикл в уме на строке из двух символов тебе нужно было всего лишь сказать left < right.
как хобби и как большие перспективы, теже смартфоны например, да что уж, весь эмбедед. запил мобильной ос под опен мобил пхоне, а? а? этоже охуенчик.
теперь ты можешь уходить
>да что уж, весь эмбедед.
Смею тебя разочаровать, но с ассемблером сейчас ебутся только упоротые пердуинщики и бородатые дядьки на проектах 30-летней давности.
я бородатый дядька и я хочу ебаться с асмом на арм, не. ну как ебаться, в пределах ядра ос, не более.
это не читал, но прата ахуенен
Там условие продолжение цикла, а не прекращения.
Да, ты прав. И в сфере ИБ опять же есть что ловить
Покупай, мне очень понравилась книга
Для чего здесь union? Выглядит так, как будто PhysicalAddress и VirtualSize - два отдельных поля с разными значениями, к которым можно обращаться, но union работает как на пикче: то есть одни и те же данные могут интерпретироваться как char или как int.
Ты не про андроид говоришь? Ардуино же это просто микроконтроллер с приблудами
ну дя, там полноценный линух стоит
Не обращай внимания, особенности спеки. Вариант .Misc.PhysicalAddr не используется, и в 100% случаев тебя будет интересовать .Misc.VirtualSize.
тянучки нинужны
sudo cat /dev/null > *
ю кэн ду зис айзер виз йо арм ор виз йо герл
В mingw он точно есть, насчёт остального не ебу.
char params[11];
Так работает:
char buffer2;
buffer2 = (mode & 0x100) ? "r" : "-";
param[0] = buffer2;
но так нет:
param[0] = (char*)((mode & 0x100) ? "r" : "-");
т.е. работает через буфер, но как сделать чтобы его не было?
звездочки пропали заменю на "@".
char params[11];
Так работает:
char @buffer2;
buffer2 = (mode & 0x100) ? "r" : "-";
param[0] = @buffer2;
но так нет:
param[0] = (char@)((mode & 0x100) ? "r" : "-");
т.е. работает через буфер, но как сделать чтобы его не было?
Оно не должно работать в обоих случаях. Ты пишешь младший байт адреса строки в param[0], это вряд ли то, чего ты хочешь. Алсо, компилируй с -Wall /W2 или как там у тебя предупреждения включаются, тогда компилятор сразу пояснит тебе, что ты не прав.
Именно так и должно работать. 'r' - один char, содержащий код символа r. "r" - адрес массива символов, и сработать такое могло лишь случайно (ну или разве что вот так *((mode & 0x100) ? "r" : "-")).
Теперь понял разницу. Спасибо.
Хочу скопировать один массив в другой но на выходе получаю херню.
Что я делаю не так?
http://ideone.com/wCjW9s
У тебя len 3, значит он копирует только 3 байта. Нужно 12
Есть вопрос.
Функция выводит херню из списка (в задании, сказано, есть ошибка):
char ✱item_data(const list_t ✱list)
{
char buf[12];
sprintf(buf, "%d", list->data);
return buf;
}
Почитал инет, там советуют:
http://stackoverflow.com/questions/12380758/c-error-function-returns-address-of-local-variable
Т.е. для Buf выделить память.
char buf = malloc (sizeof (char) 12);
Дальше там говорится как только не нужна buf - выполни free().
>Also note that, it is a good practice that after you have done with the allocated memory block, free it to save from memory leaks. Once you free the memory, you can't access that block again.
А как его очистить-то если я ушел уже оттуда? И где-то посреди кода возвратил пару раз item_data?
Так это вызывающий должен делать free, не ты. То есть, он зделол data = item_data(somelist); do_something_with(data); ну и делает free(data) потом, когда data ему больше не нужно. Можешь free() обернуть в какое-нибудь item_data_free(), это во-первых, избавит пользователя от раздумий, как очищать (и надо ли), во-вторых, позволит перекатиться с дефолтовой кучи на что-то кастомное, а в-третьих, позволит тебе делать какую-нибудь очистку, если data - не просто массив байтов, а какая-нибудь сложная структура.
Я выкинул CRT и уменьшил бинарник до 1.5 кб. Главный файл выглядит так: https://ideone.com/gKkKLF
Функции memset и memcpy определены в win32_crt_memory.h. Этот файл подключен в хедере pe_inject.h. Хедер pe_inject.h подключен в main.cpp. Я получил ошибку:
pe_inject.obj : error LNK2005: _memcpy already defined in main.obj
1>pe_inject.obj : error LNK2005: _memset already defined in main.obj
1>fatal error LNK1169: one or more multiply defined symbols found
В чем тут проблема? Почему функции УЖЕ ОПРЕДЕЛЕНЫ, если я использовал #pragma once или хедер гвард?
Ну, извините, задание такое дали.
typedef struct list_s
{
struct list_s✱ next;
int data;
} list_t;
Вот этот мужик еще рассказывает почему так надо делать.
https://www.youtube.com/watch?v=XmuZ_U_GLYY
Ну, или объясни ты, почему так нельзя?
А то 1000 мнений вокруг и все правильные.
Вот смотри, по поводу free.
вот я сделал функцию, например.
char ✱item_data(const list_t ✱list)
{
char ✱buf = malloc (sizeof (char) ✱ 12);
sprintf(buf, "%d", list->data);
return buf;
}
как мне сделать так чтобы она и возвращала, и очищалась?
Я вот этого не пойму.
Ну пример я возвратил, да? Т.е. ложить(или класть, хз) в переменную и вместе с переменной его free?
Т.е. на живом примере:
char✱ data = item_data(head);
printf("text %s \r\n\r\n", data);
free(data);
Это и всё?
Ну, извините, задание такое дали.
typedef struct list_s
{
struct list_s✱ next;
int data;
} list_t;
Вот этот мужик еще рассказывает почему так надо делать.
https://www.youtube.com/watch?v=XmuZ_U_GLYY
Ну, или объясни ты, почему так нельзя?
А то 1000 мнений вокруг и все правильные.
Вот смотри, по поводу free.
вот я сделал функцию, например.
char ✱item_data(const list_t ✱list)
{
char ✱buf = malloc (sizeof (char) ✱ 12);
sprintf(buf, "%d", list->data);
return buf;
}
как мне сделать так чтобы она и возвращала, и очищалась?
Я вот этого не пойму.
Ну пример я возвратил, да? Т.е. ложить(или класть, хз) в переменную и вместе с переменной его free?
Т.е. на живом примере:
char✱ data = item_data(head);
printf("text %s \r\n\r\n", data);
free(data);
Это и всё?
> Ну, или объясни ты, почему так нельзя?
Потому что _t зарезервированный суффикс в POSIX, но на это похуй. А на что не похуй, так это на то, что: 1) есть IDE, которые тебе и так скажут, чем является идентификатор; 2) переменную от типа можно отличить по контексту, нет смысла повторять это в имени (посмотри сюда http://ideone.com/u7ifNQ ).
> как мне сделать так чтобы она и возвращала, и очищалась?
Вот у тебя в конце поста все правильно сделано.
>>831626
Покажи, как компилируешь и линкуешь?
> Ну, или объясни ты, почему так нельзя?
всё можно, всегда так делаю.
> Это и всё?
ну вариантов есть несколько, или вот так, по кривому, или передавать уже выделенную тобой память в функцию, и тут 2 варианта, если размер не высчитывается до рантайма: сделать функцию которая вернёт необходимое число памяти, либо передавать указатель на память вместе с размером, и если в функции не хватит - возвратить ошибку.
>Покажи, как компилируешь и линкуешь?
Блять, из какого файла проекта выдирать эти опции? Ладно, перечислю, что я настроил:
Оптимизация: O1
Code generation:
Отключены исключения C++
Security Check: disable
Линкер:
Отключил манифест
Отключил дебаг инфо
Точка входа WinMain
Randomize Base Address выключил
Конфиг
https://ideone.com/Jq0W1w
Если это студия, там в свойствах проекта можно командную строку результирующую посмотреть. Где nodefaultlib (/Zl) у компилятора? Где выключенный инлайн (/Ob0 вроде)? И оптимизации временно выключи.
>>831631
Говорите оба полные противоположности друг другу, но ладно, всё приму к сведению, и буду искать лучший вариант. Спасибо!
Не заметил проект. Вот <IntrinsicFunctions>true</IntrinsicFunctions> еще.
>противоположности друг другу
нет. просто в твоём варианте меньше гибкости, ведь если ты передаёшь память, то она может быть много чем и где угодно, и даже тупо, можно переиспользовать.
Он про суффиксы у типов, наверное. А что касается item_data - да, тут >>831633 ты все правильно расписал.
> или передавать уже выделенную тобой память в функцию,
Т.е. если я передам выделенную память в функцию, как же её тогда потом очистить, например я напрямую передал в printf? Или нужно сделать функцию с printf и в ней же в конце по указателю выполнять free?
Я правильно понимаю что если был выполнен malloc, то дальше для высвобождения памяти используется только free, "само" ничего не будет?
>Он про суффиксы у типов, наверное.
Да, про них в большей степени, но и как бы ты говоришь что "так правильно", а он говорит "вариант кривой".
>Где nodefaultlib (/Zl) у компилятора? Где выключенный инлайн (/Ob0 вроде)? И оптимизации временно выключи
Сделал.
>Вот<IntrinsicFunctions>true</IntrinsicFunctions> еще
Выставил false. Ошибка та же самая.
https://ideone.com/12zlSO
А, так у тебя два файла: main.cpp и pe_inject.cpp #pragma once влияет на тот файл, куда подключен хедер (т.е., хедер #include-ится не более одного раза). Твои два .cpp компилируются в два .obj, и из обоих торчат одинаковые функции. Линкер про препроцессор и #pragma once не знает вообще ничего. Сделай функции static (inline?), или вынеси в mylib.cpp, а в хедере оставь только декларации.
>>831655
Кривой вариант - это он про выделение памяти в функции. То есть, можно:
char ✱item_data(const list_t ✱list)
{
char ✱buf = malloc (sizeof(char) ✱ 12);
sprintf(buf, "%d", list->data);
return buf;
}
char ✱data = item_data(list);
printf("%s\n", data);
free(data);
а можно
void item_data(const list_t ✱list, char ✱dest, size_t length)
{
snprintf(dest, length, "%d", list->data);
}
char buffer[12];
item_data(list, buffer, sizeof(buffer));
printf("%s\n", buffer);
Второй вариант более гибкий, и позволяет, например, не дергать кучу по пустякам. А вот если ты не знаешь, какое максимальное количество данных item_data может вернуть, или это количество очень сильно варьируется, то можно использовать первый вариант с выделением памяти из кучи внутри функции item_data.
А, так у тебя два файла: main.cpp и pe_inject.cpp #pragma once влияет на тот файл, куда подключен хедер (т.е., хедер #include-ится не более одного раза). Твои два .cpp компилируются в два .obj, и из обоих торчат одинаковые функции. Линкер про препроцессор и #pragma once не знает вообще ничего. Сделай функции static (inline?), или вынеси в mylib.cpp, а в хедере оставь только декларации.
>>831655
Кривой вариант - это он про выделение памяти в функции. То есть, можно:
char ✱item_data(const list_t ✱list)
{
char ✱buf = malloc (sizeof(char) ✱ 12);
sprintf(buf, "%d", list->data);
return buf;
}
char ✱data = item_data(list);
printf("%s\n", data);
free(data);
а можно
void item_data(const list_t ✱list, char ✱dest, size_t length)
{
snprintf(dest, length, "%d", list->data);
}
char buffer[12];
item_data(list, buffer, sizeof(buffer));
printf("%s\n", buffer);
Второй вариант более гибкий, и позволяет, например, не дергать кучу по пустякам. А вот если ты не знаешь, какое максимальное количество данных item_data может вернуть, или это количество очень сильно варьируется, то можно использовать первый вариант с выделением памяти из кучи внутри функции item_data.
Понял, спасибо за подробное разъяснение!
void remove_next_from_list(list_t item) {
list_t tempList = item->next; //создаем промежуточное звено
if (item->next) { //если есть следующий элемент
item->next = item->next->next; //замещаем
free(tempList); //старый удаляем
}
}
было так:
void remove_next_from_list(list_t *item) {
if (item->next) {
free(item->next);
item->next = item->next->next;
}
}
Опять я пришел со своими списками, подскажите, правильно ли я делаю?
void remove_next_from_list(list_t ✱item) {
list_t ✱tempList = item->next; //создаем промежуточное звено
if (item->next) { //если есть следующий элемент
item->next = item->next->next; //замещаем
free(tempList); //старый удаляем
}
}
было так:
void remove_next_from_list(list_t ✱item) {
if (item->next) {
free(item->next);
item->next = item->next->next;
}
}
Блин, забываю про эти звездочки.
Все правильно, только ты не создаешь промежуточное звено, а просто запоминаешь указатель на удаляемый элемент.
Понял, спасибо.
Во-первых, для сишечки тоже можно читать по твоей ссылке (stdio.h -> cstdio и т. п.). Во-вторых, есть всякие dash и zeal, хоть там и нет примеров.
strings.h жеж
#if defined(_WIN32) || defined(_WIN64)
#define snprintf _snprintf
#define vsnprintf _vsnprintf
#define strcasecmp _stricmp
#define strncasecmp _strnicmp
#endif
> у мелкопидоров как всегда
Что, серьезно? Пидоры! Насколько я помню, их _snprintf отличается поведением! Это в какой версии так? Затести, пожалуйста, вот это: http://ideone.com/mmzxxF
>Насколько я помню, их _snprintf отличается поведением
это был тогда не микрософт, если бы не отличался поведением. у них там свой мир, кек
Этот путь явно описан в стандарте: негоже компилятору засорять своими именами стандартные хедеры. А вот с префиксом _ можно. И даже >>832987 гцц, если его попросить работать по стандарту, без GNU-говна, знает про это.
По-моему, многопоточность это какая-то хуита, если только каждый тред не выполняется отдельным ядром. Если это не так, треды будут просто отрабатываться по мере их выталкивания из системной очереди со скоростью работы однопоточного приложения.
давай еще вЕрбЛюдОсТайЛ потащим в стандартную либу
readdir и прочие из POSIX, но как видишь у мелкопидоров свой путь.
> без CRT при помощи функций сишкой библиотеки
Поделил на ноль.
> многопоточность это какая-то хуита, если только каждый тред не выполняется отдельным ядром
Один тред может ожидать IO. В это время другой может обрабатывать данные.
Как эта функция работает? Если возвращается BOOL, то как можно различать ненулевые значения? У меня сравнение с ERROR_NO_MORE_FILES вообще выдает ошибку "несовместимый тип".
Return value
If the function succeeds, the return value is nonzero and the lpFindFileData parameter contains information about the next file or directory found.
If the function fails, the return value is zero and the contents of lpFindFileData are indeterminate. To get extended error information, call the GetLastError function.
If the function fails because no more matching files can be found, the GetLastError function returns ERROR_NO_MORE_FILES.
>Если возвращается BOOL, то как можно различать ненулевые значения?
Ненужно различать, всё, что не ноль — истина.
> У меня сравнение с ERROR_NO_MORE_FILES вообще выдает ошибку "несовместимый тип".
Потому что ERROR_NO_MORE_FILES возвращает функция GetLastError()
Забей на ERROR_NO_MORE_FILES. Тебе ли не похуй, почему оно тебе не хочет больше файлов выдавать?
Ну вот смотри, у тебя есть примерно такой текст: http://ideone.com/jkT4kG, в нем текст отформатирован пробелами. Твоя задача - "сжать" его таким образом, чтобы он занимал меньше байтов, но выглядел точно так же. Т.е., второе слово в первой строке начинается в позиции 9 (считая с 1), и, если ширина одного символа табуляции = 8, то четыре пробела вторым словом можно заменить на один '\t'. И так далее. Ищешь табстопы, втыкаешь табы. Печатать надо сначала входной текст, а потом получившийся текст, чтобы убедиться, что они выглядят абсолютно идентично. Ну и счетчик сэкономленных байтиков заведи до кучи.
Это учебное задание, хотя во времена DOS некоторые такое извращение практиковали.
похоже на задание из рассейского вузика, такое же ебануто-беспощадное. автор то и не знает, что таб может и как 1500 пробелов отображаться
>автор то и не знает, что таб может и как 1500 пробелов отображаться
Автор знает. А вот ты ещё читать не научился, а уже тявкаешь тут.
> А вот ты ещё читать не научился
ну так и переведи с пидерскопреподского на нормальный, че там афтор хочет то? с примером желательно.
Что такое "стопы табуляции" тебе не ясно? Тогда пойди погугли и больше не выебывайся с тупыми вопросами.
иди сам гугли, мне задачки для пидеров нинужны
Как можно эффективно проверить, что файл имеет расширение из списка, не итерируя по списку расширений? Пердолить на чистом си хэш-таблицу?
>Как можно эффективно проверить, что файл имеет расширение из списка, не итерируя по списку расширений?
И еще вопрос. Мне нужно копировать текущий файл в файл с таким же именем, к которому добавлено расширение .tmp. Как это сделать эффективно?
Сначала я хотел поступить так: запоминаю указатель на нулевой завершающий байт и делаю lstrcat(file, ".tmp"), создаю файл с новым именем функцией CreateFile и копирую в него данные. После этого по указателю на нулевой байт присваиваю 0 и отсекаю расширение .tmp. Далее удаляю исходный файл и переименовываю новым.
Но потом я нагуглил CopyFile, которая требует два символьных пути к файлам. Так что трикс с запоминаем указателя на терминирующий нуль для экономии памяти стека тут бесполезен. Придется объявлять дополнительный массив для нового имени.
При обходе дерева каталогов переполнения стека из-за этого не будет? Как сделать эти операции эффективнее? В том числе хочу сократить время на работу со строками. Мне нужно OCHE БЫСТРО.
Есть
Внезапно, WriteFile(..., &твойхэш, sizeof(твойхэш), ...). Надеюсь, ты не тот пидор, который пилит криптор.
Почему в ОП-посте нет ссылки на скачивание?
В гугле только всякую парашу нахожу
Сорян, я новичок тут просто
Буду благодарен если кинете ссылку на Си
Двачую.
Аноны а почему в C нет for ( var n in array )?
В плюсах вроде тоже нет, хотя там оно как раз еще больше нужно.
Если хочу работать с целым массивом то удобно и можно так реализовать чтобы меньше циклов тратило.
Bash
Какая у вас графическая оболочка?
В с++ треде много шиндовс-рабов, без понятия как там работать можно, композитный оконный менеджер, куча дерьма в автозагрузке, нет нормальной консоли, нет по людски сделаного софта, только хуйня с кнопкой 'сделать заебись', нет мануалов, нихера нет.
Много кому и графическая оболочка то ненужна, только tmux, в GNU/Linux сейчас уже избавились от старого дисплей сервера - Xorg, заменили на Wayland display server protocol.
Новые тайловые и композитные менеджеры теперь очень легкие, используется простой API, какая-нибудь графическая библиотека и ничего лишнего.
Но смущает что на него не очень то быстро переходят, уже около 20 разных графических оболочек создано, но над многими работа идет весьма медлено.
Вы тайлами пользуетесь или чем?
Мне DWM нравился, но устарел, сейчас на Weston, надо на Velox перекатится.
Вы код только для работы пишете?
Ну конечно, там много способов использования, а в сишке кроме массивов где подобный функционал пригодится?
Ну конечно, как же Я не догадался, пишете на кастрированом языке в кастрированой ос, заодно помогая господину и гебне
Зачем ты такой фанатик?
А что ты реверсишь? Надо бы nouveau до нормального состояния довести, чтобы OpenCL было, чтобы Vulcan, OpenGL 4.5 был.
Блоб там гиганский, говнокода и легаси дохуище, если все лишнее убрать то опенсорцный драйвер будет быстрее чем в шиндовсе, ибо майкрсофт платит чтобы в GNU/Linux были плохие дрова
>В какой ОС вы работаете?
Oracle Linux.
>Мне DWM нравился, но устарел
Пользуюсь патченным dwm, tmux + vim/emacs, брат жив зависимость есть. Из реально графических приложений (тех, что нельзя запустить в консоли), что регулярно юзаю, это лиса, тандербёрд и zathura для чтения pdf.
>Надо бы nouveau до нормального состояния довести, чтобы OpenCL было, чтобы Vulcan, OpenGL 4.5 был
Ниасилю, я еще маленький
Какой же ты манька, скажи еще что майкрсофт, фейсбук и гугл не сотрудничают с правительствами.
ты сначала пруфы притащи, что мелкомягкие платит кому-то (кому?), что в линуксе были плохие дрова (каким образом они должны быть плохими?)
Захура, это же надстройка над mupdf (пожно сам mupdf юзать) или над poppler (это уже чисто библиотека).
У тебя ноутбук?
>кому
nvidia же.
Амуда сама по себе плоховатые дрова делает, и они немного открытые, а интел сама опенсорцные дрова делает.
Ты посмотри на размер дров этих, обосратся можно, пруфоф нет, ибо не имею отношения к этим корпорациям, но это весьма очевидно что что-то не так, раз майкрсофт держит рынок даже после скачивания в говно, а в говно они скотились начиная с семерки.
У меня десктоп. Я без понятия о mudf. Юзаю zathura из-за vim-like key bindings.
У тебя он установлен наверно, пробуй mupdf открыть, он сам по себе не откроется, надо путь к пдф-ке указать.
Windows - survilence engine, tracking OS.
Ну так си только в винде используется поэтому винда и си такое говно, если я не ошибаюсь
GNU/FSF - говнософт по определению.
На энтузиазме нельзя построить действительно хорошую ос и софт.
Тут не в новизне дело, иксы избыточны, устарели уже, новый протокол написан с нуля, заточен под разработку графических приложений в наши дни, ничего лишнего
Размер нельзя, но можно сделать так:
for (int i;arr;i++)
{
}
Но вычисление количества элементов не должно быть реализовано на C, компиляторы на C++ пишутся, можно на асме что угодно реализовать чтобы дополнить синтаксис сишки.
>Ну так си только в винде используется
Что за херню ты несёшь, на C написано 99% софта для UNIX-like OS.
это просто текстовый редактор, типа notepad.
> nano, vim, emacs, gcc
из этого только nano можно использовать, остальное же gnu-софт, т.е параша
ну вот почему gcc лучше того же icc/msvc/clang-llvm? Я например не могу пользоваться компилятором, где очень много говна
vim-emacs - сложно освоить, мне непонравилось, смылса в этом нет, особенно под виндой
>vim
там скорость работы с текстом возрастает в миллиард раз, ты выдно заблудившийся хипстер мышкодрочер
Он мне может обеспечить нормальный рефакторинг, автокомплит без лагов и провисаний с задержкой 3-5 секунд? А профилирование, юнит-тесты? А нормальная поддержка отладчика?
Все это недоступно виму. Поэтому я вставляю зонды в сраку, начинаю сосать хуй у господина, запуская свою любимую VS2015
> скорость работы возрастает
После ESC:%!rm -f `which vim` и установки нормального текстового редактора скорость работы значительно возрастает.
Двачаю бро, однако меня все-же разочаровывает пассивность некоторых программистов, они работают только за бабло, и даже для себя хуй что напишут, или не делают ПО общедоступным, или только бинарь предоставляют, многие делают свои велосипеды вместо того чтобы довести до ума уже готовый.
Дай мне свой айпишник, логины пароли аккаунтов, доступ к вебке микрофону и клавиатуре, адрес тоже давай.
nano и есть GNU- software
Незнаю что ты там имел в виду под 'много говна' но GCC компилирует быстрее, производит более быстрый код.
Одно мне не нравится - он почти стендалоне (но не на нормальной OS - Gentoo тут по умолчанию минимальный необходимый функционал, можно еще меньше сделать, ПО стает очень быстрым и легким)
Ну хуй знает, Я вот зеро был в C, да и сейчас хелловордщик, однако читать код могу, могу править, а с нуля писать хз, Мне хоть бы на что нибудь посмотреть надо.
Чтобы улучшать скилы надо читать много кода, особенно новичкам, без этого никак, благодаря FSF у всех есть такая возможность.
нет конечно, он его неосилил, но советами заебывал
Алсо начал читать ttytanks, по началу нихера не понимал что это, зачем? Но спустя некоторое время путем поправочек, чтения чтения, поправочек, и пулл-реквестов наверно 50-60% кода там мои, еще Я разбил его на большее количество файлов, стало проще ориентироватся, добавил скрипт для прекомпилежки (делает готовые бинари для разных процессоров, они не нуждаются ни в каких либах, будет работать и на BSD и на всяких LFS, роутерОС по идее, где нет библиотек)
И грубо говоря это теперь другая совсем игра, раньше скрин обновлялся целиком, теперь по людски выводит изображение, но артефакты случаются, еще надо пофиксить ввод, ибо он там через wgetch реализован, что полный пиздос, надо напрямую клавиши слушать через evdev или libinput, чтобы скорость игры от терминала не зависела
И как запустить скрипт или кусочек баш кода из Makefile? или может можно в мейкфайле цикл запустить?
(Автор этого поста был предупрежден.)
main()
{
int c;
c = getchar();
while (c != EOF) {
putchar(c);
c = getchar();
}
}
Запускаю.
Пишу в консольку
abc
Нажимаю enter.
Всё ок, выводят abc.
Нажимаю ctrl-d, программа завершается, всё ок.
Теперь запускаю и пишу abc, но enter не нажимаю. Вместо этого сразу нажимаю ctrl-d.
Программа выводит на той же строчке abc.
Если после этого второй раз нажать ctrl-d программа завершается.
Почему первый ctrl-d не завершил программу?
main()
{
int c;
c = getchar();
while (c != EOF) {
putchar(c);
c = getchar();
}
}
Запускаю.
Пишу в консольку
abc
Нажимаю enter.
Всё ок, выводят abc.
Нажимаю ctrl-d, программа завершается, всё ок.
Теперь запускаю и пишу abc, но enter не нажимаю. Вместо этого сразу нажимаю ctrl-d.
Программа выводит на той же строчке abc.
Если после этого второй раз нажать ctrl-d программа завершается.
Почему первый ctrl-d не завершил программу?
Моче не похуй, но она придерживается сдержанной позиции пока что - он ничего серьезного не натворил. Но если будет продолжать доебывать анона и срать в тредах, то запросто можно будет побанить его за говнопостинг.
Какие-то особенности терминала. Он не отдает EOF по Ctrl+D, пока он не на отдельной строке.
sh[] - спижженый шелл, который должен запускать calc.exe на вин XP.
code[] - мой шеллкод, вот его сурс https://ideone.com/dbvsGu
Нихуя не работает. Когда управление передается моему шеллкоду, процессор доходит до вызова WinExec и улетает куда-то в ебени. Как надо писать шеллкоды под win7 и старше? На всех сайтах посоны заверяют, что под win xp работает заебись.
И если этим шеллом заражать бинарники, то тоже программа при выполнении падает. Потом правлю точку входа на оригинальную , обнуляю байты шеллкода, и зараженная программа продолжает работать как раньше.
Заражаю code cave в секции кода, т.е. DEP тут вообще никак не должен помешать.
> почему мой кодес выполняется с ошибкой?
Потому что плохо читал гайды, читай лучше.
1) Если в XP ShellExec и лежала в каком-то из билдов по 0x7C8629FD, это нихуя не значит, что она и в 7 будет там лежать. Можешь сходить отладчиком и посмотреть, что там лежит. Это что касается кода sh. Что же касается кода в sh, там ты вообще вызываешь функции по адресам 0x00000020 и 0x00000026 - подозреваю, что рипнул из объектника, а про существование поправок (fixups, relocations) не знаешь.
2) Посмотри, как посоны делали поиск KERNEL32, парсинг таблицы экспортов, чтобы узнать адреса LoadLibrary/GetProcAddress, хэши имен API, вот это все.
3) У нас теперь ASLR, всё стало сложнее.
>подозреваю, что рипнул из объектника, а про существование поправок (fixups, relocations) не знаешь
Да, из объектника. Где про это все читать?
>GetProcAddress
Окай, можно вычислить адрес заранее для разных операционок, а можно вычислять при заражении и патчить адрес в шеллкоде, пометив его как-нибудь типа 0xDEADBEEF.
func_addr = (DWORD)GetProcAddress( LoadLibrary("kernel32.dll") , "WinExec");
> Где про это все читать
Хуй знает. Иди на амазон, вводи в поиске shellcode, смотри, что больше нравится людям, покупай или пирать.
> вычислить адрес заранее для разных операционок
Даже если бы ASLR не существовал, адрес все равно менялся бы от апдейта к апдейту.
Вот почему наш тредик всё время скатывается в максимальную байтоёблю?
https://ideone.com/oVyQxi
>>835582
Все так и есть((((
И о том, что использовал его, забыл
я всё никак не допишу мультитредовый malloc с выгрузкой из памяти на хард, когда не нужно - вот этот момент ещё не до конца додумал, но общая концепция есть.
но лень, я вообще нихуя не делаю, просто бухаю и всё.
как назвать место, где хранится адресация памяти, его разметка, и свободные части и занятые? я не умею в английский.
> с выгрузкой из памяти на хард, когда не нужно
Это embedded или тебя чем-то не устраивает системный файл подкачки?
да как-то заебало, не может системный менеджер всё понять правильней, чем единичное приложение, которое точней может предугадать когда что понадобится - в идее. а может оно, системное распределение, работает галимовряд ли - я не знаю, но смотря на теже браузеры - они вообще не парятся, просто жрут ВСЁ. и никто не конструирует программ с параметром --ДОСТУПНАЯПАМЯТЬ - наверно в этом интерес. и да, я собираюсь это всё запускать на спектруме и сеге.
> как назвать место, где хранится адресация памяти, его разметка, и свободные части и занятые?
heap descriptor?
не думал с такой точки зрения.
Разве в C можно объявлять переменную в разделе описания цикла? Только в плюсах же!
Точно. Значит я использую старое говно.
да прост)
Есть ли годная литература по етому? Что вы сами читывали?
нихуя не читал - нихуя не умею чёт увлёкся электромагнетизмом... но какое-то вводное есть у криски - но не читал.
Ну если не проверять строку на корректность, то искать третий по счету байт, у которого не установлен старший бит (т.е., банально цикл со счетчиком и маской 0x80).
>>837269
Можно бездумно брутфорснуть же.
>>837325
Прочитать ман уже предлагали?
Бля, про UTF-8 пизжу. Надо if ((byte & 0xc0) != 0x80), тогда начало очередного символа.
Это копия, сохраненная 29 сентября 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.