Это копия, сохраненная 5 января 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Пожалуйста, пользуйтесь https://ideone.com/ или http://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [i] или ∗.
Что читать:
- Brian Kernighan, Dennis Ritchie "The C Programming Language": http://www.cypress.com/file/56651/download
- Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.
- Zed A. Shaw "Learn C the Hard Way" (2015): годное пособие для гуманитариев для гуманитариев!
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (он же C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт)
- Стандарт ISO/IEC 9899:2011 (он же C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- man/Dash/zealdocs
Чем конпелировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio 2017 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Что еще почитать:
http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)
Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Richard M. Reese "Understanding and Using C Pointers. Core Techniques for Memory Management" (2013) - почитать, вкатиться в указатели.
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)
Stephen G. Koch@n "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard
Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C
Онлайн-утилиты:
- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).
- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.
Прошлые треды:
- №32: https://arhivach.tk/thread/375538/
- №33: https://arhivach.tk/thread/383767/
- №34: https://arhivach.tk/thread/398890/
Первыйнах1
Нет.
Ну, как программисту это тебе нужно для ручной автоматизации сборки скриптиками на баше или мейком. Хотя это можно и в сигвине вроде делать. Пожалуй на этом вроде заканчивается. Дальше идут особенности операционки: меньше вирусов, меньше тормозов, но зато ебля с драйверами и пердолинг с конфигами. Хотя против венды ещё скажу, что очень много языков поставляется из коробки в большинстве основных дистров.
Ну я с cmake и make и на винде могу работать. меня больше волновал вопрос нужности знания лигукс апи.
Но если ты на винде в студии пишешь, то ты говно, а не сишник, если что. ИМХО
В линуксе удобно ставить языки и либы через apt install или pacman -S и т.п. Это вот точно удобно.
Пишу на mingw через vscode или clion. Довольно удобно. И не занимает 30 гигов как студия.
Линукс АПИ? Дак, это вроде Си использует винАПИ. Потому что для линуксов си - родной язык, на котором ядро в общем-то пишется.
Это значит, что функция возвращает массив?
Это звездочка не перед названием функции по сути, это звездочка относится к типу возвращаемого значения. Ты можешь писать
int✡ func
int ✡func
int ✡ func
Разницы это не имеет. Просто главное что ты возвращаешь указатель на тип данных int. Если ты не знаешь что такое указатель - то прошу читать книжки и статьи, ибо рассказывать это здесь нет смысла - все и так разжевано.
Нет я в курсе.
Просто получается если не ставить звездочку возле функции. То компилятор будет думать, что возвращает не массив , а просто int единицу?
Да. Но желательно пойми суть указателей.
Например arr[3] это равнозначно *(arr+3). Потому что стандартный массив это указатель вроде на первый элемент, и написывая [3] ты указываешь на то, что надо отчитать 3 блока памяти размером с тип данных указателя и взять оттуда блок памяти размером с тип указателя.
> Но если ты на винде в студии пишешь
Если ты не умеешь в современные IDE, то ты говно, а не программист. Иди дальше sed-ом рефакторь, а less-ом логи gprof листай.
Студия как по мне слишком громоздка. Продукты от jetbrains лаконичней, имхо.
На винде тоже есть шелл-скриптинг и ее автоматизациияведь билл всегда следит за юникс системами и пиздит оттуда идеи
Неоднозначная ситуация. С одной стороны вонючая командная строка, с другой стороны, чтобы переехать на повершелл у всех сборка из коммандной строки и никто ни за что в повершелл не переедет, продолжая жрать говно из комнадной строки. В пинусе же баш в основном как шел используется в терминале. С этим тут всё более однозначно, хотя выбора никто не лишён. Хотя есть кое-какая проблема у баша. Он не поддерживает работу с плавающей точкой. Повершелл поддеживает. Может можно как-то исправить, не велосепидируя собственных утилит?
В винде есть батники, есть mingw со всеми линуксовыми утилитами, в том числе и с bash. А повершелл - это высер, превращающий командную строку в какие-то тормозные заклинания. Ненужен.
Ну ка расскажи, насколько у этого новоиспеченного языка большая библиотека? Насколько большое комьюнити? Все ли протестено и возможно?
Да, экосистема маленькая, но все же лучше чем пердолиться с Си который застрял в 2005.
У Кристала как минимум пакетный менеджер есть. И есть уже компании которые его в проде используют. Дело лишь за популяризацией.
Еще один хипсторский мертворожденый язычок, ясно.
Лучше бы про божественный interop с сишным кодом сказал.
Ты это, ещё три DE забыл перечислить. Различия между ними только в DE.
В чём «чистота» «чистой убунту»?
Есть даже all-in-one дистрибутив
> Может можно как-то исправить, не велосепидируя собственных утилит?
Да, попробуй программу bc.
>Crystal
Очередной ноунеймЯП уровня йопта-скрипта с сишным синтаксисом. Причём это среднестатистическое описание любого языка младше 2000 года. Я не глядел описание, честно. Давай просто сравним количество гаедов к обоим ЯП. Всё, отсыхай.
>с сишным синтаксисом
Не, там какое то говно между Паскалем и Питухоном
class Object
def has_instance_var?(name) : Bool
{{ @type.instance_vars.map &.name.stringify }}.includes? name
end
end
О, а вот и сойбойчик подъехал, всю сою слизал?
>сишный синтаксис
>я не глядел
Оно и видно, что не глядел. Там Рубишный (то есть самый идеальный) синтаксис.
Как же вы заебали набеги устраивать. Треды нужны не для ЯП срачей, дауны.
unsigned поддерживает битоебство, добавляет бит в диапазон значений, для него определено поведение при overflow/underflow
а ещё пачка возможных багов при сравнениях signed-unsigned и вообще при неосторожном использовании unsigned
карочи, нужен ровно в тех местах, где надо битоёбствовать, в остальных местах лучше использовать int
Я так и понял, а на переносимость это может повлиять?хотя какая нахуй переносимость че я блять несу, о какой блять переносимости может идти речь если уже давным давно есть языки-конструкторы вроде питона, мда ну пиздос
да
Он просто указал с чего взят синтаксис у Crystal. Что ты петушишь? Неадекват что ли?
>>287936
>насколько у этого новоиспеченного языка большая библиотека?
Вроде либа поддерживает либы с Ruby, так что с этим почти нет проблем.
>>287931
>такой же быстрый Crystal
Ты хотя бы тесты сам проделай прежде чем вбросы делать.>>287896
>> 2018
>> не интерпретация
Поинтерпретируй ты мне тут в лоу левел программировании, петушок.
>>287862
>и никто ни за что в повершелл не переедет, продолжая жрать говно из комнадной строки
Powershell как по мне то еще говно. Все равно у юниксов пизже
Ну вот как популяризуете свой язычок, так и приходите (через лет 15)
>насколько у этого новоиспеченного языка большая библиотека?
Вроде либа поддерживает либы с Ruby, так что с этим почти нет проблем.
>вроде
Вот биндинги к С либам https://crystal-lang.org/docs/syntax_and_semantics/c_bindings/ . Все, что есть в С, доступно в кристале с минимумом усилий.
> Типа почему бы блять тупо функцией принтф не указывать способ вывода
Это работало бы, если бы у тебя было только сложение и вычитание. А вот реализации деления и умножения разные для signed/unsigned.
Vasya Pupkin’s home page
>прохожу его. и искренне охуеваю от заданий уровня "Напишите операционную систему" на первой главе.
Ты о чем, уважаемый? Я седьмую закончил, нет там такого.
Упражнение 1.24. Напишите программу, проверяющую Си-программы на элементарные синтаксические
ошибки вроде несбалансированности скобок всех видов. Не забудьте о кавычках (одиночных и двойных),
эскейп-последовательностях (\...) и комментариях. (Это сложная программа, если писать ее для общего
случая.)
Последняя задачка первой главы. Вроде как самая челленджная. Предыдущая немногим проще. Даже ковыряя Си один год. Это всё равно становится нетривиальной задачей даже для человека, знакомого с языком.
И 2) Как переносить текст в printf, а то слишком длинный в право
алсо че то нихуя не печатается
погугли switch(variable) case of RANGE:
С ним и красивее будет и компилятор более конкретный ассемблерный код сгенерирует, что немного время исполнения сократит.
А в printf() можно переносить, если в конце строки поставить бэкслэш. И писать в новой строке.
Бля... У тебя же в коде типо юникод... А в винде в консольке какая-то особая кодировка. Попробуй перед printf() написать такую хуйню
system("chcp 1251");
для этого нужно stdio.h подключить
потом после printf() вернуть кодировку на стандартную
sytem("chcp 866");
И тогда вроде лучше напишет. Вообще вся эта тягомоть с локалями и кодировкой мне самому покоя не даёт, нужно либу себе велосепедировать для этого. Либо вообще откажись от русских букв в выводе printf(). Что в лучшую сторону повлияет на твою культуру кода.
>А в винде в консольке какая-то особая кодировка.
Бляяя, нахуя они так делают?
>system("chcp 1251");
Вставил в начало функции. Что-то не работает.
Может в main надо пихать?
Вообщем переписал все на инглишь.
unsigned long long num = 1 << 32;
Выдает ошибку shift count >= width of type [-Wshift-count-overflow]?
Боже. Если ты все равно уже умеешь в массивы, какого хуя у тебя по переменной на каждую цифру? Сделай массив и сократи все это до трех строк. Алсо, <= kol там наверняка ошибка, и ты хотел < kol.
Ахаха, да я просто делал на быструю руку. В красоту думал в конце привести. И знаешь так и вышло, один хуй прога не работает.
Вот к примеру блядский scanf тупо не читает число.
Запускаю прогу, просит ввести что-то. Ввожу к примеру 3489,
Он пишет vi brosili 0 kibikov podryad.
Блять я уже все перебрал спецификаторы!!!
> Вот к примеру блядский scanf тупо не читает число.
Ты не просил у него число. Ты просил фразу вида vvedi klv broskov 3489. Вот и вводи ее. Целиком со словами. scanf() принимает параметром не сообщение с просьбой что-то ввести, а спецификатор.
Мне кажется, что это вообще троллинг когда советуют K&R для полных нубов, для нубов есть Кочан, Прата и т.д. а после можно и K&R почитать.
>>289107
учил си на первом курсе по k&r
сквозь боль делал упражнения, перечитывал раз за разом непонятные места, включая и приложения где формально язык описан
хз что с вами не так
у англичан даже что-то вроде поговорки есть, что ты не поймешь по настоящему что написано в книге пока она не начнет разваливаться у тебя в руках
Я учил Си по K&R первой редакции (другого не было) и по чужим исходникам. Мне было норм, но я пришел с ассемблера. Сейчас я всем рекомендую Прату, но всегда находится кто-нибудь, кто с пеной у рта защищает K&R. Похуй, всегда можно скачать обе и выбрать ту, которая больше понравится.
Бля, вот думаю K&R распечатать, не люблю книги с компа читать.
Но у нас распечатка стоит 5 рублей за страницу КАРЛ!.
Это 1700рублей. Интересно сколько выходит рублей у людей,у которых есть принтер и собственная краска печатнуть 350стр?
Да ты просто купи бэушную на авите. Даже с доставкой будет сильно дешевле штуки.
k&r всегда в книжных магазинах есть, даже в мухосрансках
имхо, эта так книга которую стоит иметь
Это ты в своем городе смотрел. Попроси почтой отправить.
Ты собираешься страницу во весь лист а4 печатать? Нужно печатать по 2 страницы с двух сторон, итого нужно 288/4=72 листа.
Распечатать это может бесплатно любой знакомый офисный работник. На лазерном принтере на котором регулярно перезарпавляют тонер себестоимость печати страницы копеек 50.
А малому бизнесу нужно деньги зарабатывать, вот и получается по 5 рублей.
Вам шашечки или ехать
> О каком буфере речь?
Ну на пике же подробно описано. У каждого FILE есть свой буфер (банально массив char) и три режима: нет буферизации (каждый getchar()/putchar() и т. п. летит сразу в ОС), построчная буферизация (ввод читается из ОС до Enter, т.е., построчно, а вывод кладется в буфер и выплевывается, если в буфер больше не помещается или если в буфер прилетела \n) и полная буферизация (буфер читается из ОС, когда полностью пуст, или пишется, когда буфер полностью заполнен). Плюс есть принудительный сброс буфера вне зависимости от режима с помощью flush()/fflush() со stdin не работает. Если хочется, режим и буфер можно задать самостоятельно с помощью setbuf()/setvbuf(). Буферизация сделана потому, что обращение к буферу в тысячи раз быстрее по сравнению с походом в ядро ОС из-за каждого байта.
> Разве данные не печатаются в стандартный поток вывода?
Печатаются, но режим буферизации зависит от реализации стандартной библиотеки. В винде, если я правильно помню, по традиции буферизация у stdout/stderr отключена (и все тормозит!), в линуксе обычно буферизация отключена только у stderr, а вот у stdout включена построчная буферизация.
Т.е., если ты в линуксе сделаешь:
#include <stdio.h>
#include <unistd.h>
int main(void) { printf("Hello, "); sleep(2); printf("world!\nAnd bye!"); sleep(2); }
Оно положит первый "Hello, " в буфер, подождет 2 секунды (ничего выведено не будет), положит в буфер "world!\nAnd bye!", увидит \n в буфере и выведет строку, ты сразу увидишь "Hello, world!", потом оно поспит еще 2 секунды, и уже при завершении программы стандартная библиотека, чтобы ничего не проебать, принудительно очистит буфер с помощью fflush(stdout), и только тогда ты увидишь "And bye!".
> Как сравниваются числа типа unsigned int и просто int?
Гугли integer promotions или даже arithmetic promotions. Вкратце, суть в том, что для любой арифметической операции, в том числе и для сравнения, Си преобразует операнды к одному типу, обычно к более широкому или точному из двух.
> но при сравнении они не равны, вопрос почему?
Потому что ты где-то облажался. Если типы отличаются только наличием знака, то ранг одинаковый, и signed преобразуется в unsigned (на абстрактной машине (unsigned int) -1 = -1 + (UINT_MAX + 1) = 0xffffffff, на реальной оно "само" так будет, потому что представления одинаковы), получаем одинаковое представление, числа равны. Поэтому сравнивать signed/unsigned между собой - это опасное занятие, и если уж очень хочется, стоит скастить signed к более широкому типу.
Много лет назад у меня был телефонный справочник, его автор навелосипедил свой парсер DBF, и этот парсер читал базу на десяток метров отдельными вызовами ReadFile побайтово - поиск адски тормозил несколько минут. Так что пусть лучше аноны спрашивают, чем пишут подобное говно.
У меня какое-то дежавю, буквально вижу такое сообщение уже не один тред, с одной и той же картинкой и все спрашивают, что за буфер.
памагити
В прошлый раз было про сканф и про макос.
Среда какая? Пердоль кодировку файла с сырцами или найди уже наконец setlocale(LC_ALL, "rus").
С stdin вроде же неопределенное поведение, у меня буфер вполне себе очищается.
Ну, это наверное не совсем то. Мне бы принципы подсмотреть, а то пока под каждую менюшку отдельная функция в цикле крутится, что, наверное, не очень хорошее решение.
> а то пока под каждую менюшку отдельная функция в цикле крутится
Если менюшки полноэкранные, то тебе нужны сцены: структурка с необходимыми данными и указателями на функции Update (обработка пользовательского ввода и всякая анимация), Render и, если нужно, Activate/Deactivate. Делаешь в разное время разные сцены текущими, а единый главный цикл дергает у текущей сцены Update/Render.
Почему данный цикл генерирует лишь одно число в sum? Я же srand тоже положил в цикл, разве он не должен каждый раз обновляться.
Или данный алгоритм возможен лишь в рекурсии?
То есть получается огромный массив и в каждой итерации одно и тоже число, которое было рандомно сгенерировано 1 раз в начале
Алгоритм отрабатывает за одну и ту же секунду. Убери нахуй srand из цикла, поставь перед while.
В цикле же он как бы каждый раз должен был сдвигать начальное число на секунду, а вне цикла нет вроде. Так как сработало то?
И у каждой сцены, выходит, свои функции update и render? А если, например, содержимое неоднородно? В одном меню - несколько условных кнопок, в другом - условный текстбокс. Но в любом случае спасибо за направление.
Прогони в цикле 10000000000 раз. И проставь время перед циклом и после цикла в обоих вариантах. Вообще по идее должно получиться быстрее вторым способом. Но как оно окажется на деле - хз.
> Cделал, сработало. А в чем логика то?
Логика в том, что rand() генерирует псевдослучайную последовательность путем каких-то преобразований внутренней переменной (или переменных) seed. При вызове rand() seed изменяется, поэтому каждый новый вызов rand() генерирует новое число, тебе ничего не нужно никуда "сдвигать". srand() нужен не для того, чтобы обновлять состояние генератора или что-то там еще, что ты себе напридумывал вместо чтения документации. Он нужен, чтобы при разных запусках программы rand() выдавал разные последовательности. Т.е., если ты srand() вообще не используешь, то в seed будет что-то по умолчанию (0 или 1, например), а так как результат rand() целиком и полностью зависит от того, что лежало в seed, то без вызова srand(), ты будешь каждый раз получать одну и ту же последовательность, основанную на этих 0 или 1. То же самое происходит, если ты вызываешь srand() в цикле и кормишь его таймером. У time() разрешение - 1 секунда, т.е., велика вероятность, что каждый раз в seed будет попадать все та же константная секунда, в течение которой успевает отработать твой цикл. Одно и то же значение в seed - один и тот же выхлоп. А чтобы все работало правильно, нужно вызывать srand() один раз за все время жизни программы (или потока, если у тебя есть потоки). Лучше всего, где-нибудь в начале main(). И, разумеется, все вышесказанное не касается криптографии, там все иначе, там за использование rand() пинают по лицу.
>>289437
Общие функции для всех меню, но своя для рендера самой игры. А дальше нужно больше абстракций. Меню - это указатель/индекс активного элемента и массив элементов управления, каждый из них - тип (класс!) и какие-то данные. render() для меню по очереди рисует каждый элемент, update() для меню стрелочками меняет активный элемент, а остальной ввод обрабатывает в зависимости от типа элемента. Можно опять же для каждого типа завести свои render()/update(), и там уже switch-ем выбирать нужный (или сделать в элементе вместо типа сразу указатель на таблицу функций методов этого типа). И потом это все можно обернуть еще дальше, чтобы магия происходила под капотом, и у тебя получится еще один наколеночный GUI-фреймворк.
>>289445
> Что быстрее?
Первое. Велик шанс, что компилятор положит значения в регистры, а обмен данными между регистрами на современных процессорах скорее всего будет бесплатным (регистры переименуются друг в друга еще при декодировании инструкций). А вот если компилятор не распознает, что xor - это обмен значениями, и не превратит его в первый вариант, то процессору придется на самом деле выполнять три ксора, да еще и с зависимостями.
> Cделал, сработало. А в чем логика то?
Логика в том, что rand() генерирует псевдослучайную последовательность путем каких-то преобразований внутренней переменной (или переменных) seed. При вызове rand() seed изменяется, поэтому каждый новый вызов rand() генерирует новое число, тебе ничего не нужно никуда "сдвигать". srand() нужен не для того, чтобы обновлять состояние генератора или что-то там еще, что ты себе напридумывал вместо чтения документации. Он нужен, чтобы при разных запусках программы rand() выдавал разные последовательности. Т.е., если ты srand() вообще не используешь, то в seed будет что-то по умолчанию (0 или 1, например), а так как результат rand() целиком и полностью зависит от того, что лежало в seed, то без вызова srand(), ты будешь каждый раз получать одну и ту же последовательность, основанную на этих 0 или 1. То же самое происходит, если ты вызываешь srand() в цикле и кормишь его таймером. У time() разрешение - 1 секунда, т.е., велика вероятность, что каждый раз в seed будет попадать все та же константная секунда, в течение которой успевает отработать твой цикл. Одно и то же значение в seed - один и тот же выхлоп. А чтобы все работало правильно, нужно вызывать srand() один раз за все время жизни программы (или потока, если у тебя есть потоки). Лучше всего, где-нибудь в начале main(). И, разумеется, все вышесказанное не касается криптографии, там все иначе, там за использование rand() пинают по лицу.
>>289437
Общие функции для всех меню, но своя для рендера самой игры. А дальше нужно больше абстракций. Меню - это указатель/индекс активного элемента и массив элементов управления, каждый из них - тип (класс!) и какие-то данные. render() для меню по очереди рисует каждый элемент, update() для меню стрелочками меняет активный элемент, а остальной ввод обрабатывает в зависимости от типа элемента. Можно опять же для каждого типа завести свои render()/update(), и там уже switch-ем выбирать нужный (или сделать в элементе вместо типа сразу указатель на таблицу функций методов этого типа). И потом это все можно обернуть еще дальше, чтобы магия происходила под капотом, и у тебя получится еще один наколеночный GUI-фреймворк.
>>289445
> Что быстрее?
Первое. Велик шанс, что компилятор положит значения в регистры, а обмен данными между регистрами на современных процессорах скорее всего будет бесплатным (регистры переименуются друг в друга еще при декодировании инструкций). А вот если компилятор не распознает, что xor - это обмен значениями, и не превратит его в первый вариант, то процессору придется на самом деле выполнять три ксора, да еще и с зависимостями.
Там по ебанутому, в нашей библиотеке технические кгини даже нельзя забирать домой, лишь только у них на месте читать,лол.
забирать домой можно только худлит
gets() сломан искоробки, а rand() можно реализовывать как угодно, лишь бы выполнялось требование псевдослучайности (идентичные последовательности для одинаковых seed) и если начальный seed для srand() влезает в unsigned int. Поэтому нет, не выкинут.
В том и дело, что из-за srand() уязвимости
>в нашей библиотеке технические кгини даже нельзя забирать домой
Это может быть и плюсом.
Например, ты приходишь и читаешь. А не копаешься вкудахте.
Поясните в целом за геймдев на си. Знаю только gtk+ GUI для созданий интерфесов, но это не совсем геймдев. А вот анимации и геймплей создавать сложно в целом? Что надо знать, какие то драйвера, директ их или какие то другие теории? Просто для меня это целая непонятная вселенная, знаю что графика есть растровоая ,векторная. но что это? Из каких частей состоит игра?
>пакетный менеджер
>один финн чисто для лулзов запилил ядро для пакетных менеджеров для це и называет это ядром ОС, опять же, для лулзов
>class Greeter
> def initialize(@name)
> end
> def salute
> "Hello #{@name}!"
> end
>end
>етот донный синтаксис
Анон, можешь помочь с интерпретатором shell? В теории работать должно, но пытаюсь понять где оподливился.
argc - int, а не массив
##argv -char. двумерный массив всех параметров шела
вот так должно быть:
int main(int argc, int ##argv)
{
}
##-звездочки
ой сори)
крч нужно в двумерном массиве найти столбец в котором нет ни одного элемента равного нулю(Не используя дополнительные методы и указатели)
мне важен сам алгоритм перебора,не могу врубиться как мне найти столбик без нуликов(
Что имеется введу под словом "столбец" ?
>Бляяя, нахуя они так делают?
Ребята не стоит вскрывать этот код. Вы молодые, хакеры, вам все легко. Это не то. Это не ядро линукс и даже не ГНУ. Сюда лучше не лезть. Серьезно, любой из вас будет жалеть. Лучше закройте компилятор и забудьте что там писалось. Я вполне понимаю что данным сообщением вызову дополнительный интерес, но хочу сразу предостеречь пытливых - стоп. Остальные просто не найдут.
Допустим есть массив в котором 0-ой указатель сдвинут впрёд, то-есть можно обращаться к отрицательным элементам.
Передаю в функцию указатель на 0-ой элемент массива, комп подготавливает сразу кусок памяти. Вопрос: он готовит только правую(впереднюю) часть данных? Ну то-есть, обратись я в функции к отрицательному элементу компу придётся подготавливать уже другой кусок памяти и будет промах КЭШа?
Ну я ж у специалистов полюбопытсвовать хотел, к тому результат моей проверки может быть не универсален.
Понятно.
> А вот анимации и геймплей создавать сложно в целом?
В целом просто, на практике сложно.
> директ их
C OpenGL в сишечке приятнее.
>>289832
> мне важен сам алгоритм перебора
В массиве array[num_rows][num_cols], для каждого столбца c, для каждой строки r: если array[r][c] нолик, ставишь флаг, что столбец зашкварен и выходишь из цикла по r.
>>290065
> cutch(Это же тоже самое что КЭШ?).
Не знаю такого.
> Передаю в функцию указатель на 0-ой элемент массива, комп подготавливает сразу кусок памяти.
Это немного не так работает. Вряд ли твой компилятор генерирует явный префетч, а сам процессор закэширует кусок массива при первом обращении, а не при передаче параметров. Гугли кэшлайн (cache-line, линейка кэша). На границы массива и указатели процессору насрать. Если какого-то значения нет в кэше, он прочитает из памяти сразу блок размером с кэшлайн (64 байта), выровненный на кэшлайн (т.е., может заодно прочитать память и чуть ниже того адреса, на котором был промах). Соответственно, если массив был выровнен по кэшлайну, то по отрицательному индексу будет промах, а если нет (malloc выравнивает только на 8 байт, например), то промаха может и не быть.
>>>>290117
премного благодарю,как у вас тут говорят "цистерну чая этому сударю"
Это не иде, а обычные текстовые редакторы с плагинами. IDE это не просто редактор кода.
Мде... Перевелись нынче байтоёбы. Вот батя мой компилировал в командной строке, а писал на превокартах. Ещё писал порой прямо в оперативке, приатачиваясь к процессам дебагером.
в пизду платные программы
Я тоже пишу на перфокартах. Хорошие, качественные картонки, не выкидывать же их!
Начал 1,5 месяца назад, для меня это первый язык, идёт очень туго, сейчас с уверенностью могу сказать что понимаю что такое указатели и как ими пользоваться, и вот думаю стоит ли продолжать. Сам никуда не спешу, если анон посоветует дойти до понимания каких-то тем, а потом перекатиться на условно джаву или пхп что бы через 3 года быть уверенным джуном или даже сеньером. Готов принять ваши советы, не смотря на тугость изучения мне нравится то, что я делаю.
Кстати что за тема со звёздочками?
*
Тож жду ответа на твой пост.
Алсо, сам не так давно начал Си изучать.
Ну думаю , что все так да. Раз уж начал, то доводи до конца. Хотя бы ознакомится со всеми возможностями и синтаксисом точно надо, не думаю, что это долго.
Долго - это изучать всякие библиотеки и писать что-то серьезное.
>с уверенностью могу сказать что понимаю что такое указатели и как ими пользоваться
как относятся друг с другом указатели и массивы
зачем возвращать из функции указатель на указатель?
как работать с указателями на функции и зачем это надо?
особенности работы с нетипизированным указателем и зачем он нужен?
вангую, что ты еще ни одной сложносвязанной структуры данных не запилил, не говоря уж про хоть какое-то подобие библиотеки решающей часть своего функционала через каллбеки, например
ну или ничего не писал, что читает из бинарного файла или из сети в банарном формате
Правильно вангуешь про структуры и прочее, на первые 3 вопроса я могу дать ответ без Гугла, что такое "нетипизированный" могу только догадываться.
интересно кто-нибудь писал сложные структуры и то что написано в том посте всего через 1,5 месяца изучения Си
макаба фейлит текст с несколькими звездочками техст
Никак не могу найти пикрелейтед. Несмотря на год выпуска, у сего труда очень хорошие отзывы, даже с 2018 года.
Да и как такие авторы могут написать некошерную книгу?
Еще нашел Седжвика Алгоритмы на Си, очень рад, ибо можно сосредоточиться собственно на алгоритмах а не расписывать иерархию классов для сортировки пузырьком.
Вообщем, прошу помощи.
Благодарю.
на либгене нет электронной копии, есть data structures using pascal тех же авторов
на амазоне можно купить не новую за 1.5 бакса
нетипизированный указатель это void
но речь не о том чтобы знать что он существует, а о особенностях работы с ним и зачем вообще применять
..
char s;
s="abc"; (это кстати расширение gcc что ли?(присваивание строки после инициализации))
Но не могу так:
int i ={1,2,3};
В чём принципиальная разница? И где находиться та строка, на стеке?
Поддвачну.
Есть вообще хорошиая книга про Data Structures в С?
<spoiler>Как введение в алгоритмы, например.</spoiler>
Блин звёзды испарились, char(звезда) int(звезда).
> s="abc"
А почему бы и нет? У тебя указатель, у строкового литерала есть адрес.
> Но не могу так:
> int i ={1,2,3};
Давно уже можешь. Тип укажи только. int ∗i = (int[]) {1,2,3}
Офигеть, сколько про С ни читаю в интернете "int ∗i = (int[]) {1,2,3}" такого не встречал, спасибо.
>как относятся друг с другом указатели и массивы
Массив это и есть указатель, только он указывает на начало связных блоков памяти.
>зачем возвращать из функции указатель на указатель?
Тем самым мы возвращаем двумерный массив.
>как работать с указателями на функции и зачем это надо?
Я хз, пусть другие дополнят
>особенности работы с нетипизированным указателем и зачем он нужен?
Что бы принять данные которые нам не известны (их тип нам не известен)
>Я хз, пусть другие дополнят
Чтобы передавать другие функции как аргументы для функций, но я про это только читал, сам не делал. Ещё такая хрень нужна, чтобы организовать функциональное программирование, но что это значит я тоже не знаю. Там на педивикии написано, что высшие функции - это те функции, которые принимают в качестве аргументов другие функции.
>Массив это и есть указатель
неверно
>зачем возвращать из функции указатель на указатель?
>Тем самым мы возвращаем двумерный массив
неверно
> Чтобы передавать другие функции как аргументы для функций
Тогда вопрос с подвохом: почему это компилируется и работает (нет, макаба не сожрала звездочки)?
static void hello(void) { puts("Hello, world!\n"); }
static void invoker(void func(void)) { func(); }
int main(void) { invoker(hello); }
>>290877
Второе с некоторой натяжкой верно. Можно организовать двумерный массив как массив указателей на одномерные.
указатели на функции в си используются для более банальных, но практичных вещей, чем попытки симитировать пункции первого порядка и высшие функции из фп
тогда свои ответы давай, если так крут
Структуры как замены классов, а колбеки в виде указателей на функции вместо полиморфизма, хехе.
алсо в ядре линукса такое много где используется
> а колбеки в виде указателей на функции вместо полиморфизма
Как будто в этих ваших крестах не так. Ой, они называются по-другому.
Нету :(((
Проблема усугубляется тем, что книгу под абсолютно тем же названием написал индус, и именно она вылазит изо всех дыр.
вызовы ядра тебе не нужны. из юзерспейса у тебя есть набор библиотек предоставляющих тебе какие-то стандарты.
например gnu c lib:
> This section discusses the various standards and other sources that the GNU C Library is based upon. These sources include the ISO C and POSIX standards, and the System V and Berkeley Unix implementations.
> • ISO C: The international standard for the C programming language.
> • POSIX: The ISO/IEC 9945 (aka IEEE 1003) standards for operating systems.
> • Berkeley Unix: BSD and SunOS.
> • SVID: The System V Interface Description.
> • XPG: The X/Open Portability Guide.
наверно, если говорить за аналогию винапи, то это posix для линя. хз кстати, можно ли бсд расширения использовать в лунтике, конкретно через эту библиотеку.
советую qalc (command line version of Qalculate)
подумал тут в в аллокаторе свой хедер заделывать, хотя-бы чтобы всё отчищать было проще, при выходе с ошибкой из фрейма. так норм определение выравнивания?:
#ifdef ULLONG_MAX
#define LLONG_T long long
#else
#define LLONG_T char
#endif
#ifdef LDBL_DIG
#define LDOUBLE_T long double
#else
#define LDOUBLE_T_T char
#endif
#define ALIGNOF(T) offsetof(struct { char c; T member; }, member)
#define ALIGN_MAX ALIGNOF(union { char a; sint b; int c; long d; LLONG_T e;\
void@ f; float g; double h; LDOUBLE_T i;})
Почему дефайны вместо тайпдефов?
> offsetof(struct { char c; T member; }
Куча невнятного говна в отладочной информации из-за тестовых анонимных структур. Чем тебя stdalign.h не устраивает, зачем велосипеды?
> ALIGN_MAX
У различных SIMD-типов выравнивание может быть от 16 до 32 (в зависимости от компилятора и платформы). alignof(long double) не спасает, в 32-битном коде на винде оно даже меньше, чем alignof(double).
>Чем тебя stdalign.h не устраивает, зачем велосипеды?
тем что он есть только в с11. мне поебать на отладочную информацию, я отлаживаю принтами и gdb когда падает.
> alignof(long double) не спасает, в 32-битном коде на винде оно даже меньше, чем alignof(double).
какая разница, если я их всех перечислил?
> Почему дефайны вместо тайпдефов?
и нахуя мне тейпдефами засирать пространство имён? я в этом же файле undef сделаю и всё.
Вот тут описывается создание битового массива:
http://www.mathcs.emory.edu/~cheung/Courses/255/Syllabus/1-C-intro/bit-array.html
Этот кусок показался мне странным:
https://pastebin.com/mhykVexw
Это нормально такие трюки проводить между int и unsigned int?
Не лучше ли использовать только unsigned int в таком случае?
Не понял почему пейсбин не высрался.
Вот код:
int A[100]; // A = 0 means false, A = 1 means true
int i = k/32; // i = array index (use: A)
int pos = k%32; // pos = bit position in A
unsigned int flag = 1; // flag = 0000.....00001
flag = flag << pos; // flag = 0000...010...000 (shifted k positions)
A = A | flag; // Set the bit at the k-th position in A
> Это нормально такие трюки проводить между int и unsigned int?
Более или менее. Но бессмысленно, потому что
> Не лучше ли использовать только unsigned int в таком случае?
Лучше. Я еще лучше uint32_t, а то в инте не обязательно 32 бита.
> pro version
Фууу. x[index >> 5] |= 1u << (index & 0x1f)
>еще лучше uint32_t, а то в инте не обязательно 32 бита.
Хотел спросить кстати, но подумал что наверное вообще нубский вопрос, стыдно
Ну у тебя к инту идёт битовое или, так что норм, если бы было наоборот могли бы возникнуть проблемы из-за знакового бита, а так вполне все норм, тут же unsigned просто как бит используется.
Но вообще странно, что так сделано, т.к. если вдруг будет 1 << 31, то возникнет сюрприз.
uint32_t макрос кроссплатформенный, который гарантирует тебе беззнаковую 32-битную переменную.
>>291450
Это не проверсия, это нечитаемое говно, не пытайся это понять, это не сложно, но такой говнокод понимать а уж тем более писать не стоит.
если коротко index >> 5, тоже самое, что index / 32, 1u << это беззнаковая единица, а нужное для неё место даёт index & 0x1f, 0x1f это 32 в хексе, соответственно index & 0x1f тоже самое, что index % 32, думаю соответствие с кодом, который ты скинул сам найдёшь
Добавлю, размер инта не управляется стандартом и зависит от платформыкомпилятора
А ещё я там опечатался, 0x1f это 31 в хексе, но % 32 это верно.
> это нечитаемое говно
Вот деление и остаток - нечитаемое говно. А тут сразу ясно, какие биты индекса за что ответственны. И это практически идиоматичный код, он такой везде. Ты либо понимаешь побитовые операторы, либо выбираешь другой язык.
В коде:
char a, b;
scanf("%c", &a);
scanf("%c", &b);
Столкнулся с проблемой переноса line feed (\n) в буфер stdin и последующей инициализацией переменной b при вызове scanf этим символом \n. Погуглив, нашел это
https://stackoverflow.com/questions/7898215/how-to-clear-input-buffer-in-c
Тред мне очень помог, я понял, почему возникает такое поведение, и как от этой "проблемы" избавляться.
После этого решил немного аналогично поиграться, но уже с массивами char'ов. Написал простенький код, чтобы увидеть line feed в массиве.
#include <stdio.h>
int main () {
char a[10];
char b[10];
scanf ("%s", a);
scanf("%s", b);
for (int i = 0; i < 10; i++) {
printf("%d\n", a);
}
printf("new\n");
for (int i = 0; i < 10; i++) {
printf("%d\n", b);
}
return 0;
}
Вводные данные:
Hello
World
Что я ожидаю увидеть:
72
101
108
108
111
0
10 //аски-код \n
мусор
мусор
мусор
new
87
111
114
108
100
0
мусор
мусор
мусор
мусор
Что я вижу на самом деле:
72
101
108
108
111
0
мусор
мусор
мусор
мусор
new
87
111
114
108
100
0
мусор
мусор
мусор
мусор
Где код line feed символа?
В коде:
char a, b;
scanf("%c", &a);
scanf("%c", &b);
Столкнулся с проблемой переноса line feed (\n) в буфер stdin и последующей инициализацией переменной b при вызове scanf этим символом \n. Погуглив, нашел это
https://stackoverflow.com/questions/7898215/how-to-clear-input-buffer-in-c
Тред мне очень помог, я понял, почему возникает такое поведение, и как от этой "проблемы" избавляться.
После этого решил немного аналогично поиграться, но уже с массивами char'ов. Написал простенький код, чтобы увидеть line feed в массиве.
#include <stdio.h>
int main () {
char a[10];
char b[10];
scanf ("%s", a);
scanf("%s", b);
for (int i = 0; i < 10; i++) {
printf("%d\n", a);
}
printf("new\n");
for (int i = 0; i < 10; i++) {
printf("%d\n", b);
}
return 0;
}
Вводные данные:
Hello
World
Что я ожидаю увидеть:
72
101
108
108
111
0
10 //аски-код \n
мусор
мусор
мусор
new
87
111
114
108
100
0
мусор
мусор
мусор
мусор
Что я вижу на самом деле:
72
101
108
108
111
0
мусор
мусор
мусор
мусор
new
87
111
114
108
100
0
мусор
мусор
мусор
мусор
Где код line feed символа?
быстрофикс
в "что я ожидаю увидеть" у World тоже должен быть код \n, т.е.
...
new
87
111
114
108
100
0
10 //аски-код \n
мусор
мусор
мусор
"самое главное понять самую важную вещь. в С++ многомерные массивы - не настоящие. они все равно представляют собой одномерный массив.
например int [2][2][2]; все равно будет как int [8] в памяти лежать, а первая запись лишь языковая форма вводящая новый тип. поняв это ты придешь к простой истине, что имея указатель на 0-й элемент любого массива ты получаешь начало массива любой размерности.
поэтому int #p = &mass [0][3][5][8]; - будет показывать на определенную точку в этом многомерном массиве а int
#p = &mass [0][0][0][0]; гарантирует тебе его начало. а далее игра смещений
иначе будешь использовать синтаксис монстров int (#a)[4][4]
---- # = звездочки
Вопрос, в Сишке так же?
в си и с++ нет многомерных массивов на уровне языка
все
очень легко
как и, например, нет строк
нет подсистемы ввода-вывода
>многомерные массивы - не настоящие. они все равно представляют собой одномерный массив
У тебя память одномерная, какие "настоящие" многомерные массивы вообще могут быть? Пиши свои типы на псевдо-ООП чтобы они тебе их имитировали.
Новичкам сложно читать битовые операции и понимать, что они делаютнекоторые даже не представляют, как выглядит число в бинарной записи, о каких битовых операциях идёт речь
А судя по его вопросу он как раз новичок.
Компилятор понял, что значение б ты не меняешь, а т.к. это не указатель, то и адрес ты не поменяешь, и он скорее всего, чтобы лучше понять чекни асм просто выкинул твой вызов, не создавал переменную б, а тупо распечатал 3 как строковый литерал.
А вообще ты сделал какую-то хрень.
Ты взял адрес переменной и пытался присвоить этому адресу другой адрес.
Чтобы было понятнее.
Если ты хочешь поменять значение переменной, то передавай её адрес, если ты хочешь поменять адрес, то тебе нужен указатель, который содержит в себе именно адрес, который ты можешь поменять, короче сделай б указателем на инт и передавай в функцию без амперсанда, должно сработать.
Насколько я понял он хочет не значение, а адрес подменить.
>myClass& my func(x,y,z...).
Зачем из функции передавать ссылкой, а не копированием?
Чтобы словить segmentaion fault
> Где код line feed символа?
Продолжу повторять итт, что scanf - нелогичное, неюзабельное говно. scanf перед чтением очередного значения пропускает из входного потока все isspace() (т.е., и \n тоже), кроме случаев с charset-ом %[], потому что он может содержать пробелы и %с, потому что пробелы - тоже символы. А %s, как все остальные спецификаторы, сначала пропускает все пробелы, а потом читает до первого пробела.
>>291558
> в С++ многомерные массивы - не настоящие
Бред. Любой массив настоящий, если с ним можно работать, как с массивом. Без разницы, как он там реализован - как массив массивов или как массив указателей на массивы. А так, да, в сишке так же, оно из сишки в кресты и пришло.
>>291663
> ПОЧЕМУ
Аргументы функций полностью аналогичны локальным переменным (кроме того факта, что их инициализирует вызывающая функция). Ты изменил локальную переменную a, это ни на что не повлияло.
>Любой массив настоящий, если с ним можно работать, как с массивом.
в си есть производный тип - одномерный массив, задается через соответствующий описатель, семантика оператора индексирования определена так что позволяет работать с массивом посредство арифметики указателей, не более того
точка
Это никак не доказывает, что многомерных массивов нет, а лишь говорит о том, что можно красиво делать многомерные массивы из одномерных, и для этого нахуй не нужны запятые в квадратных скобках.
Если тебе нужно поле класса передать в другую функцию не член класса и там изменить, например.
>Это никак не доказывает, что многомерных массивов нет
Ну как бы я согласен, что если что-то выглядит и ведет себя как утка, то это утка, но по факту же это одномерный массив указателей.
Да, в C тоже. Связано с тем что указатель на начало статического массива в памяти процесса нигде не лежит.
type arr[size];
Понятно что:
(&arr)[m][n] == (&arr + m)[n] == arr[msizeof(arr) + n]
Можно создать динамическое подобие &arr, которая будет работать аналогично. Перемешивать обыкновенные указатели и массивы нельзя:
if ((void) &arr == (void*) arr) printf("Wtf\n");
Красивые обои
Скажем так, они для наших глаз есть. Но просто хранятся в фиической памяти по другому. А так все есть
> Но просто хранятся в фиической памяти по другому
Давай, неси пример из языка с многомерными массивами и показывай, чем в практическом смысле они отличаются от сишных, какая разница в генерируемом коде и как именно они по-другому хранятся.
Vusial Studio, если глаз не обманывает
А хуйнаны шпаны не показать ?
Тебе неправильно ответили.
Ты взял указатель и передал его в функцию.
В той функции ты изменил значение ЛОКАЛЬНОЙ переменной a на некоторое другое значение, потом вышел. При этом в main ничего не поменялось.
а - локальная переменная в функции. Действия с ее значением без на main никак не влияют. Тебе нужно чем-то выстрелить по этому указателю.
Например: a = 4. Или a = c.
В asm смотреть за этим не нужно.
И еще, ты просто так не сможешь сделать так, чтобы b в main ссылалась на какое-то другое место в памяти. Можно только пошатать значение.
Radix
Какой пиздец. Эталонный говнокод. Прям образец для, рамки не хватает, как программировать нельзя.
Я конечно понимаю, что юношеский максимализм помноженный на сексуальную неудовлетворённость дурманит твой мозг, но переменные вида pmss/vd, вложенные циклы и прочие «алгоритмы» это фиаско.
претензии как обычно. потому и не спрашиваю. несчастные люди.
Здравствуйте, мне нужна помощь, суть такова. У меня есть динамический массив, сделанный через realloc. Мне необходимо иметь указатель на один из элементов данного массива. Всё бы хорошо, но у меня есть ещё и второй динамический массив тоже сделанный через realloc и когда я увеличиваю размерность этого второго динамического массива, то указатель уже указывает не на один из элементов первого массива, а на непонятно на что. Олды, подскажите как быть?
Еще раз. У тебя так: ты хранишь указатель на массив, хранишь указатель на элемент внутри массива, realloc() перемещает массив в новое место памяти, и указатель на элемент начинает указывать на мусор (возможно, не после первого же realloc, а возможно, как у тебя, после realloc другого массива - это все зависит от реализации менеджера памяти). Но можно так: хранишь указатель на массив, хранишь индекс элемента (смещение внутри массива), можешь хоть смещение в байтах хранить, если у тебя элементы разного размера - похуй. Больше данных ты от этого хранить не станешь, но доступ становится сложнее на целую одну операцию. Там, где ты писал ∗elem_ptr или elem_ptr[0], ты будешь писать ∗(array_ptr + index) или array_ptr[index]. Если тебя это чем-то не устраивает, покажи кусок кода с примером того, что ты пытаешься сделать.
Да это понятно, я сначала так и хотел делать, но дело в том, что мой массив - это массив структур, у которых поля - это указатели на элементы этой же структуры (по сути сеть). И если я хочу перейти от одного узла сети к другому, мне необходимо менять указатель на текущий элемент, который я возьму из поля текущего элемента. Я не могу взять индекс массива следующего узла сети, потому что в формате элемента он отсутсвует, понимаешь?
Ты что-то делаешь очень неправильно.
> у которых поля - это указатели на элементы этой же структуры
Ты все еще можешь хранить офсеты вместо указателей. Ты можешь даже хранить офсеты внутри указателей, хоть это и UB, и вообще дикий говнокод.
> потому что в формате элемента он отсутсвует, понимаешь?
Понимаю. Отсутствует - добавь.
Но если уж очень хочется, есть другой вариант. Храни массив кусочками. Выделяешь массив под свои структуры с запасом (ну там сколько не жалко, допустим, сразу пару сотен элементов), хранишь количество заполненных элементов или помечаешь неиспользованные как-нибудь - похуй. Когда этот кусок полностью заполнится, вместо того, чтобы realloc()-ом менять его размер, выделяй другой, новый кусок malloc()-ом и начинай заполнять его. Естественно, тебе придется хранить указатели на все куски твоего массива, хотя бы для того, чтобы потом все это освободить правильно. Тебе придется поддерживать какой-нибудь free-list для удаленных элементов, чтобы можно было втыкать поверх них новые элементы. Т.е., фактически придется написать небольшой кастомный аллокатор. К тому же, из-за того, что массив перестанет быть непрерывным, тебе будет сложнее его обходить. Но третьего варианта тут нет.
>Отсутствует - добавь
Добавил ещё вчера, вроде нормально. Просто не хотелось поначалу засорять структуру, вот и пришёл сюда в поисках более элегантного решения, но раз такого нет, то придётся оставить как есть. Спасибо.
Если тебе о нем не сказали, не значит, что его нет.
80% проблем идут от хренового дизайна, уверен, если ты года через два попробуешь сделать тоже самое, ты найдёшь намного более интересный подход
"1345" - "1345", "1345" + 1 и т.д.
Просто вспомни, что "строка" - это массив char с неявным \0 на конце. Когда ты используешь массив в выражениях, он кастится к указателю. Вот и твои вопросы сводятся к тому, что будет, если вычесть один указатель из другого или прибавить что-то к указателю.
> "1345" - "1345"
ptrdiff_t x = адрес одной строки - адрес другой строки. Разница между адресами строк в штуках char (т.к. строка - массив char). Но вообще тут undefined behavior: одна из возможных проблем в том, что если компилятор схлопнет эти два одинаковых литерала в один, разница будет 0, а если не схлопнет - какое-то число. Поэтому вычитание указателей работает правильно только когда указатели указывают на разные части одного и того же объекта.
> "1345" + 1
(адрес "1345") + 1, т.е., указатель, указывающий на "1345" + 1 = указатель на "345".
Выделить под массив динамически память.
Обращаться к элементам массива необходимо используя указатель.
1. В одномерном массиве, состоящем из n вещественных элементов, вычислить: - сумму отрицательных элементов массива;
- произведение элементов массива, расположенных между максимальным и минимальным элементами
double array = malloc(N sizeof(double));
попенсорс проект найди, читай код, фикси баги простые.
Например https://github.com/neovim/neovim/labels/good first issue
Спасибо, попробую
Запили свой динамический массив, который использует не realloc, а выделяет память чанками некоторого размера. Перегрузи всякие операции типа ++ и будет тебе счастье.
премного благодарен
Полный бред. Числа не вещественные ни разу, какие-то промежуточные копирования массива, хотя ты его и так не модифицируешь, задание не прочитал - произведение не то. Реально задача решается максимум двумя циклами.
по-моему этот код лучше
/ Задание 1: Написать программу в соответствии с вариантом, выделив под массив динамически память.
Обращаться к элементам массива необходимо используя указатель.
1. В одномерном массиве, состоящем из n вещественных элементов, вычислить: - сумму отрицательных элементов массива;
- произведение элементов массива, расположенных между максимальным и минимальным элементами./
#include <stdio.h>
#include <conio.h>
void main ()
{
int i,n,tmp1=0,tmp2=0;
int proizv=1,sum=0, max, min;
//vvod massiva
do{
printf("Vvedite kol-vo elementov massiva (<30)\n");
scanf("%d",&n);
}
while (n>=30);
float b[n];
for (i=0;i<n;i++)
{
printf("Vvedite element [%d]\n", i+1);
scanf("%f",b+i);
}
for (i=0;i<n;i++){
if ((b+i)<0){
sum+=(b+i);
printf("Summa otriz elementov matrici = %d\n", sum);
}
}
//max
max=b;
for (i=0;i<n;i++)
{
if ((b+i)>max)
{
max=(b+i);
tmp2=i;
}}
printf("Max element matrici = %d\n", max);
//min
min=(b+1);
for (i=0;i<n;i++)
{
if ((b+i)<min)
{
min=(b+i);
tmp1=i;
}}
printf("Min element matrici = %d\n", min);
for (i=tmp1+1;i<tmp2;i++)
{
proizv=proizv(b+i);
}
printf("proizv mezhdu min i max :%d",proizv);
}
по-моему этот код лучше
/ Задание 1: Написать программу в соответствии с вариантом, выделив под массив динамически память.
Обращаться к элементам массива необходимо используя указатель.
1. В одномерном массиве, состоящем из n вещественных элементов, вычислить: - сумму отрицательных элементов массива;
- произведение элементов массива, расположенных между максимальным и минимальным элементами./
#include <stdio.h>
#include <conio.h>
void main ()
{
int i,n,tmp1=0,tmp2=0;
int proizv=1,sum=0, max, min;
//vvod massiva
do{
printf("Vvedite kol-vo elementov massiva (<30)\n");
scanf("%d",&n);
}
while (n>=30);
float b[n];
for (i=0;i<n;i++)
{
printf("Vvedite element [%d]\n", i+1);
scanf("%f",b+i);
}
for (i=0;i<n;i++){
if ((b+i)<0){
sum+=(b+i);
printf("Summa otriz elementov matrici = %d\n", sum);
}
}
//max
max=b;
for (i=0;i<n;i++)
{
if ((b+i)>max)
{
max=(b+i);
tmp2=i;
}}
printf("Max element matrici = %d\n", max);
//min
min=(b+1);
for (i=0;i<n;i++)
{
if ((b+i)<min)
{
min=(b+i);
tmp1=i;
}}
printf("Min element matrici = %d\n", min);
for (i=tmp1+1;i<tmp2;i++)
{
proizv=proizv(b+i);
}
printf("proizv mezhdu min i max :%d",proizv);
}
Ну, C17 - это мелкие фиксы, никаких фич. И гораздо хуже, что Pelle дропнул поддержку 32-битных ОС. Компилятор, который не только не кроссплатформенный, но даже на собственной платформе не везде работает - это эталонное нинужно.
Поиск минимального и максимального элемента это уже два цикла, чисто в теории можно объединить в один, но нахуя? Есть такое условие в задаче?
За один можно управиться. А вот найти сумму между ними - уже второй.
> чисто в теории можно объединить в один, но нахуя?
Потому что гонять два цикла для такой простой вещи - идиотизм даже в нашем современном мире.
> Есть такое условие в задаче?
Нет. Но быть макакой стыдно.
Кстати, никто не мешает написать так
for (int j = 0; j < size; j++)
{
if (numbers[j] < min)
min = numbers[j];
if (numbers[j] > max)
max = numbers[j];
}
и не нужно создавать кучу циклов
Двумерный массив, содержащий равное число строк и столбцов, называется магическим квадратом, если суммы чисел, записанных в каждой строке, каждом столбце и каждой из двух больших диагоналей, равны одному и тому же числу. Определить, является ли данный массив А из n строк и n столбцов магическим квадратом.(размерность с клавиатуры+это должно быть решено чере указатели и должна быть выделена память через ,malloc)
если западло не пишите код,мне бы просто логику усвоить ,я делал аналогичную хрень без указателей ,но с ними ничего не выходит
В обычном массиве a[n][n] ты адресуешь элемент как a[y][x]. В динамическом массиве a[n ∗ n] ты адресуешь элемент как a[y ∗ n + x]. Суммы циклом посчитаешь, ничего сложного там нет.
Спасибо
Собственно вопрос, каковы подводные камни и стоит ли этим пользоваться (для реализации тех же виртуальных машин, например). Пока вижу единственный недостаток в том, что перед тем, ка использовать указатель, как указатель, если в его старших 16 битах что-то лежит, надо эти 16 бит обнулять (тут кстати неясно, почему ОС просто не игнорирует их, тогда бы не пришлось этого делать).
> почему ОС просто не игнорирует их
Потому что ОС их как раз игнорирует, а вот процессор очень обижается, если адрес не в канонической форме.
> надо эти 16 бит обнулять
Если бы. Туда надо дублировать 47-ой бит. Две лишних инструкции вместо одной.
> каковы подводные камни и стоит ли этим пользоваться
Если обязательно нужно вкорячить в указатель дополнительные данные, а сделать жирные указатели (т.е., структура с указателем и данными к нему) ну вот никак нельзя - пользуйся. Но это все грязные хаки, и нужно сто раз подумать сначала.
Алсо, если тебе нужно меньше бит (например, флаг какой-нибудь указателю поставить), лучше используй выровненные указатели, они портабельнее, и их фиксить проще: например, обычный malloc() без дополнительных телодвижений выравнивает на alignof(double) == 8 (обычно), и 3 младших бита - твои.
Но загадкой для меня является сочетание while (s).
Что это значит? Адрес, который s содержит, рано или поздно выйдет за границы массива. Если он пустой, то указателю присвоится значение 0 и цикл прервется. Но что если по этому адресу хранится какое-нибудь значение?
int puts (const char s)
{
while (s) putchar (s++);
return 1;
}
Если строка "пустая" ИЛИ выделено ноль памяти?
Если строка пустая или неуспех при выделение затребованной памяти.
А вообще это весьма неправильный способ проектирования программы, так как память можно выделять поблочно, а в представленном случае можно лишь сказать, что автор данной строки либо лиственник, либо конченный долбоёб.
>автор данной строки либо лиственник, либо конченный долбоёб.
Хуйня, норм код доя смузихлебов. Если по хардкору, то в чанк можно побайтово и копировать, без подсчета длины строки, если не додумался хранить длину в переменной.
А когда мы очищаем двойной массив с помошью функции free(mas), то массивы внутри этого двойного массива тоже автоматом чистятся ?:)
Собираюсь через переехать в спб из своей мухосрани, но есть еще 1-2 года в запасе, которые можно будет потратить на изучение разных штук и технологий. Я понял, что успешный байтоеб в 2019 году должен уметь: в C, C++, Linux, Linux Kernel и какой-нибудь скриптовый язык вроде питона и систему контроля версий, а также алгоритмы и структуры данных для собеседования.
Стоит ли игра свеч? Или лучше оставить байтоебство как хобби, а работать где-нибудь в вебе или энтерпрайзе?
int i; short b;
}
Как сделать union у которого бы b выводило старшую, а не младшую половину? Что-то типа
union {
int i; struct { short a, b } b;
}
Но только чтобы обращаться к старшей половине можно было бы не union.b.b, а просто union.b?
а стоп, я туплю
вот так, если компилятор поддерживает анонимные структуры
union {
int i; struct { short a, b };
}
ой код
#include <stdio.h>
#include <limits.h>
int main(void)
{
int a=1000,c,b;
stop:
scanf("vvedite cteneh:%d",&c);
for(b=0;b!=INT_MAX;b++)
{
a=a>>b;
if(b==c)
{
break;
}
printf("%d\n",a);
}
goto stop;
}
Сделай это битовой операцией, хули ты. Обращаешься в твоём случае к i, и делаешь (i & (0xFFFF << 16))
Но лучше не используй инт, используй unsigned int, а то после такого сдвига настанет пиздец знаковому биту.
Аноны, может кто нибудь знает как найти параметры функции в памяти? И как они вообще расположены?
Возможно есть статейки на эту тему.
int sum (int n, ...)
Как найти адрес в памяти остальных параметров?
В последний раз попрошу анона помочь найти в оцифрованном виде и больше не буду вскрывать эту тему.
>index & 0x1f тоже самое, что index % 32,
Я реально сейчас в катарсисе. Почему я не знал об этом? Это же гениально.
Что быстрее вычисляется, остаток или AND, я думаю вопрос риторический.
Хотя:
Optimizing compilers may recognize expressions of the form expression % constant where constant is a power of two and automatically implement them as expression & (constant-1). This can allow writing clearer code without compromising performance.
> Optimizing compilers may recognize expressions
Да. Каждый первый компилятор умеет в умножение через lea и/или сдвиги, деление через сдвиги и остаток через &. И еще умеют деление умножением заменять. Но
> This can allow writing clearer code
это хуйня полная. В варианте с & сразу видно, что оно маскирует биты, видно, сколько битов и все такое. А с % надо об этом думать. Традиционно, для улучшения понимания происходящего, даже после того, как компиляторы научились оптимизировать, если дело касается битоебли, используют сдвиги и логические операторы, а если не касается - нормальные умножение, деление и остаток.
Ну в памяти оно лежит в все подряд, тебе только нужно определиться что за тип данных, колличество и порядок элементов передающихся в такую функцию, выцеплять можно через указатель, например. Просто добавить к нему 1 и получишь следующий после адреса "n" адрес.
https://rsdn.org/forum/cpp/418970.1
Первая же ссылка в Гугле, можешь ещё по теме поискать.
Анончи, можно ли на Си создать двумерный массив, второй элемент которого является массивом переменной длины:
[
...
[0, [1, 2, 3, 4, 5]],
[1, [1, 2]],
[2, 0]
...
]
> Ну в памяти оно лежит в все подряд
> выцеплять можно через указатель
Ни в коем случае нельзя так делать. Это работало с 32-битным __cdecl в x86. В современном мире параметры могут лежать и в SIMD-регистрах, и в обычных, и в стеке, в зависимости от их типа и ABI в целом (т.е., va_arg(ap, int) и va_arg(ap, float) могут читать из разных мест). Поэтому #include <stdarg.h> va_list, va_start, va_arg, вот это все.
>>296392
Статически - красиво никак нельзя не заставить компилятор сгенерить безымянные вложенные массивы, и это очень огорчает, когда тебе нужно задавать статически всевозможные древовидные структуры в Си, но можно сделать это явно, по частям, как макака: https://ideone.com/P0qbBE
А чего вам не нравится? Про руки я пошутил, для ленивых есть кодогенерация. У меня в одном из проектов килобайт этак 60 таких вот массивов, разве что слегка сложнее: там список типов сущностей, списки их свойств и дочерних сущностей, ну и методы всякие, для манипуляции и (де)сериализации. Нужно было такое на крестах писать, но когда я это осознал, было уже поздно.
Есть соглашения о передаче аргументов в функцию.
Для amd64 Linux, System V ABI:
Первые аргументы в регистрах rdi, rsi, rdx, rcx, r8, r9, иногда еще xmm.
Остальные лежат в стеке задом наперед.
>есть кодогенерация
Это понятно. Я еще вариант придумал, хранить data в сплошном бинарном массиве, а в инициализации указывать ссылку на этот массив и смещение. Какой вот стул выбрать, пока не ясно. И тут вопрос, не распидарасит ли конпелятор мой бинарный массив, похеря смещения.
Бля. Ты прав. Я вспоминал об этом варианте, но когда-то раньше у меня с ним были какие-то проблемы, и я даже не удосужился затестить, когда отвечал тут >>296433. Кстати, можно обернуть инициализатор в макрос, тогда и нуль-терминатор не понадобится.
>>296679
Сам посчитай: https://www.sqlite.org/2018/sqlite-amalgamation-3250300.zip Похуй, сколько строк в файле. Программу разбивают на модули по смыслу, и чтобы не пересобирать и не линковать лишнее из-за мелких изменений. А к читаемости это никак не относится. Ну, разве что ты пользуешься модными "редакторами" на электроне, но в таком случае ты сам выбрал страдания.
>Кстати, можно обернуть инициализатор в макрос
Оставить поле длины и подсчитывать макросом? Кокой же вариант выбрать, хм...
Есть ли гайды как запилить свой memory pool?
Может кто-нибудь посоветовать какую-нибудь литературу по ipc/параллельному программированию в POSIX и System V? Не по основам, с безопасными реализациями алгоритмов.
{
func1();
func2();
pthread_create();
}
Тут все функции выполнятся строго по порядку, или компилятор может сделать так, что pthread_create() начнёт выполняться раньше?
решил я тут пдставить очко под этот ваш си, ебать, че там скачивать нужно, нотпад хуе мое?
стремящаяся-умственно-отсталая-веб-обезьянка
Create a function ft_count_if which will return the number of elements of the array that return 1, passed to the function f.
The array will be delimited by 0.
Нужно создать ф-цию которая возрвращает число эл-ов массива который возвращает 1? Или как более точно перевести. Не пойму что требуется в этом задание
Нужно создать функцию, которая считает элементы массива которые подходят определенному условию, соответственно тебе нужно сделать так чтобы она принимала сам массив, количество элементов в нем и какой-либо предикат. Вот вроде функции remove_if в этой статье - https://ru.cppreference.com/w/cpp/algorithm/remove
Где-то читал, что функция создания потока может стартануть раньше, но раз это не так, то ок.
Есть ли библиотеки для написания простеньких игр на Си?
Другой пример:
int main () {
printf("Hello");
sleep(3);
system("clear");
printf("World\n");
}
Здесь мы получаем HelloWorld, очевидно, т.к. printf - line buffered
Так же в коде
int main () {
printf("HelloWorld");
while (1) {
}
}
Сообщение HelloWorld никогда не будет выведено на экран.
Однако при
int main () {
printf("HelloWorld");
return 0;
}
сообщение HelloWorld все-таки выводится на экран. Как я понимаю, это происходит на этапе завершения программы, т.е. после return 0 (или при/до return 0?) программа видит, что data, предназначенная для stdout, не была доставлена и все еще висит в буфере, поэтому программа самостоятельно принудительно флашит stdout ("выплескивает" данные из буфера в stdout). Правильно я это понимаю?
Ну и тут снова тот же вопрос, что и с scanf'ом - зачем нам вообще нужно line-буферить printf? Почему бы сразу не кидать все в stdout?
Помимо этого, интересно, какая размерность у буфера?
Можно ли отключить буферизацию?
Составить функцию для слияния двух упорядоченных по возрастанию массивов целых чисел.(используя функцию вне мэйна)
под слиянием имеется ввиду не сложение соответствующих элементов,типа 0-й из 1-го массива+0-й из 2-го массива=0-й в новом массиве,а именно запись их в ряд по возрастанию
не знаю шо робiтi(
Нахуя, я, поставил, там, запятую?
> Однако я не понял, почему при буферизации чтения и записи идет выигрыш в производительности
В этом же самом треде: >>289184
> Так вот, зачем функция помещает эту запись сначала в буфер, а лишь затем - в массив?
Иначе fscanf будет ходит в ядро за каждым символом.
> Как я понимаю, это происходит на этапе завершения программы
Выход из main = exit(кодвозврата), exit = fclose всех файлов, fclose = fflush перед закрытием.
Поясните про задачку с getchar, что почти в самом начале. Почему выводится все, что я ввел, а не только первый символ? Как работает цикл в данном случае, он получается прогоняет getchar до того момента, когда брать больше нечего, или как? Тупой вопрос наверное, но лучше уж сразу в таких основах разобраться основательно.
#include <stdio.h>
int main()
{
int i = 1, x = 5, n = 5;
scanf_s("%i %i", &x, &n);
while (n > 0) {
i = i * x;
n = n - 1;
}
printf("%i", i);
return 0;
}
Потому что майкрософтоговно ненужно. Используй scanf, а всем, кто будет возникать, говори #define _CRT_SECURE_NO_WARNINGS "Fuck you"
1.5.1. Копирование файла
При наличии функций getchar и putchar, ничего больше не зная о вводе-выводе, можно написать
удивительно много полезных программ. Простейший пример — это программа, копирующая по одному
символу с входного потока в выходной поток:
чтение символа
while (символ не является признаком конца файла)
вывод только что прочитанного символа
чтение символа
Оформляя ее в виде программы на Си, получим
#include <stdio.h>
/ копирование ввода на вывод; 1-я версия /
main()
{
int с;
с = getchar();
while (с != EOF) {
putchar (c);
с = getchar();
}
}
Конкретизируй. Если просто говорить новичку в какой-то области "это говно, а вот это не говно", то он никогда ничему у тебя не научится. Надо объяснять почему это говно.
пидор - это когда провели хуем по губам
Желательно AVR, но по факту похуй - надо на чем-то будет набить руку. Знаю азы Си, но хотелось бы погонять его там где он чаще и применяется (плюс у меня специальность радиотехника, с МК часто приходилось иметь дело, но вот сам я их не прогал)
В хуяпку. Пошел нахуй со своими школьниками.
заебись, после просмотра я закодил и теперь получаю 100к мес
Есть ли что нибудь встроенное чтобы проверить содержит ли string букву или слог? в идеале что-то вида:
s.contains("xy") -> Boolean
Параллельно с Пратой, начал изучать Тененбаума (ОС).
Пришла в голову дикая мысль - а что если купить 486 старый комп как полигон для написания разного софта по книге? Домашний ноут стремно трогать, я же нуб криворукий, сломаю еще что-то.
Совсем дебильная идея, или стоит все-таки?
Собираюсь ковыряться близко к железу.
Пошарься по вк, типа отдам даром. Я б в своём городе отдал пару системников без жд, но ты не в моей мухосрани же. Другое дело, что тебе это может быстро надоесть и лучше потренироваться на эмуляторах.
Лучше виртуалку, там можно настраивать пека твой, хочешь 2гб памяти, а хочешь 8 мб, процессор, частота, сетевая карта, мышка, все что нужно.
а зачем делать буферизацию руками то? ну ты че
ввод-вывод стандартной библиотеки сишной буферизированный по умолчанию, причем более-менее оптимизированный под текущую платформу где рантайм сишный скомпилен, плюс есть функции записи буферизированных данных, функциии управления буферизацией
ребята, которые пилят основной сервис - почту на майлру, к примеру, пользуются стандартным вводом-выводом, им хватает по производительности.. просто в нужных местах в коде сбрасывают буфер и все.. когда надо..
Too slowly! Should be use chunk of bytes for hasteful code, honey!
>Потому что под маской всевозможных сканфов/принтфов скрываются системные вызовы read/write. Системный вызов - достаточно дорогая операция, в этом вы можете убедиться, к примеру, написав программу копирования содержимого одного файла в другой с помощью read/write (по 1 символу) и различных функций ввода/вывода из stdio, при это посмотрите время работы обоих программ. Разница будет коллосальна. Решение является буферизация содержимого. То есть вы складываете ваши символы в буффер и изредко его записываете с помощью write. То есть пишете не 1000 раз по 1 символу, а 1 раз 1000 символов, тем самым обращение к ядру, которое является столь долгим, происходит редко.
Ну, начнем с того, что это давно уже не так и там давно уже применяется mmap/MapViewOfFile, работающих напрямую со страничным механизмом OS.
> mmap/MapViewOfFile
Это когда у тебя программа сегфолтится при вытаскивании флешки, с которой был открыт файл? Хороший механизм.
> что это давно уже не так и там давно уже применяется
Где там?
Хуета
Что аргументировать, тебя анон жирно протроллил, я в этом посте на это указал - >>298261
Дальше отвечал уже не я. Суть в том что те функции которые ты используешь добавлены мелкомягкими чтобы предотвратить гуляние по памяти в случае отсутствия в конце строки нуль-терминатора, по сути они эквивалентны обычным, только в функциях с "_s" в конце ты так же указываешь предел на котором функция должна остановиться в случае отсутствия нуль-терминатора. В IDE под linux и MAC, и на сайте ideone таких функций нет, потому-что они выпускаются не мелкомягкими.
> тебя анон жирно протроллил
Где я его потроллил? Предложение задепрекейтить Annex K в С21 как бесполезный и неиспользуемый уже обсуждалось рабочей группой. Хуй знает, правда, приняли или нет, но дело к тому шло.
> чтобы предотвратить гуляние по памяти в случае отсутствия в конце строки нуль-терминатора
Не только. Там есть и другой контроль границ. Например, когда строка не влезла в буфер целиком, в Си она обрезается, а у Microsoft возникает constraint violation. В любом случае, все, что есть в Annex K без возможности выбора, нормальными людьми реализуется по необходимости максимум двумя дополнительными строками кода. Просто майкрософт считает, что это круто, когда нужно повторять повторять размер буфера для memcpy_s().
Подскажите, видел кто в открытом доступе эту книгу, хочу с ней познакомиться!
на рутреке только по плюсам, джаве, шарпе..
#include <stdio.h>
#include "Fuck_your_mather.h"
void fuck_mather(){
FUNC_FUCK_YOUR_MATHER == TRUE;
}
void main(int argc, char *arhv[]){
while(TRUE){
(FUNC_FUCK_YOUR_MATHER == TRUE) ? printf("Suck me dick bitch!/n") : void fuck_mather();
}
}
Хочется что-то интересное и полезное
вливайтся в опенсорс, епт
не шучу
не на гитхаб иди
у того же гнома сотни проектов, систем и программ которые надо доделывать и дорабатывать
https://developer.gnome.org/
Деды, не бейте, лучше обоссыте, но ответьте на вопрос! Нужна библиотека простой 2d графики для сишки. Ну грубо говоря чтобы там можно было визуализировать всякие простые физические процессы например молекула отскочила от стенки сосуда лол, какие-нибудь аналоговые часики сделать, солнечную систему, такого вида Что посоветуете?
Обязательно должно работать в линупсе и желательно, чтобы это была для него родная библиотека.
Мне кажется это через чур сложная штука для моих задач. Я думал может взять какое-нибудь GTK+, там же есть вроде виджеты, в которых можно рисовать? Но что-то литературы по gtk3 вообще нет, все по gtk2.
Но проблема в том, что СПО на 99,9% состоит из говна (на самом деле на 100%, но не будем категоричны).
Из 100 не СПО, СПО где-то 98,7%
Box2d
Охуительный у тебя враппер конечно
Все знают про тысячи полуграмотных индусов, пишуших платное ПО неземного качества?
Так вот СПО пишут те же индусы, только в свободное время, бесплатно и с результатом, за который никто не отвечает.
Все лучшее СПО (те самые 0,01%) суть бывшее платное, чуть допиленное сообществом (кроме GIT). Либо крякнутое. Крякнутое платное ПО - лучшее по качеству, не знаю почему так получается.
Например, некоторые упоротые сравнивают LibreOffice и MS Office.
Казалось бы, как можно сравнивать? Вообще разные весовые категории. Но не стесняются и сравнивают.
scanf умеет динамически аллоцировать память и возвращает указатель, потом нужно юзать free на поинтер
делой man scanf примерно в конце было даже с примером
char *p;
int n;
errno = 0;
n = scanf("%m[a-z]", &p);
if (n == 1) {
printf("read: %s\n", p);
free(p);
} else if (errno != 0) {
perror("scanf");
} else {
fprintf(stderr, "No matching characters\n");
}
Ты вообще не разбираешься в вопросе.
> Так вот СПО пишут те же индусы, только в свободное время, бесплатно и с результатом, за который никто не отвечает.
СПО в основном пишут богатые белые представители загнивающего запада, у которых есть свободное время на хобби и не стоит вопрос сдохнуть с голода.
>СПО в основном пишут богатые белые представители загнивающего запада
Да ну?? Почитай любые вопрос-ответ треды, каждый первый ответ - ДИНЕШ и РАДЖЕШ
Но.. Если ты прав.. Пиздец. Все гораздо хуже чем я думал.
Какая семья в 13 лет??
индусы очень мало делают вклада в спо
даже русских там больше чем их
основной вклад - белые европейцы и сша, мужчины
черные, желтые и бабы вообще мало кода пишут, это реальность
хотя насчет желтых погорячился, китайцы и японцы ебашат спо тоже чутка
Еще видел онлайн компилятор, который код C показывает в ассемблер виде, но уже не нахожу ссылку
Are you a god?
а представь, как мужику живется с такой фамилией
Ты охуеешь наверное, но мне на днях ещё и 40 исполнилось. Имею твердое желание выкатиться в embedded джуном.
Господин Тененбаум?! Как вас сюда занесло?
Ну он же написал:
> Собираюсь ковыряться близко к железу.
> Имею твердое желание выкатиться в embedded
Одной лишь сишечкой в embedded не обойтись, всегда будут всякие специфичные для платформы вещи, да и саму платформу понимать стоит, если цель - не хелловорды не только светодиодами мигать. А что касается x86, то железо, используемое там, либо очень сложно программировать для начинающего (современное), либо давно устарело и с embedded не пересекается вообще. Лучше сразу взять какую-нибудь малинку, стмку или даже аврку на худой конец, чем разбираться в давно никому не нужных тонкостях работы 8272A.
Спасибо за ответ!
Это я спрашивал.
То есть ты даже 286 не советуешь?
А с чего начать? У меня есть такое ощущение, что начинать с Малинки вместо контроллера, это как вместо С учить сразу С#.
> что начинать с Малинки вместо контроллера, это как вместо С учить сразу С#
Можно дрова в линуксе писать, а можно экономить байты. Эмбеддед - это не только микроконтроллеры с килобайтом рамы.
Си лучше учить на своей пеке, а не ебаться с кросскомпиляторами и удаленной отладкой. А поиграться со знаниями, почерпнутыми из Танненбаума, можно на qemu-system-xxx, реальная железка не нужна, особенно поначалу.
> То есть ты даже 286 не советуешь?
Можно, конечно, листать пыльного Джордейна, писать демосцены 16-битным кодом, но зачем? Что ты с этими знаниями делать собираешься? Ну ладно в российских вузиках мсдос в студентов пихают, потому что преподы ничего другого не знают. Студенты сдали и забыли, а самостоятельно-то зачем в это вляпываться?
Здоровья и счастья тебе.
#include <stdio.h>
int main()
{
int M[100000], n, i = 0, x;
int a=0;
scanf_s("%i %i", &n, &x);
while (i < n) {
i=i+1;
scanf_s("%i", &M);
}
i = 0;
while (i < n) {
i = i + 1;
if (x == M) { a = a + 1; printf("%i", i); }
if (a == 0) printf("%i", a);
}
scanf_s("%i %i", &n, &x);
return 0;
}
Проблема проявляется только когда я пытаюсь добавить в программу проверку на отсутствие числа в массиве, чтобы выводился 0.
Программа работает так: вводишь размер массива, через пробел вводишь искомое число. Далее через энтер заполняешь позиции в массиве, в одной из которых может быть или не быть искомое число. Если число есть, выводится позиция числа в массиве, если числа нету - 0.
Ладно, я сам нашёл ошибку. Тема закрыта.
Ты unix'овые вызовы пытаешься использовать. Лучше поставь linux-виртуалку и там же и пиши.
Под Windows у тебя есть VirtualAlloc()/VirtualFree(), их и используй. Ну и еще Pelles C поддерживает _mmap(), в аллокаторе можно им одним обойтись.
(В примерно хронологическом порядке)
C Primer Plus -- Stephen Prata
Data Structures Using C -- Langsam, Augenstein, Tenenbaum
Algorithms in C -- Robert Sedgewick
Structured Computer Organization -- Andrew Tanenbaum
Modern Operating Systems -- Andrew Tanenbaum
Computer Networks -- Andrew Tanenbaum
Что потом - не знаю, надеюсь там будет видно.
Цель - эмбеддед/гейм/.... То есть поближе к железу, плюс физика, механика, матрички, вот это вот все.
> У меня уже есть вышка, я инженер-механик. Мне уже много лет.
Ну это типа не в плюс, а в минус при обучении. Потому что если ты собрался учить сишку с нуля, очевидно в вузике ты совсем не погроммировал.
После вдумчивого изучения направлений и доступных материалов для самостоятельной работы, а так же подобных универститетских и колледжских програм, пришел к данному списку.
Это минимум, база, после которой можно, собственно, думать о вкатывании.
Я ориентируюсь на где-то год. Но если возьмет 2 то так тому и быть. К сожалению, я не вижу других вариантов.
С благодарностью приму поправки и советы от бывалых.
Ну тащемта для вкатывания гораздо важнее практический опыт, чем какие-то теоретические знания. Если ты не знаешь и трети, что написано в этих книгах, но имеешь какой-то более-менее полезный пет-прожект, для работодателя ты будешь на порядок интересней теоретика, прочитавшего тонны книжек, но не имеющего никакого опыта.
Ну почему же. Я программировал, но больше функции для вычислений. Использовал С как продвинутый калькулятор так сказать.
Ну и MatLab в основном.
Я довольно быстро (как мне кажется) схватываю материал, единственное препятствие для меня сейчас - нехватка свободного времени.
Скачал лекции про ОС, слушаю пока еду на работку.
>для вкатывания гораздо важнее практический опыт
Абсолютно согласен, через год будет понятно как подступиться к прожекту, тем более идейки у меня есть.
к&r читани корка от корки, все упражнения сделай, не игнорируй приложение, медитируй над ним, это нужно
по структурам и алгоритмам ебани пару курсов, хотя бы на том же спепике, плюс заебашь 200-250 (больше нахуй не надо) алгоритмических задач хотя бы на том же hackerrank или на любом подобном, десятки их щас
дальше уже ходи по собесам, вкатывайся за еду бля
а так ты скорее с голоду сдохнешь читая весь тот лольный список что ты себе составил
>по структурам и алгоритмам ебани пару курсов
Я реально быстрее учусь по книгам. Если бы было время смотреть курсы, я бы за это время уже закончил свой лольный список.
о хо хо
>
я не про видеоуроки от васянов на ютубе
я про курсы где есть упражнения и задания, где надо делать кодинг и где есть проверяющая система
от того что ты там че то читаешь или смотришь в голове остаешься 0
вы, кстати, чутка неправильно оборот используете
"пет прожект" это вообще то когда сформировавшийся кодер у которого есть уже основная работа по выходным ебашит что-то приятное ему вдобавок
это как у линукса есть собственно операционка, и пет-прожект это он на qt (лол) пилит какую-то приложуху для учета статистики дайвинга
Какие вилки у мидлов-сеньеров системных программистов в ДС? Интересуют крупные компании типо Яндекса, мейла, касперского и тд.
Хочу читать этот список >>301473, но вместо этого решил читать /pr.
Какие подводные?
О, спс, не знал про этот сайт. Просто недавно апнули с джуна до мидла, спрашивали сколько я хочу (получилось 130к чистыми, 150 gross), теперь думаю не продешевил ли.
Хуйня, не ссы главное сиди днями занимайся этим и перерывы делай. Хотя кому я пизжу, сам сижу каждый день марафоню.
Не... Нужно отвлекаться все же, на изучение самой системы, использования Сишки для упрощения жизни на Шлинуксе или там, ради себя ебни бсдшку и поизучай параллельно. Этот мир не только об одном языке, заебешься. Его нужно использовать, тебе тот же Прата скажет тоже самое, что развитием нужно заниматься используя язык.
Я угараю еще как многие на шлинукс приходят и игнорируют баш скрипты.
Еще на Гитах сидеть код разбирать. Не надо одни книжки читать, ебаш форумы. Ну я говорю просто как я делал.
Алсо туториалы - Нахуй. Чем ты отличаешься от других тогда, если ебашишь одно и тоже?
nullprogram.com
Я поехавший ванаби который каждый день пишет на Си и мечтает в будущем переехать на ассемблер, планирую в сфере хакинга использовать.
Щас тема интересная, где типа вирусы можно писать на уровне железа.
> Вот у меня есть gcc
Кросскомпилятор для AArch64 или обычный для x86-64? Если обычный, то тебе нужен кросскомпилятор. Качаешь http://releases.linaro.org/components/toolchain/binaries/ распаковываешь, компилируешь. А еще лучше качаешь NDK: https://developer.android.com/ndk/downloads/, распаковываешь (компиль в папке toolchains, сисрут внезапно в sysroot), компилируешь.
> Как компилировать?
Точно так же, как обычно, только с правильным --sysroot.
А хуль понятного то? Найди мне работу. Я уже заебался на гите и гитлабешнике сидеть.
Хуй знает, попробуй сам найди, я вообще дрочил полгода плюсы, а потом устроился на работу, сейчас ебашу драйвер на си.
Винда, MSVC или MinGW, которые линкуются к сломанной майкрософтом CRT, которая хочет %S? Больше идей нет.
У тебя вообще ничего не печатало? Локаль выставлял?
#include <wchar.h>
#include <locale.h>
int main(void)
{
setlocale(LC_CTYPE, "ru_RU.UTF-8");
wchar_t wtext[] = L"строка";
wprintf(L"%ls\n", wtext);
}
Потому что у потока есть ориентация, и если ты однажды пишешь в него wide, ты больше не можешь mbcs. И наоборот. Можно только явно менять ориентацию с помощью fwide. Связано это с особенностями многобайтовых кодировок, в том числе и UTF-8, но особенно всяких Shift-JIS.
> То есть я отдельно вызываю препроцессор
Генерируй .i, а не .c.
> Помогите найти ключ gcc, который отключает препроцессор
-x cpp-output, но вариант с расширением правильнее.
Тону чая тебе, антош.
>>1305157 (OP)
>>1305157 (OP)
>>1305157 (OP)
>>1305157 (OP)
Тем временем понемногу начинают редактировать черновик C20/21: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2310.pdf
Это копия, сохраненная 5 января 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.