Этого треда уже нет.
Это копия, сохраненная 5 января 2019 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
C Programming Language.png78 Кб, 792x1023
C Programming Language #35 /clang/ # OP 1287378 В конец треда | Веб
Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.

Пожалуйста, пользуйтесь 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/
2 1287380
>>287378 (OP)
Первыйнах1
3 1287550
ПравоСССССССССлавный перекот.
1537902533781.jpg806 Кб, 1280x720
4 1287565
Вкатился и упал на спинку..
5 1287722
Стоит ли ставить линукс, если собираюсь всерьез заняться сями?
6 1287723
7 1287728
>>287723
А зачем?
8 1287729
>>287722
Нет.
9 1287731
>>287728
Он не дырявый как венда. Да и с такими вопросами пиздуй в /s.
10 1287741
>>287731
Там не пояснят зачем это нужно как программисту, там в /pr отправят.
11 1287743
>>287741
Ну, как программисту это тебе нужно для ручной автоматизации сборки скриптиками на баше или мейком. Хотя это можно и в сигвине вроде делать. Пожалуй на этом вроде заканчивается. Дальше идут особенности операционки: меньше вирусов, меньше тормозов, но зато ебля с драйверами и пердолинг с конфигами. Хотя против венды ещё скажу, что очень много языков поставляется из коробки в большинстве основных дистров.
12 1287746
>>287743
Ну я с cmake и make и на винде могу работать. меня больше волновал вопрос нужности знания лигукс апи.
13 1287750
>>287746
Но если ты на винде в студии пишешь, то ты говно, а не сишник, если что. ИМХО
14 1287752
>>287743
В линуксе удобно ставить языки и либы через apt install или pacman -S и т.п. Это вот точно удобно.
15 1287755
>>287750
Пишу на mingw через vscode или clion. Довольно удобно. И не занимает 30 гигов как студия.
16 1287757
>>287746
Линукс АПИ? Дак, это вроде Си использует винАПИ. Потому что для линуксов си - родной язык, на котором ядро в общем-то пишется.
17 1287758
>>287757
Ну как это назвать, системные вызовы вроде.
У самого какой дистр стоит?
18 1287760
>>287758
Убунту. Самый лучший для переката с венды.
19 1287762
Поясните за звездочку перед названием функции.
Это значит, что функция возвращает массив?
20 1287764
>>287760
Kubuntu, xubuntu или чисто бубуха?
21 1287766
>>287762
Привели пример кода, я тебя не понял.
Снимок.PNG27 Кб, 492x806
22 1287770
>>287766
Вот.
Кстати оно почему то не выводит массив, который я прошу
23 1287779
>>287770
Это звездочка не перед названием функции по сути, это звездочка относится к типу возвращаемого значения. Ты можешь писать
int✡ func
int ✡func
int ✡ func
Разницы это не имеет. Просто главное что ты возвращаешь указатель на тип данных int. Если ты не знаешь что такое указатель - то прошу читать книжки и статьи, ибо рассказывать это здесь нет смысла - все и так разжевано.
24 1287783
>>287779
Нет я в курсе.
Просто получается если не ставить звездочку возле функции. То компилятор будет думать, что возвращает не массив , а просто int единицу?
15397158126450.jpg13 Кб, 200x200
25 1287787
>>287779

>✡


угарно
26 1287789
>>287783
Да. Но желательно пойми суть указателей.
Например arr[3] это равнозначно *(arr+3). Потому что стандартный массив это указатель вроде на первый элемент, и написывая [3] ты указываешь на то, что надо отчитать 3 блока памяти размером с тип данных указателя и взять оттуда блок памяти размером с тип указателя.
27 1287790
>>287787
Хохму отмочил.
Двумерный жидомассив:
int✡ ✡ shekeli = (int✡ ✡ )malloc(YOUR_MUM_MONEY);
28 1287791
Ой-вей. Обожаю наёбывать гоев на байтекели.
29 1287808
>>287750

> Но если ты на винде в студии пишешь


Если ты не умеешь в современные IDE, то ты говно, а не программист. Иди дальше sed-ом рефакторь, а less-ом логи gprof листай.
30 1287825
>>287808
Студия как по мне слишком громоздка. Продукты от jetbrains лаконичней, имхо.
31 1287856
>>287743
На винде тоже есть шелл-скриптинг и ее автоматизациияведь билл всегда следит за юникс системами и пиздит оттуда идеи
32 1287862
>>287856
Неоднозначная ситуация. С одной стороны вонючая командная строка, с другой стороны, чтобы переехать на повершелл у всех сборка из коммандной строки и никто ни за что в повершелл не переедет, продолжая жрать говно из комнадной строки. В пинусе же баш в основном как шел используется в терминале. С этим тут всё более однозначно, хотя выбора никто не лишён. Хотя есть кое-какая проблема у баша. Он не поддерживает работу с плавающей точкой. Повершелл поддеживает. Может можно как-то исправить, не велосепидируя собственных утилит?
33 1287870
>>287862
В винде есть батники, есть mingw со всеми линуксовыми утилитами, в том числе и с bash. А повершелл - это высер, превращающий командную строку в какие-то тормозные заклинания. Ненужен.
15109422445800.jpg29 Кб, 345x336
sage 34 1287896

> 2018


> не интерпретация

15393459148760.jpg17 Кб, 400x214
35 1287903
1289809101053s.jpg15 Кб, 184x200
36 1287931
>>287896

>2018


>долбят говно Си когда есть элегантный и такой же быстрый Crystal

15402349419760.jpg9 Кб, 200x200
37 1287936
>>287931
Ну ка расскажи, насколько у этого новоиспеченного языка большая библиотека? Насколько большое комьюнити? Все ли протестено и возможно?
1281001764197s.jpg14 Кб, 151x200
38 1287941
>>287936
Да, экосистема маленькая, но все же лучше чем пердолиться с Си который застрял в 2005.

У Кристала как минимум пакетный менеджер есть. И есть уже компании которые его в проде используют. Дело лишь за популяризацией.
39 1287947
>>287941
Еще один хипсторский мертворожденый язычок, ясно.
40 1288008
>>287941
Лучше бы про божественный interop с сишным кодом сказал.
41 1288009
>>287764
Ты это, ещё три DE забыл перечислить. Различия между ними только в DE.
В чём «чистота» «чистой убунту»?
Есть даже all-in-one дистрибутив
42 1288011
>>287862

> Может можно как-то исправить, не велосепидируя собственных утилит?


Да, попробуй программу bc.
14782817458820.jpg14 Кб, 472x464
43 1288012
>>287941
>>287936
>>287931
Эй, васьки, вы про Nim-то слышали?
44 1288022
>>287931

>Crystal


Очередной ноунеймЯП уровня йопта-скрипта с сишным синтаксисом. Причём это среднестатистическое описание любого языка младше 2000 года. Я не глядел описание, честно. Давай просто сравним количество гаедов к обоим ЯП. Всё, отсыхай.
45 1288036
>>288022

>с сишным синтаксисом


Не, там какое то говно между Паскалем и Питухоном

class Object
def has_instance_var?(name) : Bool
{{ @type.instance_vars.map &.name.stringify }}.includes? name
end
end
46 1288037
>>288036

>end


>2018

47 1288041
>>287931
О, а вот и сойбойчик подъехал, всю сою слизал?
48 1288060
>>288022
>>288036
Долбоебы, вы руби хоть раз видели?
49 1288064
>>288060

>руби


говноед, уходи пожалуйста
50 1288106
>>288022

>сишный синтаксис


>я не глядел


Оно и видно, что не глядел. Там Рубишный (то есть самый идеальный) синтаксис.
51 1288111
>>288106
Как же вы заебали набеги устраивать. Треды нужны не для ЯП срачей, дауны.
52 1288163
Нахуя в си тип unsigned? Типа почему бы блять тупо функцией принтф не указывать способ вывода: %u или %d имея лишь тип int. Или я чего то недопонимаю
53 1288179
>>288106

>Рубишный (то есть самый идеальный) синтаксис


Турецкое говно не нужно.
54 1288189
>>288163
unsigned поддерживает битоебство, добавляет бит в диапазон значений, для него определено поведение при overflow/underflow
а ещё пачка возможных багов при сравнениях signed-unsigned и вообще при неосторожном использовании unsigned
карочи, нужен ровно в тех местах, где надо битоёбствовать, в остальных местах лучше использовать int
55 1288211
>>288189
Я так и понял, а на переносимость это может повлиять?хотя какая нахуй переносимость че я блять несу, о какой блять переносимости может идти речь если уже давным давно есть языки-конструкторы вроде питона, мда ну пиздос
56 1288215
57 1288224
>>288064
Он просто указал с чего взят синтаксис у Crystal. Что ты петушишь? Неадекват что ли?
>>287936

>насколько у этого новоиспеченного языка большая библиотека?


Вроде либа поддерживает либы с Ruby, так что с этим почти нет проблем.
>>287931

>такой же быстрый Crystal


Ты хотя бы тесты сам проделай прежде чем вбросы делать.>>287896

>> 2018


>> не интерпретация


Поинтерпретируй ты мне тут в лоу левел программировании, петушок.
>>287862

>и никто ни за что в повершелл не переедет, продолжая жрать говно из комнадной строки


Powershell как по мне то еще говно. Все равно у юниксов пизже
58 1288291
>>287941
Ну вот как популяризуете свой язычок, так и приходите (через лет 15)
15402349419760.jpg9 Кб, 200x200
59 1288295
>>288224

>насколько у этого новоиспеченного языка большая библиотека?


Вроде либа поддерживает либы с Ruby, так что с этим почти нет проблем.

>вроде

60 1288340
>>287936
Вот биндинги к С либам https://crystal-lang.org/docs/syntax_and_semantics/c_bindings/ . Все, что есть в С, доступно в кристале с минимумом усилий.
61 1288384
>>288340

>C не нужен


>мы используем C либы


>Ой, а вот этого нет, сишники, когда новая либа?


>C не нужен

62 1288389
>>288163

> Типа почему бы блять тупо функцией принтф не указывать способ вывода


Это работало бы, если бы у тебя было только сложение и вычитание. А вот реализации деления и умножения разные для signed/unsigned.
63 1288701
Какие части программы целесообразно переписывать на Си? Городить абстракции гораздо удобнее на С++, так ещё и неймспейсы помогают писать менее громоздко, что приятно видеть в проектах чуть больше хелоуворда, но что в проекте точно должно быть на Си?
64 1288702
>>288701

>в проекте


Коком проекте?
65 1288717
>>288702
Vasya Pupkin’s home page
66 1288785
>>288701
ничего
67 1289056
Степан Прата молодца, хорошо зделали
68 1289059
K&R - больше справочник, от шарящих шарящим. Для, собстенно, обучения не подходит.
69 1289061
прохожу его. и искренне охуеваю от заданий уровня "Напишите операционную систему" на первой главе.
70 1289062
>>289061 это насчёт этого >>289059
71 1289064
>>289061

>прохожу его. и искренне охуеваю от заданий уровня "Напишите операционную систему" на первой главе.


Ты о чем, уважаемый? Я седьмую закончил, нет там такого.
72 1289066
>>289062
А, ясно.
Непонятно почему KR советуют новичкам везде.
73 1289068
>>289064
Упражнение 1.24. Напишите программу, проверяющую Си-программы на элементарные синтаксические
ошибки вроде несбалансированности скобок всех видов. Не забудьте о кавычках (одиночных и двойных),
эскейп-последовательностях (\...) и комментариях. (Это сложная программа, если писать ее для общего
случая.)
Последняя задачка первой главы. Вроде как самая челленджная. Предыдущая немногим проще. Даже ковыряя Си один год. Это всё равно становится нетривиальной задачей даже для человека, знакомого с языком.
3334.PNG21 Кб, 688x719
74 1289071
У меня два вопроса, можно ли так много использовать if else в цикле while?
И 2) Как переносить текст в printf, а то слишком длинный в право
алсо че то нихуя не печатается
75 1289075
>>289071
погугли switch(variable) case of RANGE:
С ним и красивее будет и компилятор более конкретный ассемблерный код сгенерирует, что немного время исполнения сократит.
А в printf() можно переносить, если в конце строки поставить бэкслэш. И писать в новой строке.
345.PNG3 Кб, 446x117
76 1289078
>>289075
Спасибо.
А что можешь сказать на счет такого вывода?
с этой функции
77 1289080
>>289078
Бля... У тебя же в коде типо юникод... А в винде в консольке какая-то особая кодировка. Попробуй перед printf() написать такую хуйню
system("chcp 1251");
для этого нужно stdio.h подключить
потом после printf() вернуть кодировку на стандартную
sytem("chcp 866");
И тогда вроде лучше напишет. Вообще вся эта тягомоть с локалями и кодировкой мне самому покоя не даёт, нужно либу себе велосепедировать для этого. Либо вообще откажись от русских букв в выводе printf(). Что в лучшую сторону повлияет на твою культуру кода.
78 1289081
>>289080

>stdio.h подключить


пизжу. Нужно stdlib.h подключить.
79 1289085
>>289080

>А в винде в консольке какая-то особая кодировка.


Бляяя, нахуя они так делают?

>system("chcp 1251");


Вставил в начало функции. Что-то не работает.
Может в main надо пихать?
Вообщем переписал все на инглишь.
80 1289093
Почему
unsigned long long num = 1 << 32;
Выдает ошибку shift count >= width of type [-Wshift-count-overflow]?
81 1289096
>>289078
-fexec-charset=866 -finput-charset=utf-8

>>289093
Потому что 1 влезает в int, значит 1 - int. Пиши 1ULL << 32.
82 1289097
>>289071
Боже. Если ты все равно уже умеешь в массивы, какого хуя у тебя по переменной на каждую цифру? Сделай массив и сократи все это до трех строк. Алсо, <= kol там наверняка ошибка, и ты хотел < kol.
image.png8 Кб, 428x75
83 1289098
>>289097
Ахаха, да я просто делал на быструю руку. В красоту думал в конце привести. И знаешь так и вышло, один хуй прога не работает.
Вот к примеру блядский scanf тупо не читает число.
Запускаю прогу, просит ввести что-то. Ввожу к примеру 3489,
Он пишет vi brosili 0 kibikov podryad.
Блять я уже все перебрал спецификаторы!!!
84 1289101
>>289096

>1ULL << 32.



Теперь работает. Спасибо.
85 1289102
>>289098
Потому что тебе нужно убрать все из scanf и оставить только "%d"
86 1289103
>>289098

> Вот к примеру блядский scanf тупо не читает число.


Ты не просил у него число. Ты просил фразу вида vvedi klv broskov 3489. Вот и вводи ее. Целиком со словами. scanf() принимает параметром не сообщение с просьбой что-то ввести, а спецификатор.
87 1289105
>>289102
>>289103
Бляяяя вот это я дебил ахахахахаха
88 1289106
>>289066
Учить С по KR это как учить оптику по трудам Ньютона.
89 1289107
>>289068
Мне кажется, что это вообще троллинг когда советуют K&R для полных нубов, для нубов есть Кочан, Прата и т.д. а после можно и K&R почитать.
90 1289110
>>289106
>>289107
учил си на первом курсе по k&r
сквозь боль делал упражнения, перечитывал раз за разом непонятные места, включая и приложения где формально язык описан
хз что с вами не так
у англичан даже что-то вроде поговорки есть, что ты не поймешь по настоящему что написано в книге пока она не начнет разваливаться у тебя в руках
91 1289111
>>289110
суука ржу
неудивительно что англичанин придумал линукс
92 1289112
>>289107
Я учил Си по K&R первой редакции (другого не было) и по чужим исходникам. Мне было норм, но я пришел с ассемблера. Сейчас я всем рекомендую Прату, но всегда находится кто-нибудь, кто с пеной у рта защищает K&R. Похуй, всегда можно скачать обе и выбрать ту, которая больше понравится.
image.png159 Кб, 520x566
93 1289113
>>289112
Бля, вот думаю K&R распечатать, не люблю книги с компа читать.
Но у нас распечатка стоит 5 рублей за страницу КАРЛ!.
Это 1700рублей. Интересно сколько выходит рублей у людей,у которых есть принтер и собственная краска печатнуть 350стр?
94 1289114
>>289113
Да ты просто купи бэушную на авите. Даже с доставкой будет сильно дешевле штуки.
95 1289117
>>289113
k&r всегда в книжных магазинах есть, даже в мухосрансках
имхо, эта так книга которую стоит иметь
96 1289125
>>289114
Нету, смотрел
>>289117
в магазе 1500р

Для меня дорого
97 1289126
>>289125
Это ты в своем городе смотрел. Попроси почтой отправить.
98 1289128
>>289113
Ты собираешься страницу во весь лист а4 печатать? Нужно печатать по 2 страницы с двух сторон, итого нужно 288/4=72 листа.
Распечатать это может бесплатно любой знакомый офисный работник. На лазерном принтере на котором регулярно перезарпавляют тонер себестоимость печати страницы копеек 50.
А малому бизнесу нужно деньги зарабатывать, вот и получается по 5 рублей.
99 1289133
>>289113
Вам шашечки или ехать
D95C0F16-A427-4EC9-BDE6-3F87FB466D0D.png277 Кб, 1136x640
100 1289168
О каком буфере речь? Разве данные не печатаются в стандартный поток вывода? Или я опять туплю
101 1289184
>>289168

> О каком буфере речь?


Ну на пике же подробно описано. У каждого 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!".
102 1289191
Как сравниваются числа типа unsigned int и просто int? Допустим имеется 2 переменных с одинаковым расположением битов однако одна из них имеет тип инт а другая Unsigned int, но при сравнении они не равны, вопрос почему? Типа биты же в одинаковой последовательности расположены
103 1289192
>>289168
Каждый тред находится мозгоёб с этим буфером, заметили?
104 1289194
>>289191

> Как сравниваются числа типа unsigned int и просто int?


Гугли integer promotions или даже arithmetic promotions. Вкратце, суть в том, что для любой арифметической операции, в том числе и для сравнения, Си преобразует операнды к одному типу, обычно к более широкому или точному из двух.

> но при сравнении они не равны, вопрос почему?


Потому что ты где-то облажался. Если типы отличаются только наличием знака, то ранг одинаковый, и signed преобразуется в unsigned (на абстрактной машине (unsigned int) -1 = -1 + (UINT_MAX + 1) = 0xffffffff, на реальной оно "само" так будет, потому что представления одинаковы), получаем одинаковое представление, числа равны. Поэтому сравнивать signed/unsigned между собой - это опасное занятие, и если уж очень хочется, стоит скастить signed к более широкому типу.
105 1289197
>>289192
Много лет назад у меня был телефонный справочник, его автор навелосипедил свой парсер DBF, и этот парсер читал базу на десяток метров отдельными вызовами ReadFile побайтово - поиск адски тормозил несколько минут. Так что пусть лучше аноны спрашивают, чем пишут подобное говно.
106 1289200
>>289168
У меня какое-то дежавю, буквально вижу такое сообщение уже не один тред, с одной и той же картинкой и все спрашивают, что за буфер.
памагити
107 1289202
>>289200
В прошлый раз было про сканф и про макос.
108 1289392
>>289078
Среда какая? Пердоль кодировку файла с сырцами или найди уже наконец setlocale(LC_ALL, "rus").
109 1289393
>>289184
С stdin вроде же неопределенное поведение, у меня буфер вполне себе очищается.
110 1289396
Реквестирую какую-нибудь программу на голом Си, с открытыми исходниками, где реализовано ГУИ. Хочу на C + SDL2 игрушку наваять, и тут маленько завис, пытаясь сделать меню.
111 1289398
>>289396
nuklear
112 1289401
>>289398
Ну, это наверное не совсем то. Мне бы принципы подсмотреть, а то пока под каждую менюшку отдельная функция в цикле крутится, что, наверное, не очень хорошее решение.
113 1289419
>>289401

> а то пока под каждую менюшку отдельная функция в цикле крутится


Если менюшки полноэкранные, то тебе нужны сцены: структурка с необходимыми данными и указателями на функции Update (обработка пользовательского ввода и всякая анимация), Render и, если нужно, Activate/Deactivate. Делаешь в разное время разные сцены текущими, а единый главный цикл дергает у текущей сцены Update/Render.
55.PNG3 Кб, 356x154
114 1289423
Сап синоны,
Почему данный цикл генерирует лишь одно число в sum? Я же srand тоже положил в цикл, разве он не должен каждый раз обновляться.
Или данный алгоритм возможен лишь в рекурсии?
115 1289425
>>289423
То есть получается огромный массив и в каждой итерации одно и тоже число, которое было рандомно сгенерировано 1 раз в начале
116 1289426
>>289423
Алгоритм отрабатывает за одну и ту же секунду. Убери нахуй srand из цикла, поставь перед while.
117 1289427
>>289426
И как мне тогда провернуть так, что бы сгенерить целый массив рандомов?
118 1289429
>>289427
В смысле? rand() оставь в цикле.
119 1289432
>>289429
Cделал, сработало. А в чем логика то?
120 1289434
>>289429
В цикле же он как бы каждый раз должен был сдвигать начальное число на секунду, а вне цикла нет вроде. Так как сработало то?
121 1289437
>>289419
И у каждой сцены, выходит, свои функции update и render? А если, например, содержимое неоднородно? В одном меню - несколько условных кнопок, в другом - условный текстбокс. Но в любом случае спасибо за направление.
122 1289445
>>287378 (OP)
Что быстрее?

c = a;
a = b;
b = c;

или

a ^= b;
b ^= a;
a ^= b;
123 1289453
>>289445
Прогони в цикле 10000000000 раз. И проставь время перед циклом и после цикла в обоих вариантах. Вообще по идее должно получиться быстрее вторым способом. Но как оно окажется на деле - хз.
124 1289461
>>289432

> 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 - это обмен значениями, и не превратит его в первый вариант, то процессору придется на самом деле выполнять три ксора, да еще и с зависимостями.
124 1289461
>>289432

> 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 - это обмен значениями, и не превратит его в первый вариант, то процессору придется на самом деле выполнять три ксора, да еще и с зависимостями.
125 1289462
>>289113
В библиотеку запишись
126 1289463
>>289462
Там по ебанутому, в нашей библиотеке технические кгини даже нельзя забирать домой, лишь только у них на месте читать,лол.
забирать домой можно только худлит
127 1289464
rand() srand() и т.д уже давным-давно obsolete и заменен на arc4random() во всех ОС кроме Linux
128 1289470
>>289464
Не путай ОС и стандарт языка.
129 1289473
>>289470
с gets() тоже так было.
130 1289477
>>289473
gets() сломан искоробки, а rand() можно реализовывать как угодно, лишь бы выполнялось требование псевдослучайности (идентичные последовательности для одинаковых seed) и если начальный seed для srand() влезает в unsigned int. Поэтому нет, не выкинут.
131 1289481
>>289477
В том и дело, что из-за srand() уязвимости
132 1289503
>>289463

>в нашей библиотеке технические кгини даже нельзя забирать домой


Это может быть и плюсом.
Например, ты приходишь и читаешь. А не копаешься вкудахте.
133 1289671
>>289419
Поясните в целом за геймдев на си. Знаю только gtk+ GUI для созданий интерфесов, но это не совсем геймдев. А вот анимации и геймплей создавать сложно в целом? Что надо знать, какие то драйвера, директ их или какие то другие теории? Просто для меня это целая непонятная вселенная, знаю что графика есть растровоая ,векторная. но что это? Из каких частей состоит игра?
image.png159 Кб, 520x566
134 1289687
>>289503
Мудро
135 1289691
>>287941

>пакетный менеджер


>один финн чисто для лулзов запилил ядро для пакетных менеджеров для це и называет это ядром ОС, опять же, для лулзов

136 1289693
>>287931

>class Greeter


> def initialize(@name)


> end


> def salute


> "Hello #{@name}!"


> end


>end



>етот донный синтаксис

137 1289697
https://ideone.com/wx2mMf
Анон, можешь помочь с интерпретатором shell? В теории работать должно, но пытаюсь понять где оподливился.
138 1289701
>>289697

>https://ideone.com/wx2mMf


argc - int, а не массив
##argv -char. двумерный массив всех параметров шела
вот так должно быть:
int main(int argc, int ##argv)
{
}
##-звездочки
139 1289702
>>289697
ой сори)
140 1289825
>>289701
какие же некошерные звёздочки.
anonymous 141 1289832
бле народ хэлпаните лоускилл долбоебу первачу с лабой.
крч нужно в двумерном массиве найти столбец в котором нет ни одного элемента равного нулю(Не используя дополнительные методы и указатели)
мне важен сам алгоритм перебора,не могу врубиться как мне найти столбик без нуликов(
15397158126450.jpg13 Кб, 200x200
142 1289884
>>289825

>какие же некошерные звёздочки.

143 1289904
>>289832
Что имеется введу под словом "столбец" ?
144 1289915
>>289085

>Бляяя, нахуя они так делают?


Ребята не стоит вскрывать этот код. Вы молодые, хакеры, вам все легко. Это не то. Это не ядро линукс и даже не ГНУ. Сюда лучше не лезть. Серьезно, любой из вас будет жалеть. Лучше закройте компилятор и забудьте что там писалось. Я вполне понимаю что данным сообщением вызову дополнительный интерес, но хочу сразу предостеречь пытливых - стоп. Остальные просто не найдут.
145 1290065
Вопрос про processor cutch(Это же тоже самое что КЭШ?).
Допустим есть массив в котором 0-ой указатель сдвинут впрёд, то-есть можно обращаться к отрицательным элементам.
Передаю в функцию указатель на 0-ой элемент массива, комп подготавливает сразу кусок памяти. Вопрос: он готовит только правую(впереднюю) часть данных? Ну то-есть, обратись я в функции к отрицательному элементу компу придётся подготавливать уже другой кусок памяти и будет промах КЭШа?
146 1290067
>>290065
Что тебе мешает самому проверить так оно или нет?
147 1290076
>>290067
Ну я ж у специалистов полюбопытсвовать хотел, к тому результат моей проверки может быть не универсален.
148 1290083
>>290076
Понятно.
149 1290117
>>289671

> А вот анимации и геймплей создавать сложно в целом?


В целом просто, на практике сложно.

> директ их


C OpenGL в сишечке приятнее.

>>289832

> мне важен сам алгоритм перебора


В массиве array[num_rows][num_cols], для каждого столбца c, для каждой строки r: если array[r][c] нолик, ставишь флаг, что столбец зашкварен и выходишь из цикла по r.

>>290065

> cutch(Это же тоже самое что КЭШ?).


Не знаю такого.

> Передаю в функцию указатель на 0-ой элемент массива, комп подготавливает сразу кусок памяти.


Это немного не так работает. Вряд ли твой компилятор генерирует явный префетч, а сам процессор закэширует кусок массива при первом обращении, а не при передаче параметров. Гугли кэшлайн (cache-line, линейка кэша). На границы массива и указатели процессору насрать. Если какого-то значения нет в кэше, он прочитает из памяти сразу блок размером с кэшлайн (64 байта), выровненный на кэшлайн (т.е., может заодно прочитать память и чуть ниже того адреса, на котором был промах). Соответственно, если массив был выровнен по кэшлайну, то по отрицательному индексу будет промах, а если нет (malloc выравнивает только на 8 байт, например), то промаха может и не быть.
Аноним 150 1290133

>>>>290117


премного благодарю,как у вас тут говорят "цистерну чая этому сударю"
151 1290157
Есть еще какие легкие ИДЕ под винду, кроме как CodeBlocks?
152 1290172
>>290157
sublime text (надо поднастроить)
notepad++
JetBrains для си++
pelles C
153 1290175
>>290172
>>290157
Правда сублим и нотпэд - не компилируют. Это просто Иде
154 1290181
>>290175
Это не иде, а обычные текстовые редакторы с плагинами. IDE это не просто редактор кода.
155 1290182
>>290157
Мде... Перевелись нынче байтоёбы. Вот батя мой компилировал в командной строке, а писал на превокартах. Ещё писал порой прямо в оперативке, приатачиваясь к процессам дебагером.
156 1290185
>>290182

>превокартах


перфокартах* фикс
157 1290191
>>290172
CLion вот вообще ни разу не легкий.
anonymous 158 1290198
внатуре cLion как вижла)
159 1290239
>>290191
в пизду платные программы
Аноним 160 1290289
Аноны, не подскажите с чего начать изучение С?
161 1290306
>>290182
Я тоже пишу на перфокартах. Хорошие, качественные картонки, не выкидывать же их!
162 1290311
Для чего изучать Си? Подойдёт как первый язык? До какой степени стоит его освоить?

Начал 1,5 месяца назад, для меня это первый язык, идёт очень туго, сейчас с уверенностью могу сказать что понимаю что такое указатели и как ими пользоваться, и вот думаю стоит ли продолжать. Сам никуда не спешу, если анон посоветует дойти до понимания каких-то тем, а потом перекатиться на условно джаву или пхп что бы через 3 года быть уверенным джуном или даже сеньером. Готов принять ваши советы, не смотря на тугость изучения мне нравится то, что я делаю.

Кстати что за тема со звёздочками?
*
163 1290450
>>290311
Тож жду ответа на твой пост.
Алсо, сам не так давно начал Си изучать.
Ну думаю , что все так да. Раз уж начал, то доводи до конца. Хотя бы ознакомится со всеми возможностями и синтаксисом точно надо, не думаю, что это долго.
Долго - это изучать всякие библиотеки и писать что-то серьезное.
164 1290481
>>290311

>с уверенностью могу сказать что понимаю что такое указатели и как ими пользоваться


как относятся друг с другом указатели и массивы
зачем возвращать из функции указатель на указатель?
как работать с указателями на функции и зачем это надо?
особенности работы с нетипизированным указателем и зачем он нужен?
вангую, что ты еще ни одной сложносвязанной структуры данных не запилил, не говоря уж про хоть какое-то подобие библиотеки решающей часть своего функционала через каллбеки, например
ну или ничего не писал, что читает из бинарного файла или из сети в банарном формате
165 1290578
>>290481
Правильно вангуешь про структуры и прочее, на первые 3 вопроса я могу дать ответ без Гугла, что такое "нетипизированный" могу только догадываться.
интересно кто-нибудь писал сложные структуры и то что написано в том посте всего через 1,5 месяца изучения Си
166 1290594
>>290311
макаба фейлит текст с несколькими звездочками техст
51STEFXY9ML.SX356BO1,204,203,200.jpg29 Кб, 358x474
167 1290634
Приветствую уважаемые. Стремящийся репортинг ин.
Никак не могу найти пикрелейтед. Несмотря на год выпуска, у сего труда очень хорошие отзывы, даже с 2018 года.
Да и как такие авторы могут написать некошерную книгу?

Еще нашел Седжвика Алгоритмы на Си, очень рад, ибо можно сосредоточиться собственно на алгоритмах а не расписывать иерархию классов для сортировки пузырьком.

Вообщем, прошу помощи.

Благодарю.
168 1290703
>>290634
на либгене нет электронной копии, есть data structures using pascal тех же авторов
на амазоне можно купить не новую за 1.5 бакса
169 1290706
>>290578
нетипизированный указатель это void
но речь не о том чтобы знать что он существует, а о особенностях работы с ним и зачем вообще применять
..
170 1290733
>>290703

>data structures using pascal


Не, спасибо, уж очень олдскул.
171 1290750
Почему я могу сделать так:
char s;
s="abc"; (это кстати расширение gcc что ли?(присваивание строки после инициализации))
Но не могу так:
int
i ={1,2,3};
В чём принципиальная разница? И где находиться та строка, на стеке?
172 1290752
>>290634
Поддвачну.
Есть вообще хорошиая книга про Data Structures в С?
<spoiler>Как введение в алгоритмы, например.</spoiler>
173 1290753
>>290750З
Блин звёзды испарились, char(звезда) int(звезда).
174 1290755
>>290750

> s="abc"


А почему бы и нет? У тебя указатель, у строкового литерала есть адрес.

> Но не могу так:


> int i ={1,2,3};


Давно уже можешь. Тип укажи только. int ∗i = (int[]) {1,2,3}
175 1290760
>>290755
Офигеть, сколько про С ни читаю в интернете "int ∗i = (int[]) {1,2,3}" такого не встречал, спасибо.
176 1290825
>>290481
Кто-нибудь итт сможет ответить на эти вопросы?
177 1290829
>>290825

>Кто-нибудь итт сможет ответить на эти вопросы?


все могут
178 1290849
>>290481

>как относятся друг с другом указатели и массивы


Массив это и есть указатель, только он указывает на начало связных блоков памяти.

>зачем возвращать из функции указатель на указатель?


Тем самым мы возвращаем двумерный массив.

>как работать с указателями на функции и зачем это надо?


Я хз, пусть другие дополнят

>особенности работы с нетипизированным указателем и зачем он нужен?


Что бы принять данные которые нам не известны (их тип нам не известен)
179 1290851
>>290634
Рутрекер чекал?
180 1290856
>>290755

>у строкового литерала есть адрес.


А у нестрокового нету что ли адреса? Че за фигня..
181 1290863
>>290849

>Я хз, пусть другие дополнят


Чтобы передавать другие функции как аргументы для функций, но я про это только читал, сам не делал. Ещё такая хрень нужна, чтобы организовать функциональное программирование, но что это значит я тоже не знаю. Там на педивикии написано, что высшие функции - это те функции, которые принимают в качестве аргументов другие функции.
182 1290877
>>290849

>Массив это и есть указатель


неверно

>зачем возвращать из функции указатель на указатель?


>Тем самым мы возвращаем двумерный массив


неверно
183 1290880
>>290863

> Чтобы передавать другие функции как аргументы для функций


Тогда вопрос с подвохом: почему это компилируется и работает (нет, макаба не сожрала звездочки)?
static void hello(void) { puts("Hello, world!\n"); }
static void invoker(void func(void)) { func(); }
int main(void) { invoker(hello); }

>>290877
Второе с некоторой натяжкой верно. Можно организовать двумерный массив как массив указателей на одномерные.
184 1290881
>>290863
указатели на функции в си используются для более банальных, но практичных вещей, чем попытки симитировать пункции первого порядка и высшие функции из фп
185 1290883
>>290877
тогда свои ответы давай, если так крут
186 1290924
>>290880
Потому что они заинлайнятся?
мимо
187 1290925
>>290881
Буквальные колбеки для имитации полиморфизма.
188 1290931
>>290925

>полиморфизма


Нинужен, ООП для пидоров
189 1290933
>>290931

>ООП для пидоров


Поясни за гон
190 1290934
>>290931
Структуры как замены классов, а колбеки в виде указателей на функции вместо полиморфизма, хехе.
алсо в ядре линукса такое много где используется
191 1290935
>>290934

> а колбеки в виде указателей на функции вместо полиморфизма


Как будто в этих ваших крестах не так. Ой, они называются по-другому.
192 1290955
>>290934
И чо бля? Причем тут ООП парадигма?
193 1290996
>>290851
Хм. Нет.
Спасибо, доберусь до компа поищу.
194 1291011
>>290996
Через тор, а то он в рф забанен
195 1291041
>>291011
Rutracker.org?
У меня все работает.
Но я не в РФ.
196 1291043
>>290851
Нету :(((
Проблема усугубляется тем, что книгу под абсолютно тем же названием написал индус, и именно она вылазит изо всех дыр.
197 1291088
>>287758
вызовы ядра тебе не нужны. из юзерспейса у тебя есть набор библиотек предоставляющих тебе какие-то стандарты.

например 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 для линя. хз кстати, можно ли бсд расширения использовать в лунтике, конкретно через эту библиотеку.
198 1291090
>>288011
советую qalc (command line version of Qalculate)
199 1291098
засрали всё, говно жрут.

подумал тут в в аллокаторе свой хедер заделывать, хотя-бы чтобы всё отчищать было проще, при выходе с ошибкой из фрейма. так норм определение выравнивания?:

#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;})
200 1291142
>>291098
Почему дефайны вместо тайпдефов?

> offsetof(struct { char c; T member; }


Куча невнятного говна в отладочной информации из-за тестовых анонимных структур. Чем тебя stdalign.h не устраивает, зачем велосипеды?

> ALIGN_MAX


У различных SIMD-типов выравнивание может быть от 16 до 32 (в зависимости от компилятора и платформы). alignof(long double) не спасает, в 32-битном коде на винде оно даже меньше, чем alignof(double).
201 1291165
>>291142

>Чем тебя stdalign.h не устраивает, зачем велосипеды?


тем что он есть только в с11. мне поебать на отладочную информацию, я отлаживаю принтами и gdb когда падает.

> alignof(long double) не спасает, в 32-битном коде на винде оно даже меньше, чем alignof(double).


какая разница, если я их всех перечислил?

> Почему дефайны вместо тайпдефов?


и нахуя мне тейпдефами засирать пространство имён? я в этом же файле undef сделаю и всё.
202 1291325
Приветствую уважаемые эксперты.
Вот тут описывается создание битового массива:
http://www.mathcs.emory.edu/~cheung/Courses/255/Syllabus/1-C-intro/bit-array.html

Этот кусок показался мне странным:
https://pastebin.com/mhykVexw

Это нормально такие трюки проводить между int и unsigned int?
Не лучше ли использовать только unsigned int в таком случае?
203 1291327
>>291325
Не понял почему пейсбин не высрался.
Вот код:
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
204 1291370
>>290935

>ваших


Я пишу на си, расслабься.
>>290955
Да, действительно, причём.
205 1291371
>>291327
А что такого собственно?
Что именно тебя смущает?
206 1291397
>>291325

> Это нормально такие трюки проводить между int и unsigned int?


Более или менее. Но бессмысленно, потому что

> Не лучше ли использовать только unsigned int в таком случае?


Лучше. Я еще лучше uint32_t, а то в инте не обязательно 32 бита.

> pro version


Фууу. x[index >> 5] |= 1u << (index & 0x1f)
207 1291445
>>291371

>int A[100];


>unsigned int flag = 1;


>A = A | flag;



int | unsigned int меня смущает
208 1291449
>>291397

>еще лучше uint32_t, а то в инте не обязательно 32 бита.


Хотел спросить кстати, но подумал что наверное вообще нубский вопрос, стыдно
209 1291450
>>291397

>Фууу. x[index >> 5] |= 1u << (index & 0x1f)


не понил
210 1291508
>>291445
Ну у тебя к инту идёт битовое или, так что норм, если бы было наоборот могли бы возникнуть проблемы из-за знакового бита, а так вполне все норм, тут же unsigned просто как бит используется.
Но вообще странно, что так сделано, т.к. если вдруг будет 1 << 31, то возникнет сюрприз.
211 1291515
>>291449
uint32_t макрос кроссплатформенный, который гарантирует тебе беззнаковую 32-битную переменную.
>>291450
Это не проверсия, это нечитаемое говно, не пытайся это понять, это не сложно, но такой говнокод понимать а уж тем более писать не стоит.
если коротко index >> 5, тоже самое, что index / 32, 1u << это беззнаковая единица, а нужное для неё место даёт index & 0x1f, 0x1f это 32 в хексе, соответственно index & 0x1f тоже самое, что index % 32, думаю соответствие с кодом, который ты скинул сам найдёшь
212 1291517
>>291515
Добавлю, размер инта не управляется стандартом и зависит от платформыкомпилятора
А ещё я там опечатался, 0x1f это 31 в хексе, но % 32 это верно.
213 1291522
>>291515

> это нечитаемое говно


Вот деление и остаток - нечитаемое говно. А тут сразу ясно, какие биты индекса за что ответственны. И это практически идиоматичный код, он такой везде. Ты либо понимаешь побитовые операторы, либо выбираешь другой язык.
214 1291543
Привет, аноны.
В коде:
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 символа?
214 1291543
Привет, аноны.
В коде:
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 символа?
215 1291545
>>291543
быстрофикс
в "что я ожидаю увидеть" у World тоже должен быть код \n, т.е.
...
new
87
111
114
108
100
0
10 //аски-код \n
мусор
мусор
мусор
216 1291558
Прочел седня такой пост на форуме:

"самое главное понять самую важную вещь. в С++ многомерные массивы - не настоящие. они все равно представляют собой одномерный массив.
например 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]
---- # = звездочки
Вопрос, в Сишке так же?
217 1291563
>>291558
в си и с++ нет многомерных массивов на уровне языка
все
очень легко
как и, например, нет строк
нет подсистемы ввода-вывода
218 1291572
>>291558

>многомерные массивы - не настоящие. они все равно представляют собой одномерный массив


У тебя память одномерная, какие "настоящие" многомерные массивы вообще могут быть? Пиши свои типы на псевдо-ООП чтобы они тебе их имитировали.
219 1291659
>>291522
Новичкам сложно читать битовые операции и понимать, что они делаютнекоторые даже не представляют, как выглядит число в бинарной записи, о каких битовых операциях идёт речь
А судя по его вопросу он как раз новичок.
221 1291668
>>291663
Компилятор понял, что значение б ты не меняешь, а т.к. это не указатель, то и адрес ты не поменяешь, и он скорее всего, чтобы лучше понять чекни асм просто выкинул твой вызов, не создавал переменную б, а тупо распечатал 3 как строковый литерал.
222 1291669
>>291668
И правда кстати посмотри код на асме, может въедешь, что случилось.
223 1291671
>>291663
А вообще ты сделал какую-то хрень.
Ты взял адрес переменной и пытался присвоить этому адресу другой адрес.
224 1291672
>>291663
a[0] = c
225 1291674
>>291671
Чтобы было понятнее.
Если ты хочешь поменять значение переменной, то передавай её адрес, если ты хочешь поменять адрес, то тебе нужен указатель, который содержит в себе именно адрес, который ты можешь поменять, короче сделай б указателем на инт и передавай в функцию без амперсанда, должно сработать.
226 1291675
>>291672
Насколько я понял он хочет не значение, а адрес подменить.
227 1291689

>myClass& my func(x,y,z...).


Зачем из функции передавать ссылкой, а не копированием?
228 1291714
>>291689
Чтобы словить segmentaion fault
229 1291763
>>291543

> Где код line feed символа?


Продолжу повторять итт, что scanf - нелогичное, неюзабельное говно. scanf перед чтением очередного значения пропускает из входного потока все isspace() (т.е., и \n тоже), кроме случаев с charset-ом %[], потому что он может содержать пробелы и %с, потому что пробелы - тоже символы. А %s, как все остальные спецификаторы, сначала пропускает все пробелы, а потом читает до первого пробела.

>>291558

> в С++ многомерные массивы - не настоящие


Бред. Любой массив настоящий, если с ним можно работать, как с массивом. Без разницы, как он там реализован - как массив массивов или как массив указателей на массивы. А так, да, в сишке так же, оно из сишки в кресты и пришло.

>>291663

> ПОЧЕМУ


Аргументы функций полностью аналогичны локальным переменным (кроме того факта, что их инициализирует вызывающая функция). Ты изменил локальную переменную a, это ни на что не повлияло.
230 1291803
>>291763

>Любой массив настоящий, если с ним можно работать, как с массивом.



в си есть производный тип - одномерный массив, задается через соответствующий описатель, семантика оператора индексирования определена так что позволяет работать с массивом посредство арифметики указателей, не более того
точка
231 1291813
>>291803
Это никак не доказывает, что многомерных массивов нет, а лишь говорит о том, что можно красиво делать многомерные массивы из одномерных, и для этого нахуй не нужны запятые в квадратных скобках.
232 1291818
>>291813
>>291813
в системе типов си нет многомерных массивов
233 1291821
>>291689
Если тебе нужно поле класса передать в другую функцию не член класса и там изменить, например.
5459430.jpg39 Кб, 640x480
234 1291823
>>291813

>Это никак не доказывает, что многомерных массивов нет,


Уносите
235 1291828
>>291813

>Это никак не доказывает, что многомерных массивов нет


Ну как бы я согласен, что если что-то выглядит и ведет себя как утка, то это утка, но по факту же это одномерный массив указателей.
236 1291830
>>291763
>>291813
Ну и хуйню ты несёшь, братишка.
237 1291999
>>291558
Да, в C тоже. Связано с тем что указатель на начало статического массива в памяти процесса нигде не лежит.
type arr[size];
Понятно что:
(&arr)[m][n] == (&arr + m)[n] == arr[msizeof(arr) + n]
Можно создать динамическое подобие &arr, которая будет работать аналогично. Перемешивать обыкновенные указатели и массивы нельзя:
if ((void
) &arr == (void*) arr) printf("Wtf\n");
238 1292001
>>291999

>(&arr + m)[n]


Звездочку забыл
239 1292030
а что значит настоящий многомерный массив? это когда указатели хранятся или когда размер каждого измерения?
240 1292037
>>292030
это когда в языке есть тип данных "многомерный массив"
например, как в фортране
241 1292064
242 1292082
Какие есть фичи и особенности с, которых нет в с++?
243 1292086
>>292082
Красивые обои
67 Кб, 700x466
244 1292090
зачем-то сделал вам массивы. теперь можете перекатываться в c.

https://pastebin.com/ZVchQVUm
245 1292317
>>291823
Скажем так, они для наших глаз есть. Но просто хранятся в фиической памяти по другому. А так все есть
246 1292367
>>292317

> Но просто хранятся в фиической памяти по другому


Давай, неси пример из языка с многомерными массивами и показывай, чем в практическом смысле они отличаются от сишных, какая разница в генерируемом коде и как именно они по-другому хранятся.
247 1292380
Больше всего меня раздражают операторы * и & для разыменования, и взятия указателя. Надо было выбрать что-то другое.
248 1292386
>>292380
Какие твои предложения?

>взятия указателя


Не знаю такой операции.
249 1292478
>>291663
Что за IDE?
250 1292481
>>291669

> посмотри код на асме


Это где?
251 1292501
>>292478
Vusial Studio, если глаз не обманывает
252 1292510
>>292367
А хуйнаны шпаны не показать ?
253 1292536
>>292481
Тебе неправильно ответили.

Ты взял указатель и передал его в функцию.
В той функции ты изменил значение ЛОКАЛЬНОЙ переменной a на некоторое другое значение, потом вышел. При этом в main ничего не поменялось.

а - локальная переменная в функции. Действия с ее значением без на main никак не влияют. Тебе нужно чем-то выстрелить по этому указателю.
Например:
a = 4. Или a = c.

В asm смотреть за этим не нужно.

И еще, ты просто так не сможешь сделать так, чтобы b в main ссылалась на какое-то другое место в памяти. Можно только пошатать значение.
254 1292539
>>292536
\a = \4
\a = \c
255 1292557
Подскажите сортировку для 5000000 элементов, надо только название, код сам напишу. Время очень критично. Массив целочисленный.
256 1292559
257 1292719
>>292090
Какой пиздец. Эталонный говнокод. Прям образец для, рамки не хватает, как программировать нельзя.
258 1292817
>>292719
или ты просто хейтерок, завидующий моему глубинному пониманию вопроса.
15366035789020.png75 Кб, 224x225
259 1292826
>>292817

>наговнокодил


>глубинное понимание

84 Кб, 605x807
260 1292837
261 1292870
>>292817
Я конечно понимаю, что юношеский максимализм помноженный на сексуальную неудовлетворённость дурманит твой мозг, но переменные вида pmss/vd, вложенные циклы и прочие «алгоритмы» это фиаско.
262 1292900
>>292870
претензии как обычно. потому и не спрашиваю. несчастные люди.
263 1292905
зато оно работает, защищено от переполнений, от выхода за границы индексов. но важно же приебаться к вложенным циклам в тесте.
264 1292932
>>287378 (OP)
Здравствуйте, мне нужна помощь, суть такова. У меня есть динамический массив, сделанный через realloc. Мне необходимо иметь указатель на один из элементов данного массива. Всё бы хорошо, но у меня есть ещё и второй динамический массив тоже сделанный через realloc и когда я увеличиваю размерность этого второго динамического массива, то указатель уже указывает не на один из элементов первого массива, а на непонятно на что. Олды, подскажите как быть?
265 1292947
>>292932
Храни индексы, а не готовый указатели, очевидно же.
266 1292953
>>292947
Мне нужен именно указатель.
267 1292955
>>292953
Сочувствую, но указатели на элементы и realloc несовместимы.
268 1292959
>>292955
Тогда как динамически выделить память под второй массив?
269 1293185
>>292959
Еще раз. У тебя так: ты хранишь указатель на массив, хранишь указатель на элемент внутри массива, realloc() перемещает массив в новое место памяти, и указатель на элемент начинает указывать на мусор (возможно, не после первого же realloc, а возможно, как у тебя, после realloc другого массива - это все зависит от реализации менеджера памяти). Но можно так: хранишь указатель на массив, хранишь индекс элемента (смещение внутри массива), можешь хоть смещение в байтах хранить, если у тебя элементы разного размера - похуй. Больше данных ты от этого хранить не станешь, но доступ становится сложнее на целую одну операцию. Там, где ты писал ∗elem_ptr или elem_ptr[0], ты будешь писать ∗(array_ptr + index) или array_ptr[index]. Если тебя это чем-то не устраивает, покажи кусок кода с примером того, что ты пытаешься сделать.
image.jpg67 Кб, 488x576
270 1293521
>>293185
Да это понятно, я сначала так и хотел делать, но дело в том, что мой массив - это массив структур, у которых поля - это указатели на элементы этой же структуры (по сути сеть). И если я хочу перейти от одного узла сети к другому, мне необходимо менять указатель на текущий элемент, который я возьму из поля текущего элемента. Я не могу взять индекс массива следующего узла сети, потому что в формате элемента он отсутсвует, понимаешь?
271 1293538
>>293521
Ты что-то делаешь очень неправильно.

> у которых поля - это указатели на элементы этой же структуры


Ты все еще можешь хранить офсеты вместо указателей. Ты можешь даже хранить офсеты внутри указателей, хоть это и UB, и вообще дикий говнокод.

> потому что в формате элемента он отсутсвует, понимаешь?


Понимаю. Отсутствует - добавь.

Но если уж очень хочется, есть другой вариант. Храни массив кусочками. Выделяешь массив под свои структуры с запасом (ну там сколько не жалко, допустим, сразу пару сотен элементов), хранишь количество заполненных элементов или помечаешь неиспользованные как-нибудь - похуй. Когда этот кусок полностью заполнится, вместо того, чтобы realloc()-ом менять его размер, выделяй другой, новый кусок malloc()-ом и начинай заполнять его. Естественно, тебе придется хранить указатели на все куски твоего массива, хотя бы для того, чтобы потом все это освободить правильно. Тебе придется поддерживать какой-нибудь free-list для удаленных элементов, чтобы можно было втыкать поверх них новые элементы. Т.е., фактически придется написать небольшой кастомный аллокатор. К тому же, из-за того, что массив перестанет быть непрерывным, тебе будет сложнее его обходить. Но третьего варианта тут нет.
272 1293543
>>293538

>Отсутствует - добавь


Добавил ещё вчера, вроде нормально. Просто не хотелось поначалу засорять структуру, вот и пришёл сюда в поисках более элегантного решения, но раз такого нет, то придётся оставить как есть. Спасибо.
273 1293573
>>293543
Если тебе о нем не сказали, не значит, что его нет.
80% проблем идут от хренового дизайна, уверен, если ты года через два попробуешь сделать тоже самое, ты найдёшь намного более интересный подход
274 1293648
Что происходит, когда пытаешься сложить/вычесть строки
"1345" - "1345", "1345" + 1 и т.д.
275 1293669
>>293648
Просто вспомни, что "строка" - это массив char с неявным \0 на конце. Когда ты используешь массив в выражениях, он кастится к указателю. Вот и твои вопросы сводятся к тому, что будет, если вычесть один указатель из другого или прибавить что-то к указателю.

> "1345" - "1345"


ptrdiff_t x = адрес одной строки - адрес другой строки. Разница между адресами строк в штуках char (т.к. строка - массив char). Но вообще тут undefined behavior: одна из возможных проблем в том, что если компилятор схлопнет эти два одинаковых литерала в один, разница будет 0, а если не схлопнет - какое-то число. Поэтому вычитание указателей работает правильно только когда указатели указывают на разные части одного и того же объекта.

> "1345" + 1


(адрес "1345") + 1, т.е., указатель, указывающий на "1345" + 1 = указатель на "345".
anonymous 276 1293828
Двач,выручай!
Выделить под массив динамически память.
Обращаться к элементам массива необходимо используя указатель.


1. В одномерном массиве, состоящем из n вещественных элементов, вычислить: - сумму отрицательных элементов массива;
- произведение элементов массива, расположенных между максимальным и минимальным элементами
277 1293837
>>293828
double array = malloc(N sizeof(double));
278 1293915
Как начать писать маленькие проекты если никогда ничего серьёзного не писал кроме задач на 3 функции максимум. Что почитать, посмотреть?
279 1293951
Антон, посоветуй показ книжку по логике, необязательно компьютерной. Чтобы я прочитал и понял что нелогично было спрашивать такое у анона
280 1293989
>>293915
попенсорс проект найди, читай код, фикси баги простые.
Например https://github.com/neovim/neovim/labels/good first issue
281 1294040
>>293989
Спасибо, попробую
282 1294074
>>292932
Запили свой динамический массив, который использует не realloc, а выделяет память чанками некоторого размера. Перегрузи всякие операции типа ++ и будет тебе счастье.
283 1294075
>>293828
https://ideone.com/A3li5K

Надеюсь шарящий анон поправит.
Аноним 284 1294103
>>294075
премного благодарен
285 1294105
>>294075
Полный бред. Числа не вещественные ни разу, какие-то промежуточные копирования массива, хотя ты его и так не модифицируешь, задание не прочитал - произведение не то. Реально задача решается максимум двумя циклами.
Аноним 286 1294110
>>293828
по-моему этот код лучше

/ Задание 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);
}
Аноним 286 1294110
>>293828
по-моему этот код лучше

/ Задание 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);
}
287 1294128
>>294110
А если индекс максимального элемента меньше, чем индекс минимального? И вообще, кто-нибудь здесь способен решить ОДНИМ циклом >>293828 ?
289 1294185
>>294165
Ну, C17 - это мелкие фиксы, никаких фич. И гораздо хуже, что Pelle дропнул поддержку 32-битных ОС. Компилятор, который не только не кроссплатформенный, но даже на собственной платформе не везде работает - это эталонное нинужно.
290 1294196
>>294128
Поиск минимального и максимального элемента это уже два цикла, чисто в теории можно объединить в один, но нахуя? Есть такое условие в задаче?
291 1294203
>>294196
За один можно управиться. А вот найти сумму между ними - уже второй.
292 1294212
>>294196

> чисто в теории можно объединить в один, но нахуя?


Потому что гонять два цикла для такой простой вещи - идиотизм даже в нашем современном мире.

> Есть такое условие в задаче?


Нет. Но быть макакой стыдно.
293 1294263
Есть какой-нибудь источник в котором описаны сокращение типа if (!str) или while (str) и подобные. Часто читая код натыкаюсь на подобные сокращения и по пол часа ищу их в гугле
294 1294264
>>294075
Кстати, никто не мешает написать так
for (int j = 0; j < size; j++)
{
if (numbers[j] < min)
min = numbers[j];
if (numbers[j] > max)
max = numbers[j];
}
и не нужно создавать кучу циклов
295 1294270
>>294263

> сокращение типа if (!str)


Глава про операторы в твоей книжке про Си.
296 1294362
>>293828
Пришел домой и сделал с одним циклом, если кому-то интересно: https://ideone.com/E5nsnf
anonymous 297 1294411
двачик,выручай
Двумерный массив, содержащий равное число строк и столбцов, называется магическим квадратом, если суммы чисел, записанных в каждой строке, каждом столбце и каждой из двух больших диагоналей, равны одному и тому же числу. Определить, является ли данный массив А из n строк и n столбцов магическим квадратом.(размерность с клавиатуры+это должно быть решено чере указатели и должна быть выделена память через ,malloc)
если западло не пишите код,мне бы просто логику усвоить ,я делал аналогичную хрень без указателей ,но с ними ничего не выходит
298 1294418
>>294411
В обычном массиве a[n][n] ты адресуешь элемент как a[y][x]. В динамическом массиве a[n ∗ n] ты адресуешь элемент как a[y ∗ n + x]. Суммы циклом посчитаешь, ничего сложного там нет.
Снимок экрана от 2018-11-12 19-46-17.png1,2 Мб, 1920x1080
299 1294426
Почему нихуя не выводит, двач? Почему отрицательная обыкновенная дробь, меньшая единицы по модули, в СИ не меньше 0? Т.е. -6/6 СИ понимает что она меньше нуля, а вот -5/6 и т.д не понимает?
300 1294435
>>294426
-5/6 == 0
-5/6.0 == -0.83
301 1294442
>>294435
Спасибо
302 1294468
Господа. Не так давно узнал, что все (или во всяком случае те, что используются большинством) операционных систем, используют для адресации виртуальной памяти лишь 48 бит из 64 битного указателя (на 64 битных архитектурах, само собой). Что означает, что старшие 16 бит фактически можно использовать для данных. Так же слышал, что это используется для реализации tagged pointers.

Собственно вопрос, каковы подводные камни и стоит ли этим пользоваться (для реализации тех же виртуальных машин, например). Пока вижу единственный недостаток в том, что перед тем, ка использовать указатель, как указатель, если в его старших 16 битах что-то лежит, надо эти 16 бит обнулять (тут кстати неясно, почему ОС просто не игнорирует их, тогда бы не пришлось этого делать).
303 1294503
>>294468

> почему ОС просто не игнорирует их


Потому что ОС их как раз игнорирует, а вот процессор очень обижается, если адрес не в канонической форме.

> надо эти 16 бит обнулять


Если бы. Туда надо дублировать 47-ой бит. Две лишних инструкции вместо одной.

> каковы подводные камни и стоит ли этим пользоваться


Если обязательно нужно вкорячить в указатель дополнительные данные, а сделать жирные указатели (т.е., структура с указателем и данными к нему) ну вот никак нельзя - пользуйся. Но это все грязные хаки, и нужно сто раз подумать сначала.

Алсо, если тебе нужно меньше бит (например, флаг какой-нибудь указателю поставить), лучше используй выровненные указатели, они портабельнее, и их фиксить проще: например, обычный malloc() без дополнительных телодвижений выравнивает на alignof(double) == 8 (обычно), и 3 младших бита - твои.
304 1294649
Хвощ, ковыряю Си, запрашиваю объяснение сего. Если я правильно понимаю, s содержит адрес первого элемента массива. Функция печатает элемент массива, затем меняет адрес, хранящийся в s, на адрес следующего элемента массива.

Но загадкой для меня является сочетание while (s).
Что это значит? Адрес, который s содержит, рано или поздно выйдет за границы массива. Если он пустой, то указателю присвоится значение 0 и цикл прервется. Но что если по этому адресу хранится какое-нибудь значение?

int puts (const char
s)
{
while (s) putchar (s++);
return 1;
}
305 1294650
>>294649
Блять сложно. Почему звездочки не ставятся то
306 1294651
>>294650
>>294649

Ай блять, вспомнил, нуль терминатор в конце же
307 1294655
>>294651

>терминатор


Как же я обожаю это название нулевого символа.
мимо
TY0LvQaLpKk.jpg39 Кб, 700x448
308 1294793
Screenshot from 2018-11-13 16-21-50.png6 Кб, 640x21
309 1294893
Как правильно понять эту строку?
Если строка "пустая" ИЛИ выделено ноль памяти?
6723482098623.jpg612 Кб, 1280x921
310 1294924
>>294893

Если строка пустая или неуспех при выделение затребованной памяти.

А вообще это весьма неправильный способ проектирования программы, так как память можно выделять поблочно, а в представленном случае можно лишь сказать, что автор данной строки либо лиственник, либо конченный долбоёб.
311 1294935
>>294924

>автор данной строки либо лиственник, либо конченный долбоёб.


Хуйня, норм код доя смузихлебов. Если по хардкору, то в чанк можно побайтово и копировать, без подсчета длины строки, если не додумался хранить длину в переменной.
312 1295216
##mas;
А когда мы очищаем двойной массив с помошью функции free(mas), то массивы внутри этого двойного массива тоже автоматом чистятся ?:)
313 1295310
>>295216
Нет, это сишка, ничего автоматом не чистится.
15414452045720.png309 Кб, 700x462
314 1295507
Карьера байтоеба в российских реалиях 315 1295541
Реально ли вкатиться в байтоебство и найти работу в России?
Собираюсь через переехать в спб из своей мухосрани, но есть еще 1-2 года в запасе, которые можно будет потратить на изучение разных штук и технологий. Я понял, что успешный байтоеб в 2019 году должен уметь: в C, C++, Linux, Linux Kernel и какой-нибудь скриптовый язык вроде питона и систему контроля версий, а также алгоритмы и структуры данных для собеседования.
Стоит ли игра свеч? Или лучше оставить байтоебство как хобби, а работать где-нибудь в вебе или энтерпрайзе?
316 1295657
>>295541

>энтерпрайзе


ЧТо это такое кстати?
317 1295660
union {
int i; short b;
}

Как сделать union у которого бы b выводило старшую, а не младшую половину? Что-то типа

union {
int i; struct { short a, b } b;
}

Но только чтобы обращаться к старшей половине можно было бы не union.b.b, а просто union.b?
318 1295754
>>295660
чем тебя так не устраивает?
union {
int i; short a; short b;
}
319 1295755
>>295754
а стоп, я туплю
320 1295760
>>295660
вот так, если компилятор поддерживает анонимные структуры
union {
int i; struct { short a, b };
}
321 1295772
>>287378 (OP)
ой код
#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;
}
322 1295831
>>295660
Сделай это битовой операцией, хули ты. Обращаешься в твоём случае к i, и делаешь (i & (0xFFFF << 16))
323 1295837
>>295831
Это если инт 32 битовый.
Естественно.
15412603393460.jpg26 Кб, 403x497
324 1295838
>>295831
Но лучше не используй инт, используй unsigned int, а то после такого сдвига настанет пиздец знаковому биту.
325 1295842
>>295760
Алсо можно ещё так.
union { int i}
Что-то-там = i & 0s //старшие биты I
Если хочешь получить старшие биты как просто биты, то ещё можешь сдвинутьно бля не двигай знаковые переменные, иначе тебя бог накажет
>>295831-кун
326 1296103
>>287378 (OP)
Аноны, может кто нибудь знает как найти параметры функции в памяти? И как они вообще расположены?
Возможно есть статейки на эту тему.
327 1296104
Например есть функция
int sum (int n, ...)
Как найти адрес в памяти остальных параметров?
чотко.jpg63 Кб, 534x438
328 1296119
>>290634
В последний раз попрошу анона помочь найти в оцифрованном виде и больше не буду вскрывать эту тему.
329 1296120
>>291515

>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.
sage 330 1296216
>>296120

> Optimizing compilers may recognize expressions


Да. Каждый первый компилятор умеет в умножение через lea и/или сдвиги, деление через сдвиги и остаток через &. И еще умеют деление умножением заменять. Но

> This can allow writing clearer code


это хуйня полная. В варианте с & сразу видно, что оно маскирует биты, видно, сколько битов и все такое. А с % надо об этом думать. Традиционно, для улучшения понимания происходящего, даже после того, как компиляторы научились оптимизировать, если дело касается битоебли, используют сдвиги и логические операторы, а если не касается - нормальные умножение, деление и остаток.
331 1296331
>>296104
Ну в памяти оно лежит в все подряд, тебе только нужно определиться что за тип данных, колличество и порядок элементов передающихся в такую функцию, выцеплять можно через указатель, например. Просто добавить к нему 1 и получишь следующий после адреса "n" адрес.

https://rsdn.org/forum/cpp/418970.1
Первая же ссылка в Гугле, можешь ещё по теме поискать.
1542263577177384085.jpg171 Кб, 700x703
332 1296340
>>287378 (OP)
Анончи, можно ли на Си создать двумерный массив, второй элемент которого является массивом переменной длины:

[
...
[0, [1, 2, 3, 4, 5]],
[1, [1, 2]],
[2, 0]
...
]
333 1296363
>>296340
как вариант массив структур с указателем на массив
struct s
{
int a;
int *pt;
}
334 1296392
>>296363
А как это все инициализировать в хедер? Мне нужно статически.
335 1296404
>>296331

> Ну в памяти оно лежит в все подряд


> выцеплять можно через указатель


Ни в коем случае нельзя так делать. Это работало с 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
337 1296434
>>296433
Два чаю.
338 1296454
>>296434
А чего вам не нравится? Про руки я пошутил, для ленивых есть кодогенерация. У меня в одном из проектов килобайт этак 60 таких вот массивов, разве что слегка сложнее: там список типов сущностей, списки их свойств и дочерних сущностей, ну и методы всякие, для манипуляции и (де)сериализации. Нужно было такое на крестах писать, но когда я это осознал, было уже поздно.
339 1296459
>>296103
Есть соглашения о передаче аргументов в функцию.
Для amd64 Linux, System V ABI:
Первые аргументы в регистрах rdi, rsi, rdx, rcx, r8, r9, иногда еще xmm.
Остальные лежат в стеке задом наперед.
340 1296461
>>296454

>есть кодогенерация


Это понятно. Я еще вариант придумал, хранить data в сплошном бинарном массиве, а в инициализации указывать ссылку на этот массив и смещение. Какой вот стул выбрать, пока не ясно. И тут вопрос, не распидарасит ли конпелятор мой бинарный массив, похеря смещения.
341 1296511
>>296461
>>296454
Анон, переписал твою мокропиську

https://ideone.com/dUllI1
342 1296679
Сколько (максимум) строк кода должно быть в одном си-файле, чтобы упростить читаемость?
343 1296681
>>296511
Бля. Ты прав. Я вспоминал об этом варианте, но когда-то раньше у меня с ним были какие-то проблемы, и я даже не удосужился затестить, когда отвечал тут >>296433. Кстати, можно обернуть инициализатор в макрос, тогда и нуль-терминатор не понадобится.

>>296679
Сам посчитай: https://www.sqlite.org/2018/sqlite-amalgamation-3250300.zip Похуй, сколько строк в файле. Программу разбивают на модули по смыслу, и чтобы не пересобирать и не линковать лишнее из-за мелких изменений. А к читаемости это никак не относится. Ну, разве что ты пользуешься модными "редакторами" на электроне, но в таком случае ты сам выбрал страдания.
south-park-wow-guy.jpg46 Кб, 704x396
344 1296689
>>296681

>Кстати, можно обернуть инициализатор в макрос


Оставить поле длины и подсчитывать макросом? Кокой же вариант выбрать, хм...
345 1296784
>>287378 (OP)
Есть ли гайды как запилить свой memory pool?
346 1296823
>>296784
>>296784
сорцы apr?
347 1297246
>>287378 (OP)
Может кто-нибудь посоветовать какую-нибудь литературу по ipc/параллельному программированию в POSIX и System V? Не по основам, с безопасными реализациями алгоритмов.
348 1297600
main()
{
func1();
func2();
pthread_create();
}

Тут все функции выполнятся строго по порядку, или компилятор может сделать так, что pthread_create() начнёт выполняться раньше?
349 1297625
>>297600
С чего бы им не по порядку запускаться?
350 1297630
>>287378 (OP)

решил я тут пдставить очко под этот ваш си, ебать, че там скачивать нужно, нотпад хуе мое?

стремящаяся-умственно-отсталая-веб-обезьянка
351 1297663
Анончики хэлп.
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? Или как более точно перевести. Не пойму что требуется в этом задание
352 1297678
>>297663
Нужно создать функцию, которая считает элементы массива которые подходят определенному условию, соответственно тебе нужно сделать так чтобы она принимала сам массив, количество элементов в нем и какой-либо предикат. Вот вроде функции remove_if в этой статье - https://ru.cppreference.com/w/cpp/algorithm/remove
353 1297680
>>297625
Где-то читал, что функция создания потока может стартануть раньше, но раз это не так, то ок.
354 1297682
>>287378 (OP)
Есть ли библиотеки для написания простеньких игр на Си?
355 1297690
>>297682
SDL2, CSFML, WinAPI, NCurses...
356 1297697
Все тянет начать писать игру, но никак не могу придумать, как бы накостылить на SDL2 гуишку для нее.
357 1297699
>>297690

>CSFML


Пробовал установить пару лет назад, ох и поебался я с ней тогда.
358 1297726
>>297697
Nuklear и его отродья.
359 1297727
>>297726
Не совсем то, мне внутриигровое гуи, надо, но спасибо, потыкаю.
360 1297809
>>297726
>>297727
Хм, придется руками прикручивать SDL_Renderer. Попробую лучше сделать свое, как нужно конкретно мне. Осталось только придумать, как адекватно коллбэки на кнопках обрабатывать - не хочу городить кучу глобальных переменных, чтобы менять сцены или там текст в текстбоксах обновлять.
361 1297862
Аноны, а где можно почитать про буферы и буферизацию? Рассказывается ли об этом в K&R или у Прата? Конечно, чтобы понять, что такое fully buffered, line buffered, unbuffered i/o мне хватило парочки тем на stackoverflow. Однако я не понял, почему при буферизации чтения и записи идет выигрыш в производительности. Есть некое абстрактное представление, но хочется конкретики, да и в этой абстрактности я не уверен. Хочется полных и точных объяснений, особенно, когда имеешь дело с Си. Например, мы имеем файл с записью "Hello". Мы fscanf'им его в массив. Так вот, зачем функция помещает эту запись сначала в буфер, а лишь затем - в массив? Ведь буфер - это и есть тот же самый масив. Зачем лишние действия?
Другой пример:
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?
Помимо этого, интересно, какая размерность у буфера?
Можно ли отключить буферизацию?
anonymous 362 1297868
двачик,родной ,выручай

Составить функцию для слияния двух упорядоченных по возрастанию массивов целых чисел.(используя функцию вне мэйна)
под слиянием имеется ввиду не сложение соответствующих элементов,типа 0-й из 1-го массива+0-й из 2-го массива=0-й в новом массиве,а именно запись их в ряд по возрастанию
не знаю шо робiтi(
363 1297891
>>297868
Почитай, про сортировку слиянием.
364 1297893
>>297891
Нахуя, я, поставил, там, запятую?
365 1297934
>>297862

> Однако я не понял, почему при буферизации чтения и записи идет выигрыш в производительности


В этом же самом треде: >>289184

> Так вот, зачем функция помещает эту запись сначала в буфер, а лишь затем - в массив?


Иначе fscanf будет ходит в ядро за каждым символом.

> Как я понимаю, это происходит на этапе завершения программы


Выход из main = exit(кодвозврата), exit = fclose всех файлов, fclose = fflush перед закрытием.
366 1298082
Новый ньюфаг вкатывается в итт тренд.
Поясните про задачку с getchar, что почти в самом начале. Почему выводится все, что я ввел, а не только первый символ? Как работает цикл в данном случае, он получается прогоняет getchar до того момента, когда брать больше нечего, или как? Тупой вопрос наверное, но лучше уж сразу в таких основах разобраться основательно.
367 1298130
>>298082

>Поясните про задачку с getchar, что почти в самом начале.


Что за задачка?
изображение.png20 Кб, 798x567
368 1298208
Почему это код не работает на ideone?
#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;
}
369 1298210
>>298208
Потому что майкрософтоговно ненужно. Используй scanf, а всем, кто будет возникать, говори #define _CRT_SECURE_NO_WARNINGS "Fuck you"
370 1298231
>>298130
1.5.1. Копирование файла
При наличии функций getchar и putchar, ничего больше не зная о вводе-выводе, можно написать
удивительно много полезных программ. Простейший пример — это программа, копирующая по одному
символу с входного потока в выходной поток:
чтение символа
while (символ не является признаком конца файла)
вывод только что прочитанного символа
чтение символа
Оформляя ее в виде программы на Си, получим
#include <stdio.h>

/ копирование ввода на вывод; 1-я версия /
main()
{
int с;
с = getchar();
while (с != EOF) {
putchar (c);
с = getchar();
}
}
371 1298248
>>298210
Почему говно и почему ненужно?
372 1298261
>>298248
Потому-что это жирнота.
373 1298319
>>298261
Конкретизируй. Если просто говорить новичку в какой-то области "это говно, а вот это не говно", то он никогда ничему у тебя не научится. Надо объяснять почему это говно.
374 1298345
>>298319

>Надо объяснять


Какие охуевшие дети пошли, да...
375 1298393
>>298345
Не можешь аргументировать == ты пидор
376 1298405
>>298393
пидор - это когда провели хуем по губам
377 1298443
Подгоните годное пособие по прогингу микроконтроллеров на С
Желательно AVR, но по факту похуй - надо на чем-то будет набить руку. Знаю азы Си, но хотелось бы погонять его там где он чаще и применяется (плюс у меня специальность радиотехника, с МК часто приходилось иметь дело, но вот сам я их не прогал)
379 1298531
>>298528
В хуяпку. Пошел нахуй со своими школьниками.
380 1298574
Потому что под маской всевозможных сканфов/принтфов скрываются системные вызовы read/write. Системный вызов - достаточно дорогая операция, в этом вы можете убедиться, к примеру, написав программу копирования содержимого одного файла в другой с помощью read/write (по 1 символу) и различных функций ввода/вывода из stdio, при это посмотрите время работы обоих программ. Разница будет коллосальна. Решение является буферизация содержимого. То есть вы складываете ваши символы в буффер и изредко его записываете с помощью write. То есть пишете не 1000 раз по 1 символу, а 1 раз 1000 символов, тем самым обращение к ядру, которое является столь долгим, происходит редко.
381 1298642
>>298528
заебись, после просмотра я закодил и теперь получаю 100к мес
382 1298643
>>287378 (OP)
Есть ли что нибудь встроенное чтобы проверить содержит ли string букву или слог? в идеале что-то вида:
s.contains("xy") -> Boolean
383 1298668
Приветствую, эксперты.
Параллельно с Пратой, начал изучать Тененбаума (ОС).
Пришла в голову дикая мысль - а что если купить 486 старый комп как полигон для написания разного софта по книге? Домашний ноут стремно трогать, я же нуб криворукий, сломаю еще что-то.
Совсем дебильная идея, или стоит все-таки?
Собираюсь ковыряться близко к железу.
384 1298670
>>298668

>Собираюсь ковыряться близко к железу.


VirtualBox
385 1298671
>>298668
Пошарься по вк, типа отдам даром. Я б в своём городе отдал пару системников без жд, но ты не в моей мухосрани же. Другое дело, что тебе это может быстро надоесть и лучше потренироваться на эмуляторах.
386 1298672
>>298668
Лучше виртуалку, там можно настраивать пека твой, хочешь 2гб памяти, а хочешь 8 мб, процессор, частота, сетевая карта, мышка, все что нужно.
387 1298674
>>298248
Потому что не добавляет безопасности, несмотря на громкий заголовок, зато добавляет ебли, потому что создает проблемы с библиотеками, потому что необязательное расширение стандарта, которое почти никто не реализует.

>>298643
strchr(), strstr(), != NULL

>>298670
>>298672
Двачую этих.
388 1298688
>>298574
а зачем делать буферизацию руками то? ну ты че
ввод-вывод стандартной библиотеки сишной буферизированный по умолчанию, причем более-менее оптимизированный под текущую платформу где рантайм сишный скомпилен, плюс есть функции записи буферизированных данных, функциии управления буферизацией
ребята, которые пилят основной сервис - почту на майлру, к примеру, пользуются стандартным вводом-выводом, им хватает по производительности.. просто в нужных местах в коде сбрасывают буфер и все.. когда надо..
389 1298779
>>298231
Too slowly! Should be use chunk of bytes for hasteful code, honey!
390 1298829
>>298574

>Потому что под маской всевозможных сканфов/принтфов скрываются системные вызовы read/write. Системный вызов - достаточно дорогая операция, в этом вы можете убедиться, к примеру, написав программу копирования содержимого одного файла в другой с помощью read/write (по 1 символу) и различных функций ввода/вывода из stdio, при это посмотрите время работы обоих программ. Разница будет коллосальна. Решение является буферизация содержимого. То есть вы складываете ваши символы в буффер и изредко его записываете с помощью write. То есть пишете не 1000 раз по 1 символу, а 1 раз 1000 символов, тем самым обращение к ядру, которое является столь долгим, происходит редко.



Ну, начнем с того, что это давно уже не так и там давно уже применяется mmap/MapViewOfFile, работающих напрямую со страничным механизмом OS.
391 1298845
>>298829

> mmap/MapViewOfFile


Это когда у тебя программа сегфолтится при вытаскивании флешки, с которой был открыт файл? Хороший механизм.

> что это давно уже не так и там давно уже применяется


Где там?
392 1298981
>>298528
Хуета
393 1299008
>>298393
Что аргументировать, тебя анон жирно протроллил, я в этом посте на это указал - >>298261

Дальше отвечал уже не я. Суть в том что те функции которые ты используешь добавлены мелкомягкими чтобы предотвратить гуляние по памяти в случае отсутствия в конце строки нуль-терминатора, по сути они эквивалентны обычным, только в функциях с "_s" в конце ты так же указываешь предел на котором функция должна остановиться в случае отсутствия нуль-терминатора. В IDE под linux и MAC, и на сайте ideone таких функций нет, потому-что они выпускаются не мелкомягкими.
awesome.jpg11 Кб, 214x229
394 1299022
>>298670
>>298671
>>298672

Спасибо большое, поставить виртуалку как-то даже и в голову не пришло.
395 1299167
>>299022

>как-то даже и в голову не пришло


Ты точно хочешь быть погромистом?
396 1299216
>>299008

> тебя анон жирно протроллил


Где я его потроллил? Предложение задепрекейтить Annex K в С21 как бесполезный и неиспользуемый уже обсуждалось рабочей группой. Хуй знает, правда, приняли или нет, но дело к тому шло.

> чтобы предотвратить гуляние по памяти в случае отсутствия в конце строки нуль-терминатора


Не только. Там есть и другой контроль границ. Например, когда строка не влезла в буфер целиком, в Си она обрезается, а у Microsoft возникает constraint violation. В любом случае, все, что есть в Annex K без возможности выбора, нормальными людьми реализуется по необходимости максимум двумя дополнительными строками кода. Просто майкрософт считает, что это круто, когда нужно повторять повторять размер буфера для memcpy_s().
JN9wk8OgfRg.jpg73 Кб, 740x740
397 1299291
Привет всем С господинам! Остальные лесом>>>

Подскажите, видел кто в открытом доступе эту книгу, хочу с ней познакомиться!
398 1299363
>>299291
на рутреке только по плюсам, джаве, шарпе..
399 1299393
if (!anglusik)
idti_na_hui(>>299291);
else
idti_na_libgen(>>299291);
400 1299407
>>299393
#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();
}
}
401 1299409
Анончик, где есть интересные задания по Си? Недавно выучил синтаксис, хочу поделать что-то.
Хочется что-то интересное и полезное
402 1299412
>>299409

>интересное и полезное


пиши малварь
404 1299419
>>299409
вливайтся в опенсорс, епт
не шучу
не на гитхаб иди
у того же гнома сотни проектов, систем и программ которые надо доделывать и дорабатывать
https://developer.gnome.org/
405 1299660
>>287378 (OP)

Деды, не бейте, лучше обоссыте, но ответьте на вопрос! Нужна библиотека простой 2d графики для сишки. Ну грубо говоря чтобы там можно было визуализировать всякие простые физические процессы например молекула отскочила от стенки сосуда лол, какие-нибудь аналоговые часики сделать, солнечную систему, такого вида Что посоветуете?

Обязательно должно работать в линупсе и желательно, чтобы это была для него родная библиотека.
406 1299688
>>299660

>Что посоветуете?


Ешь кашу и слушайся родителей
407 1299715
>>299660
sdl2 сойдет?
408 1299718
>>299715

Мне кажется это через чур сложная штука для моих задач. Я думал может взять какое-нибудь GTK+, там же есть вроде виджеты, в которых можно рисовать? Но что-то литературы по gtk3 вообще нет, все по gtk2.
Сергей Серпухин 002.jpg11 Кб, 274x184
409 1299851
Меня притягивает С, но отпугивает то, что в какой-то момент я неизбежно столкнусь с СПО.
Но проблема в том, что СПО на 99,9% состоит из говна (на самом деле на 100%, но не будем категоричны).
410 1299855
>>299851
Из моего опыта следует, что ты не прав.
411 1299858
>>299851
Из 100 не СПО, СПО где-то 98,7%
blob4 Кб, 639x143
412 1299930
друзья, помогите пожалуйста. учусь в школке и делаю какие-то тупые задачи (c99), но столкнулся вот с некоторой проблемой. задача - считать n строк, как-то там обработать, вывести. при этом использовать динамическую память. проблема внезапно на этапе считывания, причем понять в какой строчке происходит краш не могу. код -- hastebin.com/ibuwucoqif.cpp. при вводе корректных данных типа 4 принтит err1, но не принтит err2. если добавляю в аргумент ф-и scanf_string что-то типа (+ printf("err3\n") - printf("err4\n")), то указатель я как бы не двигаю, но эти строчки прога принтит (т.е. аргумент высчитывается без краша, так ведь?). тогда где вообще может краш произойти, если сразу по вызову ф-и scanf_string должна напечатать err2? короче идейно не понимаю в чем проблема и надеюсь на помощь от богов-профессионалов
413 1299943
414 1299944
>>299930
Охуительный у тебя враппер конечно
415 1299949
>>299930
Аллоцировать 9000001 байт на каждом вызове функции это гениально.
416 1300080
>>299949
Хихикнул.
посоветуйте ему, что поменять, мне его жалко
417 1300211
>>299855
Все знают про тысячи полуграмотных индусов, пишуших платное ПО неземного качества?
Так вот СПО пишут те же индусы, только в свободное время, бесплатно и с результатом, за который никто не отвечает.
Все лучшее СПО (те самые 0,01%) суть бывшее платное, чуть допиленное сообществом (кроме GIT). Либо крякнутое. Крякнутое платное ПО - лучшее по качеству, не знаю почему так получается.
Например, некоторые упоротые сравнивают LibreOffice и MS Office.
Казалось бы, как можно сравнивать? Вообще разные весовые категории. Но не стесняются и сравнивают.
418 1300212
>>299930
scanf умеет динамически аллоцировать память и возвращает указатель, потом нужно юзать free на поинтер
делой man scanf примерно в конце было даже с примером
419 1300214
>>300212
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");
}
420 1300215
>>300211

Ты вообще не разбираешься в вопросе.

> Так вот СПО пишут те же индусы, только в свободное время, бесплатно и с результатом, за который никто не отвечает.



СПО в основном пишут богатые белые представители загнивающего запада, у которых есть свободное время на хобби и не стоит вопрос сдохнуть с голода.
421 1300217
>>300215

>СПО в основном пишут богатые белые представители загнивающего запада


Да ну?? Почитай любые вопрос-ответ треды, каждый первый ответ - ДИНЕШ и РАДЖЕШ
Но.. Если ты прав.. Пиздец. Все гораздо хуже чем я думал.
422 1300219
>>300217

Раджешам семью кормить надо, какое им спо?
Prisoncopycopycopy.jpg60 Кб, 500x376
423 1300258
>>300219
Какая семья в 13 лет??
424 1300269
>>300211
индусы очень мало делают вклада в спо
даже русских там больше чем их
основной вклад - белые европейцы и сша, мужчины
черные, желтые и бабы вообще мало кода пишут, это реальность
425 1300270
>>300269
хотя насчет желтых погорячился, китайцы и японцы ебашат спо тоже чутка
426 1300348
>>299419

>https://developer.gnome.org/


Можно в кратце что куда кликать ,что бы получить задания которые актуальны?
427 1300349
429 1300392
Ребят, а что за debuger во всех компиляторах, если в двух словах?
Еще видел онлайн компилятор, который код C показывает в ассемблер виде, но уже не нахожу ссылку
431 1300416
>>300394
Are you a god?
image.jpeg206 Кб, 640x633
432 1300420
>>300394

> godbolt



Божественный хуй, ну и имя доя домена кек
15384124032890.jpg121 Кб, 500x504
433 1300424
434 1300448
>>300420
а представь, как мужику живется с такой фамилией
435 1300564
>>299167
Ты охуеешь наверное, но мне на днях ещё и 40 исполнилось. Имею твердое желание выкатиться в embedded джуном.
436 1300571
>>300564
Ну тогда начинать с x86 - только время терять.
437 1300587
>>300571
Сишечка - она везде сишечка, какая разница.
438 1300594
>>300571
Господин Тененбаум?! Как вас сюда занесло?
439 1300604
>>300587
Ну он же написал:

> Собираюсь ковыряться близко к железу.


> Имею твердое желание выкатиться в embedded


Одной лишь сишечкой в embedded не обойтись, всегда будут всякие специфичные для платформы вещи, да и саму платформу понимать стоит, если цель - не хелловорды не только светодиодами мигать. А что касается x86, то железо, используемое там, либо очень сложно программировать для начинающего (современное), либо давно устарело и с embedded не пересекается вообще. Лучше сразу взять какую-нибудь малинку, стмку или даже аврку на худой конец, чем разбираться в давно никому не нужных тонкостях работы 8272A.
440 1300639
>>300604
Спасибо за ответ!
Это я спрашивал.
То есть ты даже 286 не советуешь?
А с чего начать? У меня есть такое ощущение, что начинать с Малинки вместо контроллера, это как вместо С учить сразу С#.
441 1300663
>>300639

> что начинать с Малинки вместо контроллера, это как вместо С учить сразу С#


Можно дрова в линуксе писать, а можно экономить байты. Эмбеддед - это не только микроконтроллеры с килобайтом рамы.

Си лучше учить на своей пеке, а не ебаться с кросскомпиляторами и удаленной отладкой. А поиграться со знаниями, почерпнутыми из Танненбаума, можно на qemu-system-xxx, реальная железка не нужна, особенно поначалу.

> То есть ты даже 286 не советуешь?


Можно, конечно, листать пыльного Джордейна, писать демосцены 16-битным кодом, но зачем? Что ты с этими знаниями делать собираешься? Ну ладно в российских вузиках мсдос в студентов пихают, потому что преподы ничего другого не знают. Студенты сдали и забыли, а самостоятельно-то зачем в это вляпываться?
442 1300703
>>300663
Здоровья и счастья тебе.
443 1300774
Пытался написать программу, которая находит вводимое число в водимом массиве и указывает позицию элемента в массиве, но непонятно откуда перед итоговыми числами появляются нули. Кто-нибудь, объясните откуда нули там незначащие нули.
#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.
444 1300778
>>300774
Ладно, я сам нашёл ошибку. Тема закрыта.
445 1300902
Хотел написать простенький mymallok(), пишу под Windows, включил <stdlib.h>, <stdio.h>, <stdint.h>, <stdbool.h>, <assert.h>, sys/types.h>, <unistd.h>, <string.h>, <windows.h, но компилятор так и не видит декларацию brk(), sbrk(), mmap(). Что я` не так?
446 1300955
>>300902
Ты unix'овые вызовы пытаешься использовать. Лучше поставь linux-виртуалку и там же и пиши.
447 1300959
>>300902
Под Windows у тебя есть VirtualAlloc()/VirtualFree(), их и используй. Ну и еще Pelles C поддерживает _mmap(), в аллокаторе можно им одним обойтись.
448 1300962
>>300955
>>300959
Ясно, спасибо. Я думал это стандартные функции Си.
449 1301473
Мой план на ближайшие 9 месяцев:
(В примерно хронологическом порядке)

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

Что потом - не знаю, надеюсь там будет видно.
Цель - эмбеддед/гейм/.... То есть поближе к железу, плюс физика, механика, матрички, вот это вот все.
image.png765 Кб, 600x600
450 1301474
451 1301480
>>301473

Если ты со всем этим будешь разбираться, а не просто ЧИТАТЬ, то это минимум года на 2.
452 1301497
>>301480
У меня уже есть вышка, я инженер-механик. Мне уже много лет.
453 1301514
>>301497
Мне тоже много лет, но я согласен с >>301480.
454 1301519
>>301497

> У меня уже есть вышка, я инженер-механик. Мне уже много лет.



Ну это типа не в плюс, а в минус при обучении. Потому что если ты собрался учить сишку с нуля, очевидно в вузике ты совсем не погроммировал.
455 1301523
>>301514
После вдумчивого изучения направлений и доступных материалов для самостоятельной работы, а так же подобных универститетских и колледжских програм, пришел к данному списку.
Это минимум, база, после которой можно, собственно, думать о вкатывании.
Я ориентируюсь на где-то год. Но если возьмет 2 то так тому и быть. К сожалению, я не вижу других вариантов.

С благодарностью приму поправки и советы от бывалых.
456 1301526
>>301523

Ну тащемта для вкатывания гораздо важнее практический опыт, чем какие-то теоретические знания. Если ты не знаешь и трети, что написано в этих книгах, но имеешь какой-то более-менее полезный пет-прожект, для работодателя ты будешь на порядок интересней теоретика, прочитавшего тонны книжек, но не имеющего никакого опыта.
457 1301527
>>301519
Ну почему же. Я программировал, но больше функции для вычислений. Использовал С как продвинутый калькулятор так сказать.
Ну и MatLab в основном.
Я довольно быстро (как мне кажется) схватываю материал, единственное препятствие для меня сейчас - нехватка свободного времени.
Скачал лекции про ОС, слушаю пока еду на работку.
458 1301528
>>301526

>для вкатывания гораздо важнее практический опыт


Абсолютно согласен, через год будет понятно как подступиться к прожекту, тем более идейки у меня есть.
459 1301530
>>301523
к&r читани корка от корки, все упражнения сделай, не игнорируй приложение, медитируй над ним, это нужно
по структурам и алгоритмам ебани пару курсов, хотя бы на том же спепике, плюс заебашь 200-250 (больше нахуй не надо) алгоритмических задач хотя бы на том же hackerrank или на любом подобном, десятки их щас
дальше уже ходи по собесам, вкатывайся за еду бля
а так ты скорее с голоду сдохнешь читая весь тот лольный список что ты себе составил
460 1301538
>>301530

>по структурам и алгоритмам ебани пару курсов


Я реально быстрее учусь по книгам. Если бы было время смотреть курсы, я бы за это время уже закончил свой лольный список.
461 1301540
>>301530
А пет прожект?
462 1301541
хотя вкатываться в 40 лет в геймдев
о хо хо
463 1301544
>>301538

>


я не про видеоуроки от васянов на ютубе
я про курсы где есть упражнения и задания, где надо делать кодинг и где есть проверяющая система
от того что ты там че то читаешь или смотришь в голове остаешься 0
464 1301545
>>301540
вы, кстати, чутка неправильно оборот используете
"пет прожект" это вообще то когда сформировавшийся кодер у которого есть уже основная работа по выходным ебашит что-то приятное ему вдобавок
это как у линукса есть собственно операционка, и пет-прожект это он на qt (лол) пилит какую-то приложуху для учета статистики дайвинга
465 1301649
В тред призываются опытные системные прогромизды.
Какие вилки у мидлов-сеньеров системных программистов в ДС? Интересуют крупные компании типо Яндекса, мейла, касперского и тд.
466 1301671
>>301649

>Яндекса


40к-50к
467 1301672
>>301649
120-250к
и, вообще то есть глассдор, всегда можешь глянуть там
468 1302037
>>300604
А вот такой вопрос.
Микропроцессор или микроконтреллер? С чего лучше начинать?
469 1302183
Привет байтовелители, хочу вкатиться в сириоз девелопмент.
Хочу читать этот список >>301473, но вместо этого решил читать /pr.
Какие подводные?
470 1302267
>>301672
О, спс, не знал про этот сайт. Просто недавно апнули с джуна до мидла, спрашивали сколько я хочу (получилось 130к чистыми, 150 gross), теперь думаю не продешевил ли.
471 1302656
Посоветуйте годные блоги, где публикуются статьи о программировании на Си (желательно англоязычные). Можно даже заброшенные блоги, но с доступным архивом для чтения.
473 1302713
>>301523
Хуйня, не ссы главное сиди днями занимайся этим и перерывы делай. Хотя кому я пизжу, сам сижу каждый день марафоню.

Не... Нужно отвлекаться все же, на изучение самой системы, использования Сишки для упрощения жизни на Шлинуксе или там, ради себя ебни бсдшку и поизучай параллельно. Этот мир не только об одном языке, заебешься. Его нужно использовать, тебе тот же Прата скажет тоже самое, что развитием нужно заниматься используя язык.

Я угараю еще как многие на шлинукс приходят и игнорируют баш скрипты.
474 1302714
>>302713
Еще на Гитах сидеть код разбирать. Не надо одни книжки читать, ебаш форумы. Ну я говорю просто как я делал.

Алсо туториалы - Нахуй. Чем ты отличаешься от других тогда, если ебашишь одно и тоже?
475 1302715
С туторов можно спиздить что-то, но туторы должны быть бесплатные, иначе это просто способ навариться на ванаби и кста код у этих УЧИТЕЛЕЙ ЕБАНЫХ говнище такое позорное.
476 1302717
Но над быть осторожным, чтобы не кончить как Терри Дейвис...
477 1302719
>>302656
nullprogram.com
478 1302978
>>302713
>>302714
>>302715
А ты сам всё ещё учишь или может уже успешный и на работу таки устроился?
мимо
479 1303432
Аноны, а помогите найти что-нибудь прочитать про кросс-компиляцию с x86_64 в ARM. Вот у меня есть gcc и есть телефон, нак который я могу скинуть какой-нибудь код. Как компилировать?
480 1303437
>>302978
Я поехавший ванаби который каждый день пишет на Си и мечтает в будущем переехать на ассемблер, планирую в сфере хакинга использовать.

Щас тема интересная, где типа вирусы можно писать на уровне железа.
481 1303469
>>303437
Это конечно здорово, но ты деньги уже начал зарабатывать?
482 1303837
>>303432

> Вот у меня есть gcc


Кросскомпилятор для AArch64 или обычный для x86-64? Если обычный, то тебе нужен кросскомпилятор. Качаешь http://releases.linaro.org/components/toolchain/binaries/ распаковываешь, компилируешь. А еще лучше качаешь NDK: https://developer.android.com/ndk/downloads/, распаковываешь (компиль в папке toolchains, сисрут внезапно в sysroot), компилируешь.

> Как компилировать?


Точно так же, как обычно, только с правильным --sysroot.
483 1304023
>>303469
Неа.
485 1304184
>>304023
Понятно.ничего удивительного
486 1304240
>>304184
А хуль понятного то? Найди мне работу. Я уже заебался на гите и гитлабешнике сидеть.
487 1304272
>>304240
Хуй знает, попробуй сам найди, я вообще дрочил полгода плюсы, а потом устроился на работу, сейчас ебашу драйвер на си.
488 1304399
Почему ничего не выводит?
wchar_t wtext[] = L"строка";
wprintf(L"%s\n", wtext);
489 1304411
>>304399
L"%ls"
490 1304421
>>304411
Тоже самое.
491 1304459
>>304421
Вызывал перед этим обычный printf? Покажи полный код.
492 1304464
>>304459
Нет, это полный код.
493 1304502
>>304464
Винда, MSVC или MinGW, которые линкуются к сломанной майкрософтом CRT, которая хочет %S? Больше идей нет.
494 1304503
>>304502
Линукс.
495 1304508
>>304503
У тебя вообще ничего не печатало? Локаль выставлял?
#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);
}
496 1304520
>>304508
setlocale помогло.
Почему к стати если вставить обычный printf, то перестает работать?
497 1304530
>>304520
Потому что у потока есть ориентация, и если ты однажды пишешь в него wide, ты больше не можешь mbcs. И наоборот. Можно только явно менять ориентацию с помощью fwide. Связано это с особенностями многобайтовых кодировок, в том числе и UTF-8, но особенно всяких Shift-JIS.
498 1304608
Сап аноны. Помогите найти ключ gcc, который отключает препроцессор. То есть я отдельно вызываю препроцессор, а только потом хочу попытаться вызвать gcc, но он всегда первым делом снова прогоняет препроцессор, а мне это не надо.
499 1304610
>>304608

> То есть я отдельно вызываю препроцессор


Генерируй .i, а не .c.

> Помогите найти ключ gcc, который отключает препроцессор


-x cpp-output, но вариант с расширением правильнее.
500 1304614
>>304610
Тону чая тебе, антош.
ПЕРЕКАТ # OP 501 1305159
>>1305157 (OP)
>>1305157 (OP)
>>1305157 (OP)
>>1305157 (OP)
>>1305157 (OP)

Тем временем понемногу начинают редактировать черновик C20/21: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2310.pdf
Тред утонул или удален.
Это копия, сохраненная 5 января 2019 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски