Вы видите копию треда, сохраненную 24 апреля 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Что читать:
- Классика от Отцов: http://www.cypress.com/file/56651/download
- Годное пособие для гуманитариев: http://c.learncodethehardway.org/book/
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (он же C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт) не драфт ищем на торрентах
- Стандарт ISO/IEC 9899:2011 (он же C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- man/Dash/zealdocs
Чем конпелировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio 2015 Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и неполной поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Что еще почитать:
http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.
Stephen Prata "C Primer Plus, 6th Edition" (2014)
Свежая знает про C89, C99, C11, описывает различия, объемная около тысячи страниц, годная хотя есть некоторые шероховатости, с вопросами, упражнениями и ответами. Читать после K&R или до.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)
Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Stephen G. Kochan "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard
Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C
Прошлые треды:
- https://arhivach.org/thread/106153/
- https://arhivach.org/thread/131949/
- https://arhivach.org/thread/140570/
- https://arhivach.org/thread/153698/
- https://arhivach.org/thread/155908/
- https://arhivach.org/thread/173837/
- https://arhivach.org/thread/180461/
- https://arhivach.org/thread/182958/
- https://arhivach.org/thread/188294/
- https://arhivach.org/thread/193780/
- https://arhivach.org/thread/198868/
- https://arhivach.org/thread/206632/
- https://arhivach.org/thread/211714/
- https://arhivach.org/thread/217128/
- https://arhivach.org/thread/223224/
- https://arhivach.org/thread/235327/
Шапка: http://piratepad.net/bJ1SdmkZyu
Ты жоподум
В идеале стоит стремиться в тому, чтобы .h сам разбирался со своими зависимостями, не вынуждая угадывать, в каком порядке нужно подключать хедеры. А остальные хедеры, конечно, нужно подключать в .c, по мере необходимости. Если много файлов с однотипными зависимостями - например, подсистема какая-нибудь, можно собрать хедер для подсистемы. Но это уже вкусовщина.
Так может, без велосипеда можно обойтись виндовыми функциями. В структуре sockaddr_in в каком формате хранится IP? Может, просто загнать туда и все?
inet_ntoa, но адрес должен быть в big endian (если нет - htonl сначала).
А. Таненбаум, архитектура компьютера.
Если тебе от него «скучно» — пiздуй на завод профессия не для тебя.
Хотел про него в посте упомянуть, но подумал и так понятно. Он не весёлый. Не обязательно такой подробный учебник. Пусть там просто будет байтоёбство и код. Чтобы можно было самому с ним поиграться.
>>924655
Сам пиздуй. Раскомандовался тут.
— Норот, пасскажытти учебник на 7-струнной гитаре, шоб весело было, с цыганнами, с мэдвэддямы...
— Андрей Сихра, «Самоучитель для 7-струнной гитары, которую я только что изобрёлъ», самиздат 1895 г.
— Хотел про него в посте упомянуть, но подумал и так понятно. Он не весёлый. Не обязательно такой подробный учебник. Пусть там просто будет байтоёбство и код. Хочю как «Ласковый май» на сцене гнусавить с гитаркой. Чтобы можно было самому с ней поиграться.
Ой всё
Как человек, окончивший музыкалку, авторитетно заявляю, что самоучители - говно, а тот, кто провел такую аналогию - пидорас. Преподавать тоже надо уметь.
Как кун с 4ёхлетним декретным отпуском в музыкалке заявляю, что музыкалка - говно.
Прочитал 20 страниц и пролистал по диагонали. Похоже байтоёбство есть и учебник весёлый. Хотя это скорее ненормальное программирование чем байтоёбство. Про ос не нашёл. Есть моар? Люблю когда есть выбор.
> ненормальное программирование
Схуяли? На форте как и 20 лет назад софт пишется, бабло мутится. Хотя по этому
>Похоже байтоёбство есть и учебник весёлый
Я понял, что ты обычный стремящийся, для которого байтоёбство это битовые структуры считать и в 2кб памяти уместится.
Доставьте тоже самое, но на си, пожалуйста. Весь гугл забит крестами, да чтож это такое.
c the hard wai
Нужно написать подсистему логирования данных. Требования: конфигурируемый размер лога, при превышении размера лога удаление старых записей с низким приоритетом. Проблема: разработка гибкой, понятной архитектуры.
Написать мусор достаточно просто, но нужно жизнеспособное решение. Я ещё совсем неопытный сиблядок, поэтому пригодная архитектура в голове у меня не сложилась. Можно использовать всякие syslog'и и logrotate'ы, однако, как я понял, эти ребята не поддерживают анализ содержимого лога для удаления неактуальных записей.
Какая СУБД? Какое это вообще имеет отношение? Это не интерпрайз. Достаточно писать в файлы.
Окей, изобретай каменное колесо, ебись с консистентностью, атомарностью, решай проблемы, давно решенные создателями бд и логдвижков.
>Достаточно писать в файлы.
Ага, потом копировать в новый ибо начальные строки уже устарели, тем более еще и сканить/парсить на приоритет, знакомся с SQLite ну или юзай логирование ОС.
СУБД проще вариант, но насколько я знаю они не очень-то любят удаление записей, по факту место освобождается не сразу и с дополнительной еблей, разного рода OPTIMIZE TABLE и подобная хуйня с перезаписью базы. Хотя если удалять не часто то врядли особо проблемы будут.
> https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard
годно, однако, чтобы выправить говнокод
Какая буржуйская норма описывает требования к ПО, ответственное за "safety". Ну, там мониторить что-либо и надёжно вырубить, если трабла
Тут есть кто-нибудь, кто игры на плюсах пишет? (OpenGL, Unity)? А то собираюсь игрулю писать, а крестотреда нет.
OpenGL-тред и прочие игрули в /gd/.
Нет не может. Отрицательных чисел не существует - это выдумки жидовских математиков. Православные языки таким не занимаются.
Понятно что отрицательные числа есть, но конкретно из операции вычитания я их не могу получить.
> Вместо отрицательного резалта, выдает рандомный наборм цифр
> unsigned int объяви переменную
unsigned int a;
unsigned int b;
scanf("%d", &a); // При условии что b больше a
scanf("%d", &b);
printf("%u", a - b);
Хуй, а не отрицательное значение
???
Вот они пейсали:
http://www.opennet.ru/opennews/art.shtml?num=45914
Рассмотрев все за и против оптимальным признан путь миграции рабочего стола Budgie на Qt. По мнению разработчиков, переход на Qt положительно отразится на производительности, позволит реализовать новые возможности и расширить графические эффекты. При этом в основной кодовой базе планируется использовать только средства разработки на C++ и отказаться от применения языка Vala. В Budgie также не будет применяться QML и библиотеки KDE. Подобное ограничение не распространяется на сторонние виджеты, авторы которых вольны применять QML. Переход на Qt не означает обеспечение совместимости с KDE Plasma и проект продолжит ориентацию на запуск приложений GNOME, обеспечив их бесшовную интеграцию в окружение на базе Qt.
Смешались в кучу пони, люди. При сложении и вычитании unsigned int, представленных n битами сишечка выдает результат по модулю 2^n. Ну и, конечно, при вычитании unsigned чисел, если не было integer promotions, signed у результата взяться неоткуда.
там поле заполняемое из спровочника, второе поле с числом и один флаг
да
мамку ебал
забыл добавить, что это ссылка на статью на хабре, в которой вроде объясняется "на пальцах" но язык какой-то странный и ужасный используется
уже не актуально.
Какие сейчас перспективы у С-программиста на рыночке? Или без крестов или шарпа нехуй делать?
Ты зарплаты смотрел или спутники?
Цэ - это эмбед, жОсткое байтоёбства с оупенсорц. Контроллеры и натягивание юбута с линухом на всё.
Как понимаешь, перспективы не для хипстеров.
Для Си - надо родититься в свитере.
Паяльник-то в руках дрежал?
А сколько времени хуй держать? Пока не перезвоните?
Интересно послушать о поделиях с паяльником. Процессоры паял?
нашел, не благодари
юморно. ставлю структ.
P.s. Есть CLion, норм?
Окай,спасибо,гляну
>>928551
А что юзают не начинающе, а вполне себе продолжающие, на линуксах?
кТО МЫ? КТО МЫ-ТО? Я ОДИН ЗДЕСЬ НАХУЙ!
-- The C compiler identification is unknown
-- The CXX compiler identification is GNU 5.1.0
-- Check for working C compiler: C:/FPC/2.6.4/bin/i386-win32/gcc.exe
-- Check for working C compiler: C:/FPC/2.6.4/bin/i386-win32/gcc.exe -- broken
gcc
gcc: No input files
Как эта тупая пизда может не видеть GCC если он прописан в PATH? и за каким хуем лезть в пацкаль?
Чё линух-то сразу? RTOSы для кого придуманы? Да и вообще ОС не всегда нужна, от задач зависит.
Ну давай, расскажи нам как пикапить телок на джаве
Ну когда автобус резко затормозил, а я стоял, не держась за поручни, я полетел в тянку и прижал ее к задней стене автобуса. Ну я покраснел и сказал "извините пожалуйста". Тянка была примерно моего возраста.
Программировал. Учился по книге из оппикчи.
нет ((
int str2int(char str[]){
int val=0;
for(int i=0;str!='\0';++i,val=10){
switch (str){
case '0':
val=10;
break;
case '1':
val+=1;
break;
case '2':
val+=2;
break;
case '3':
val+=3;
break;
case '4':
val+=4;
break;
case '5':
val+=5;
break;
case '6':
val+=6;
break;
case '7':
val+=7;
break;
case '8':
val+=8;
break;
case '9':
val+=9;
break;
}
}
return (str[0]=='-') ? -val/10 : val/10;
}
Написал до того как нашел функцию в стандартной библиотеке, однако когда посмотрел код там у них одни макросы и хуй пойми что еще, и концы идут непонятно куда (GNU).
Как оно по нормальному реализуется то?
int str2int(char str[]){
int val=0;
for(int i=0;str!='\0';++i,val=10){
switch (str){
case '0':
val=10;
break;
case '1':
val+=1;
break;
case '2':
val+=2;
break;
case '3':
val+=3;
break;
case '4':
val+=4;
break;
case '5':
val+=5;
break;
case '6':
val+=6;
break;
case '7':
val+=7;
break;
case '8':
val+=8;
break;
case '9':
val+=9;
break;
}
}
return (str[0]=='-') ? -val/10 : val/10;
}
Написал до того как нашел функцию в стандартной библиотеке, однако когда посмотрел код там у них одни макросы и хуй пойми что еще, и концы идут непонятно куда (GNU).
Как оно по нормальному реализуется то?
Почему многопоточность до сих не входит в стандарт языка?
Правда ли что на С код может быть более тормозной чем на плюсах? Я вот сталкивался с тем что пхп высирает тысячи строк в консоль в мгновение ока, а все остальное включая сишку и ноду делает это секунд 10.
Ну а теперь поясни как по людски делать.
>Правда ли что на С код может быть более тормозной чем на плюсах? Я вот сталкивался с тем что пхп высирает тысячи строк в консоль в мгновение ока, а все остальное включая сишку и ноду делает это секунд 10.
Без конкретных примеров это всё просто сотрясание воздуха. На любом языке код может быть более тормозным, чем на другом языке.
Спасибо.
>Поясните за ptreads, или где за него норм поясняют?
Ричард Стивенс, книги про Unix, любые.
>Почему многопоточность до сих не входит в стандарт языка?
В других ОС другие функции, на микроконтроллерах вообще всё не так.
В том числе стандарт MISRA C велит всё делать в один поток, и так далее...
>пхп высирает тысячи строк в консоль в мгновение ока
Он кеширует вывод.
>а все остальное включая сишку и ноду делает это секунд 10.
А они нет.
И ещё у него строки с заданной длиной, т.е. функция присоединения строки к строке быстро работает.
Почему разрешается менять размер массива? Как можно вызвать LA[5], если декларированная длина - 5 элементов?
#include <stdio.h>
main() {
int LA[] = {1,3,5,7,8};
int k = 3, n = 5;
int i, j;
printf("The original array elements are :\n");
for(i = 0; i<n; i++) {
printf("LA[%d] = %d \n", i, LA);
}
j = k;
while( j < n) {
LA[j-1] = LA[j];
j = j + 1;
}
n = n -1;
printf("The array elements after deletion :\n");
for(i = 0; i<n; i++) {
printf("LA[%d] = %d \n", i, LA);
}
}
Почему разрешается менять размер массива? Как можно вызвать LA[5], если декларированная длина - 5 элементов?
#include <stdio.h>
main() {
int LA[] = {1,3,5,7,8};
int k = 3, n = 5;
int i, j;
printf("The original array elements are :\n");
for(i = 0; i<n; i++) {
printf("LA[%d] = %d \n", i, LA);
}
j = k;
while( j < n) {
LA[j-1] = LA[j];
j = j + 1;
}
n = n -1;
printf("The array elements after deletion :\n");
for(i = 0; i<n; i++) {
printf("LA[%d] = %d \n", i, LA);
}
}
> Почему многопоточность до сих не входит в стандарт языка?
Потому что уже 6 лет как входит.
>>929174
> А они нет.
В Си по умолчанию есть кэширование stdout. Возможно, стоит узнать о setvbuf и указать буфер побольше?
>>929179
Менять размер массива нельзя. В коде просто вводится САМООГРАНИЧЕНИЕ на количество элементов в массиве. В памяти по-прежнему лежит 5 интов, но последний цикл читает только до n, который равен 4.
> Как можно вызвать LA[5]
Никак, при n = 5 тело первого цикла уже не выполняется, т.к., n < 5 ложно. То же и при n = 4 во втором цикле.
>>929189
>>929184
Блядь, не тот пример скопипастил, вот это имелось ввиду:
#include <stdio.h>
main() {
int LA[] = {1,3,5,7,8};
int item = 10, k = 3, n = 5;
int i = 0, j = n;
printf("The original array elements are :\n");
for(i = 0; i<n; i++) {
printf("LA[%d] = %d \n", i, LA);
}
n = n + 1;
while( j >= k) {
LA[j+1] = LA[j];
j = j - 1;
}
LA[k] = item;
printf("The array elements after insertion :\n");
for(i = 0; i<n; i++) {
printf("LA[%d] = %d \n", i, LA);
}
}
>>929189
>>929184
Блядь, не тот пример скопипастил, вот это имелось ввиду:
#include <stdio.h>
main() {
int LA[] = {1,3,5,7,8};
int item = 10, k = 3, n = 5;
int i = 0, j = n;
printf("The original array elements are :\n");
for(i = 0; i<n; i++) {
printf("LA[%d] = %d \n", i, LA);
}
n = n + 1;
while( j >= k) {
LA[j+1] = LA[j];
j = j - 1;
}
LA[k] = item;
printf("The array elements after insertion :\n");
for(i = 0; i<n; i++) {
printf("LA[%d] = %d \n", i, LA);
}
}
Вот вывод:
> Анон, этот пример ломает мне мозг
А что, если я скажу тебе что массив это ЕБАНЫЙ МАКРОС?
http://ideone.com/YFLDAa
Закопай это. И автора примера рядом закопай, потому что так делать нельзя, ты пидарасишь стек.
>printf("LA[%d] = %d \n", i, LA);
Шта? Как это может вывести значение элемента массива, когда здесь должно быть выведено значение указателя LA?
У макаки спроси.
Nano, a лучше божественный sandy.
да
Первые 128 символов UTF-8 скопированы из ASCII. Мало того, эти символы не встречаются в continuation bytes UTF-8, поэтому при парсинге чисел знать про UTF-8 совершенно незачем.
>128
127
Алсо, для индексации символов приходится перебирать всю строку с начала. Как это сделать более лучше? Есть либы, где строка индексируется блоками, чтобы хоть не с начала перебирать?
Спс, я посмотрел как это делается, там -'\0' делается, ну не такая хуйня как свитч по крайней мере.
Туго в сишке без ассинхронного выполнения, Iterators, Generators, Promises,callback functions, Destructuring, Coercing, strings, вот когда все это завезут сишка вернет былую величь.
Хорошо хоть в FB и OOP кое-как можно.
Указатель итерируй.
А вообще имеет ли смысл использовать асинхронность вместо многопоточности, при условии что ОС может в многопоточность?
Как оно в железе происходит, если я на кнопку должен нажать процессор ждет сигнала или все время проверяет в каком состоянии кнопка?
Имеет, если программируешь прокси/лоад-баланцырь. В остальных случаях значимость сильно преувеличена, поскольку ботлнек как правило в других местах.
Ну, тут целых три понятия на самом деле:
1) потоки, поддерживаемые API ОС типа posix threads
2) искусственные потоки, которые типа быстрее и легче, но на самом деле только в очень частных случаях
3) ну и асинхронность, собственно. Асинхронность в сях есть изначально, поскольку это не вопрос языка даже.
асинхронность это же просто общее понятие, которое обозначает недетерминированное выполнение кода, под которое попадают и треды, и параллельные процессы
Я под асинхронностью имел в виду асинхронность при том что поток один.
Вот например у меня кусок кода который выполняется 4 секунды, после этого я вызываю асинхронную функцию которой передаю строку и цифру, вот все выполнилось но програма не закрылась и на 5 секунду выводит строку.
Вообще да, но есть асинхронность с коллбэками/сигналами, а есть асинхронность с потоками - это уже другое. Отдельного термина для асинхронности без потоков вроде нет. То есть асинхронность бывает разная.
128. С 0 по 127 включительно.
> Есть либы, где строка индексируется блоками
Нужен произвольный доступ - не усложняй себе жизнь, декодируй до char32_t. По необходимости потом обратно закодируешь.
В сях это можно и очень давно. Так давно, что все уже об этом забыли, тем более, что действительно нужно это бывает в очень частных случаях.
А в ECMAScript так и живут.
Мне сказали почитать книжку про программирование для POSIX/UNIX/GNU посоветуйте годноты?
Я пока не собираюсь професионально на сях писать, но хочу сделать себе удобный примитивный оконный менеджер для Wayland, и починить некоторые кривые продукты sic sandy. А еще собираюсь после жаваскрипта и вебасм взятся за Goпарашу, а там С-шные вставки могут понадобится.
linux system programming
Ричард Стивенс, «Программирование UNIX».
Да как это вообще может быть?! Почему нет ошибки "Array index error - max exceeded" или что-то подобное?!
Почему он залезает в стек? В книжках и в гугле везде написано, что если инициализация массива такова:
int LA[] = {1,3,5,7,8};
то создается массив размером только с количество элементов в скобочках.
Что за пиздец?
> Почему нет ошибки "Array index error - max exceeded" или что-то подобное?!
Потому что это Си. Границы контролируешь ты сам. Или не контролируешь, но если вдруг вылезешь за границы, может произойти что угодно. На самом деле, в gcc/clang есть -fsanitize=address для ловли подобных багов, но лучше изначально стараться их не допускать.
> Почему он залезает в стек?
Это не он, это ты залезаешь в стек.
> создается массив размером только с количество элементов в скобочках
Да, создается массив фиксированного размера. Хочешь динамически расширяемый - тебе дали malloc/realloc из stdlib.h, городи что хочешь.
Что, простите? Я вас не слышу.
Нет. Опция, про которую я говорю - отладочная. Она жрет память как не в себя, да и вообще в целом тормозит. Если хочешь, чтобы за тебя что-то контролировали, выбери какой-нибудь другой язык. Си хорош как раз тем, что не лезет к тебе со своими ценными мнениями, а просто делает, что сказано. Даже если сказано что-то странное.
Но зачем мне текстовы рндактор, если я спрашиваю немного о другом?
Я так понимаю вариантов больше нет.
Спасибо тебе, агон:3
GNU Make, Cmake (Коляска), любой текстовый редактор, GCC/Clang
> Си хорош как раз тем, что не лезет к тебе со своими ценными мнениями, а просто делает, что сказано. Даже если сказано что-то странное.
> хорош
Но ведь именно поэтому в любой программе на си миллионы дыр, которые приходится фиксить десятилетиями.
Ну вот PHP сам управляет памятью и контролирует границы массивов, но почему-то у нас полный веб дырявых скриптов. А все потому, что проблема не только в инструменте, а в людях.
В похапе не переполнения, а скл-запросы строками и тому подобная дичь. То есть он такое же говно но по другой причине.
Сишка пережила пехопе. И переживет все остальное. Это отличный портабельный язык, простой без этих ваших хуе-мое.
Правда настораживает что многое на плюсы переписали, говорят что проэкты говнистее стали, хотя я хз.
А нельзя в сишке какой-нибудь конструктор или деструктор запилить? Или деобъявитель переменных, который память изпод-них обнуляет?
$ man malloc(), free, calloc,recalloc.
Дальше сам разберешься.
Вопрос почему в сишке нельзя возвратить функцию из функции которая возвращает функцию? Или передавать функцие функцию при вызове(ой, может быть это можно).
И какого хера такое пытаются использовать вообще в жс и в хацкеле насколько знаю?
>деструктор запилить? Или деобъявитель переменных, который память изпод-них обнуляет?
http://echorand.me/site/notes/articles/c_cleanup/cleanup_attribute_c.html
В Сишке можно возвратить функцию из функции, которая взвращяет другую функцию, хотя для этого придётся со структурами покарпеть. И вроде такая хуерга называется ООП с огромным количеством родительских и дочерьних классов. А когда весь код написан по сути одними функциями, которые иногда абсолютно магическим образом работают, то такой стиль программированния называется функциональным. Сюда нужно для этого хоскеллистов подвезти, чтобы они за функциональщину раскидали.
Передавай и возвращай указатели на функции, кто тебе мешает.
бладжд, забыл добавить, что из всех функций, сколько бы ты их рекурсивно не вызывал main никогда рекурсивно не вызывается, иначе пиздос памяти и стеку.
Функциональный стиль прост - один ввод - один вывод, функция не должна нихера делать, только возвращать значение, функция должна иметь только один аргумент чтобы лекго принимать результат другой функции.
Получается очень элегантный и минималистичный код, это продуктивно, легко дебажить, тяжело скатить код в говно. Но минус такого подхода что функции состоят из других функций а те еще из одних, в джава скрипте для каждой функции создается свой scope, execution context, в общем переменные и все все, и памяти жрет больше и работает дольше, ибо надо вызывать кучу других функций, в сишке хоть оверхед не так велик, но в императивном стиле более производительно пишется, хоть приходится повторять одно и тоже много раз в коде.
В итоге как люди бежали от спагетти кода с кучей "goto" так к функциональщине и прибежали. Всё-таки "компек" это не абстрактная машина а вполне себе рабочий аппарат, который что-то где-то да хранит и иногда всё-таки нужно в рукопашку контроллить данные и не пускать их на функциональный самотёк.
Вы прослушали изложение функционального программирования в изложении JS-довена.
>>929528
Ещё один "эксперт".
Ворнингов хватает еще в компиляторе, их надо убирать полностью, есть еще и линтеры для сей насколько знаю, но опеншорш только один в генту репе нашел. Есть GDB и еще куча инструментов для отладки и дебажки, с - простой язык, в нем легко находятся косяки.
>>929528
готу уже не юзабелен, есть же циклы, свитчи, хотя в некоторых случаях может пригодится, но обычно природа задачи такова что не нужно прыгать на произвольную строку.
Функциональное решение по крайней мере может быть лучше чем OOP, а если не юзать функции внутри функций то и с производительностью особо не соснешь. FP это еще куда не шло, но OOP с инкапсуляцией и наследованиями,this и прочей фигней куда прожорливее, и часто костыльнее функционального кода.
>линтеры для сей насколько знаю, но опеншорш только один в генту репе нашел
Я настолько нихуя не понял в этой фразе, что даже внезапно проиграл.
>Ворнингов хватает еще в компиляторе
Ну, обсуждение и началось с примера, где вызов элемента массива залезает за свою границу в стек, а компилятору - похуй. Потому что, типа, "если программист так сказал - значит надо!", в то время как ясно что это очевидная ошибка.
видать линтеры это какие-то багоуловители, которые фиксят предупреждения компилятора (ворнинги). Есть они для Си в закрытых исходниках. А в открытых исходниках были найдены в дистрибьютиве линукс Генту в одном их репозиториев. Но для отладки (дебагирования) используетя инстурмент GDB, который автоматически встроен в линукс-дистрибьютивы.
> Да как это вообще может быть?! Почему нет ошибки "Array index error - max exceeded" или что-то подобное?!
Потому что массива на самом деле нет, есть только указатель. А все эти квадратные скобочки, индексы - просто сахар.
> Но зачем мне текстовы рндактор, если я спрашиваю немного о другом?
так уточни, что тебе нужно
не обращай внимание, скоро ты перестанешь вообще его понимать и он растворится между постами.
Массивы существуют, имеют тип "array of чего-то там". Для обращений через имя массива вполне реально отслеживать границы с минимальными усилиями со стороны компилятора. Такое даже запиливают периодически в разных компиляторах. Другое дело, что это нахуй никому не нужно. Для контроля границ можно написать явный код или перекатиться на Java/C#.
гениально ёпта. а если внутри этих байтов-выравнивания поместить байт-значение, куда его распидорасит?
> я правильно понимаю что их значение не определено
Да, значение не определено и может меняться при присваивании значений структуре или членам структуры.
> с какой стороны будут добавлены
Implementation defined. Но очевидно, что в начале структуры выравнивание добавлять бессмысленно (для этого выравниваются экземпляры структуры и указатели), нужно выравнивать только второй и следующий члены, и размер самой структуры (чтобы второй и последующие элементы массива структур сохраняли вырванивание).
Так все и делают: ищется член структуры с максимальным "натуральным" (требуемым) выравниванием, это выравнивание используют, как выравнивание самой структуры; пишется первый член структуры; втыкается выравнивание под следующий член, пишется следующий член, и т. д., пока члены структуры не кончатся; в конце втыкается выравнивание размера самой структуры. Если с помощью прагм или атрибутов выравнивание ограничено (типа pack(1)), то компилятор втыкает выравнивание не больше указанного. Есть еще alignas/alignof в C11, он меняет "натуральное" выравнивание типа на указанное.
В стандарте это все разбросано, читай 6.2 и 6.7 (C11) целиком.
Как мне сделать фильтрацию ворнингов, чтобы показывались только файлы из моего проекта/солюшена и не показывались ворнинги на файлы из стандартной библиотеки и прочего кала?
Ты можешь отключать варнинги через прагму до инклуда и включать обратно после. Других идей нет.
https://msdn.microsoft.com/ru-ru/library/2c8f766e.aspx
Вот у верстальщиков теги неплохо расписаны, понятно, хотя теги src и img тоже иногда будоражат моё воображение и заставляют представлять какие-угодно слова кроме image и source.
cd, mkdir - тоже что и в окнах. 2 курс технаря.
>Как мне понимать эту ёбанную семантику команд?
Почитай posix. Как ты linux используешь, не понимая базы?
Учить их.
Прочел(пролистал) первую книгу из шапеи и понял, что 80% всего я и так знаю/использовал. Есть какая книга где все расписано более углубленно, больше всяких фич показано и т.д.?
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition"
задача на "счастливый билет"
void main()
{
int i, j, a, cnt=0;
unsigned int k, a[10], b, n;
printf("\nVvedite znachenie k=");
scanf("%d", &k);
while (k!=0)
{
a[cnt]=k%10;
k=k/10;
cnt++;
printf("a[%d]=%d", cnt, k);
}
пишу любое число и надо чтобы записал каждый разряд отдельно и посчитал длинну начального числа
a[0]=...
a[1]=... и т.д. как это правильно записать? и у меня выдает ошибку "error: conflicting types for a"
поясните как написать правильно или алгоритм решения.
Сомневаюсь.
Если ты немного еще RTFM K&R, то увидишь, что arr - это сахарок. На самом деле доступ к элементам массива осуществляется через указатель на начало массива плюс смещение. Например:
int arr = ptr_to_arr + i*sizeof(int).
Как видишь, даже если у тебя массив из двух элементов, ты можешь получить доступ хоть к arr[9000].
>>929529
>Но ведь невозможно написать проект на несколько сотен тысяч строк, и не допустить такую маленькую ошибку! Это же дебажный ад
Естественно, невозможно. 99% кода на сишечке - баг на баге сидит. Если ты залезешь в чужую область памяти и крашнешь что-то - считай что повезло, хуже когда происходят трудноуловимые изменения. На С стоит писать оптимизацию каких-то нагруженных участков, для больших проектов есть свои инструменты.
> int arr = ptr_to_arr + i*sizeof(int).
Во-первых, ты забыл разыменовать. Во-вторых, не надо никаких sizeof(int) помноженных на величину смещения. Как-то так: http://ideone.com/J7TTQj
Пиздец, это тоже работает:
>int arr[] = { 2, 8, 2 };
>printf("%i\n", (arr + 500));
И это:
>int arr[] = { 2, 8, 2 };
>printf("%i\n", (arr - 100));
Как вообще организовать правильный безопасный доступ к элементам массива? Через гиту и зиту?
так предписывает С88 стандарт писать. Современные-то компиляторы могут и без войда просто пустые скобки, как например все "скиллованные" обожают писать.
3: int i,j a, cnt=0
4: unsigned int k, a[10],b,n
> у тебя а массив или просто переменная? Убери все переменные, которые в коде не используешь.
Да не. Я просто помню, что когда искал мануалы по си в инете (вот не надо меня камнями закидывать только). Наткнулся на ман какого-то ебанутого додика, который хуй пойми как писал. А потом я полез в гугл про стандарты читать и, оказывается, что тот додик писал на 88 стандарте, после ахуевания я ещё вдобавок узнал, что у GCC есть опция -std=c99 или в любом другом стандарте конпелить.
> Современные-то компиляторы могут и без войда просто пустые скобки
Современные как раз не могут. В современных стандартах сказано, что void для функций без аргументов обязателен, а использующие старый синтаксис официально объявлены пидорами. С пустыми скобками пишут в крестах.
Я так иногда на GCC делал, когда меня мой парень в это время в жоп драл. Ну, он же вроде часто обновляется и в новых обновах это ведь не выпилили. Я про другие толком не слышал. Разве что вот подумываю какой-нибудь интерпритатор запилить. Есть годнота на примете?
А многие компиляторы для сей могут плюсы конпелить? Почему-то везде плюсы ассоциируются с няшной.
А красиво же получилось!
переносом строки имя функции отделяют от типа, чтобы можно было проще грепать, где функция определена
>Как вообще организовать правильный безопасный доступ к элементам массива?
Тебе сначала нужно придумать эти массивы, т.к. в C их нету.
struct bulletObject{
int id;
float r, g, b;
bool hit;
btRigidBody body;
bulletObject(btRigidBody b, int i, float r0, float g0, float b0) : body(b), id(i), r(r0), g(g0), b(b0), hit(false) {}
};
Спасибо!
В этом тхреаде преведствуются вопросы по крестам? У меня их много, ибо только вкатываюсь
Их собственный тред мёртв.
>В этом тхреаде преведствуются вопросы по крестам?
нет
>Их собственный тред мёртв.
какая ирония, если вспомнить, как часто хоронили си
>Это же дебажный ад, неужели ворнинг какой-нибудь не придумали, 2017 же на дворе.
Придумали миллион языков без прямого доступа к памяти, например.
Если нужен фиксированный размер, есть (u)int(N)_t. А если фиксировать размер int, окажется, что на 8-битном контроллере компилится не код, а говно, и на 64-битном процессоре не код, а говно. А уж что скомпилится на 24-битном DSP, так и сказать страшно.
Но ведь там и так компилится говно, баги переполнения гроб кладбище на ровном месте, везде приходится расставлять костыли под миллион платформ. Поэтому во всех современных языках фиксированные размеры.
Не тралю ниразу, просто припекло
Ну ок, а дальше что?
Как С-бояре элеминируют ошибки доступа куда не надо?
Какую-то оберточную функцию надо прикручивать, а в ней уже проверки границ? Подкинь таких если они есть.
Не хочу велосипеды писать.
просто пиши тесты.
Прежде чем отказываться, обоснуй причины. То, что так сказал дядя из умной книжки - не причина.
>>930404
> Как С-бояре элеминируют ошибки доступа куда не надо?
Помнят о том, что не нужно лезть, куда не надо. Какие блять оберточные функции? Нахуй тебе си, если ты в индексах ошибаешься? В си еще undefined behavior есть, его много, и он страшный. И его не проверишь в большистве случаев, надо знать и писать правильно. Поэтому иди ка ты и пиши на Java, там за тебя все проверят и попку подотрут.
Ебучий ассемблер без задач.
Нашел где спрашивать блядь, на сосаче.
>Many programming languages, such as C, never perform automatic bounds checking to raise speed. However, this leaves many off-by-one errors and buffer overflows uncaught. Many programmers believe these languages sacrifice too much for rapid execution.[who?] In his 1980 Turing Award lecture, C. A. R. Hoare described his experience in the design of ALGOL 60, a language that included bounds checking, saying:
"A consequence of this principle is that every occurrence of every subscript of every subscripted variable was on every occasion checked at run time against both the upper and the lower declared bounds of the array. Many years later we asked our customers whether they wished us to provide an option to switch off these checks in the interest of efficiency on production runs. Unanimously, they urged us not to—they already knew how frequently subscript errors occur on production runs where failure to detect them could be disastrous. I note with fear and horror that even in 1980, language designers and users have not learned this lesson. In any respectable branch of engineering, failure to observe such elementary precautions would have long been against the law."
Кароч.
Функции проверки границ в С нет, из-за желания повысить скорость выполнения. Если тебе эта скорость критична - готовься к пиздецу с тестировкой/сопровождением.
Если тебе на скорость похуй в разумных пределах - пиши на языке, который создавался после эпохи ферритовых накопителей.
Доброе утро, даже в таких огромных проектах, как пердоликс, которые пишут самые профессиональные байтоёбы, латают дыры по 30 лет подряд.
Доброе утро, даже в таких огромных проектах, как виндовс, которые пишут самые профессиональные ооп-шники, латают дыры по 30 лет подряд.
в пердулекс, между прочем, пишут все кому не лень, это же швабодный софт
Но ведь память и так имеет скорость 30гб/сек, что ей будет от лишней проверки?
Дело не в памяти, дело в проце - бранчи сбрасывают конвейер. К тому же, проверкой можно решить проблему с массивами, а проблема с валидацией указателей (при сохранении гибкости этих указателей) решается гораздо сложнее и дороже.
>>930454
В винде ядро на Си, интерфейс (Explorer-ы всякие) на крестах.
Вся низкоуровневая ебанина на си, к тому же кресты это такой же кусок говна, только с классами.
>>930455
А ещё можно невозбранно отстрелить себе обе ноги, так как указателей и массивов никто не отменял.
да я не спорю, прост во попенсорсе по определению больше будет багов - это норма.
кстати, что насчёт тех слитых исходников винды, можно такое найти на торрентах, или там ничего интересного?
> arr - это сахарок.
Напиши тогда, во что раскрывается объявление массива, если это "сахарок".
Я скачивал какие-то исходники некрошинды, но так и не нашёл им применения.
опять начинается эта хуйня. заебись так рассуждать попивая сок у себя на x86-64 .
>Как вообще организовать правильный безопасный доступ к элементам массива?
Просто не вылазь за границы и всё.
В каждом телефончике уже по 8 ядер и 4 гига, и джява крутится. К чему этот кукарек про скорость в 2017?
вообще, какая-то надуманная проблема. после того как я начал ставить assert'ы на каждый входящий в функцию аргумент, давно уже не помню таких ошибок.
>>930493
ясн.
> начал ставить assert'ы на каждый входящий в функцию аргумент
Пизда скорости теперь, проверки же любой Xeon на лопатки кладут.
ну и зачем ты ему сказал? дал бы ему ещё потралировать).
>В С ':' используется только в тернарном операторе.
А как же битовые поля в структурах? На самом деле я ни разу не видел, чтобы их кто-то использовал.
поддвачну, однако
>Скажи честно, ты когда-нибудь видел программу, где боттлнеком является один лишний такт проверки, а не IO и не йоба тяжёлые вычисления?
Что за коммент из 2017?
Мы живем духом СТАРОЙ ШКОЛЫ!! С88!!
А лишний регистр не жалко? Их не так много у x86.
Ни один не может, так как в сей инклюды иначе называются чем у сегодняшних плюсов, а вот старый код на плюсах можно собрать, если не юзать там ни одного костыля с плюсов.
Вообще плюсы это мэм, забудь за это говно, сишка пережила пацкаль, фортран, раст, ада, плюсы тоже скоро в небытие уйдут, сколько можно говно вилкой чистить.
Гуи все и так на сишечке написаны, что сказать хотел то?
>Скажи честно, ты когда-нибудь видел программу, где боттлнеком является один лишний такт проверки
Да, называется ядро ОС. Представь себе, если в какой-нибудь популярный syscall надобавлять кучу проверок, как твоя система разом залагает.
Я в ядре Linux их наблюдал и даже в w3m.
Блять, вот честно, я не знаю как люди говно умудряются обеими руками наворачивать, серьёзно. Если существуют на свете русские рэперы, то и существуют плюсы для таких же людей. Есть люди, которым ты часами можешь объяснять, что то, что они делают хуйня полнейшая, дак они тебя пошлют и ебанатом назовут. С крестописаками такая же ситуация, вроде бы.
Cassandra вообще на джяве
>>929313
В треде украинские погромисты! Всем в АТО!
>В этом тхреаде преведствуются вопросы по крестам?
В гугле приветствуются. Вообще 99% ответов на вопросы по крестам можно узнать из стандарта.
Тогда видосики смотри
int d;
for (d = 0; getchar() != EOF; d++);
printf ("%d\n", d);
Должно выкатиться число букв, но не выкатывается ничего. Если вывод захуярить в цикл, то это говно будет вместе со мной считать буквы как ебанутое, 0 1 2 3 4 5 6 7 картошку ем блядь. Почему так?
пример охуенен уже самим double nc для лупа , где ловят байтики
Что за наркоман такое писал?
#include <stdio.h>
void main()
{
int c, charCount;
charCount = 0;
c = getchar();
while (c != EOF && c != '\n')
{
charCount++;
c = getchar();
}
printf("Char count: %d\n", charCount);
}
Я поставил кодлайт, через неё и запускаю, все остальные хэллоуворлды работали нормально
ENTER выдает символ '\n', нужно делать проверку еще и на него, а не только на EOF.
ты попробовал? нет
я попробовал и на моём шиндовс без enter из цикла не выйти
И мне пофиг, почему это так
Всё, что я знаю о программировании, было подчерпнуто мной из уроков информатики в восьмом - девятом классах и из двадцати страниц этой книги. И там ничего не было сказано про вот эту всю хурму, про комбинацию первый раз слышу
Буду знать, спасибо
Скорее всего код откуда-нибудь из UNIX.
Пакеты по-разному обрабатываются в зависимости от значения одного поля структуры.
на то и низкоуровневость, чтобы ипацца с байтами
> вот такая хрень с getchar под шиндовс
stdin по умолчанию line-buffered, и не только под шиндовс. Т.е., ОС ждет ввода целой строки (т.е., до Enter или EOF) и только потом отдает сишной либе данные, и только после этого сишная либа может вернуть тебе эти данные посимвольно или как-либо еще.
Начал читать, но все равно не понимаю, как мне выйти из функции или отправить запрос другому серверу, когда сервер закончил передавать данные. Сообщение WSAEWOULDBLOCK передается, когда в сокете нет данных, и как следствие, возникла бы блокировка. Что это дает в моем случае? Этих данных могло не быть из-за задержки, например.
Я кодил под делфи, но функция стандартная от шиндовс: WSAAsyncSelect
переадресовывает мессаги в окно, хендлер которого дашь (даже фейковое через AllocateHWnd)
При UDP, как я понимаю, отсутствует понятие соединения. Образно говоря, ты плюёшься пакетами и в общем случае BROADCAST на 255.255.255.255 все присутствующие получат пакет в горло и при желании ответят на него.
В моем случае у меня была примочка на друине в датчиками. Я не хотел заморачиваться с определением ее айпишника, который в моей локалке всякий раз мог бы быть другим и примочек могло быть несколько. Я броадкастил из компа на 255.255.255.255 и примочка отзывалась, выдавая свой айпишник. Слала мне данные как пулемёт секунды 2-3, после чего сливалась. Решением было подкидывать ей через broadcast пустые мессаги раз в секунду.
Короче говоря, у меня сейчас вот такой код: https://paste.ofcode.org/hSsawEu4Jrnm3BbWL8sa6c
Я нашел такой же убогий код в интернете, и у его автора цикл тоже вешался. Можно ли получить все данные с сервера, не подвесить приложение и обойтись без уродливых костылей?
WSAAsyncSelect сделает сокет прозрачным, неблокирующим
Когда хотелось запилить туду лист на gtk3+c (еще в 2013 году), делал себе комманд лайн тулзу, которая бы генерила классы из шаблона. Но из-за работы забил что-то вообще на все. Сейчас вот посмотрел репозиторий - у них появилась действительно фичастая для этого софтина. Но я на убунте сижу, все никак не могу арч накатить чтобы нормально подключится к разработке, ибо оно требует свежих gtk/gdk.
Ковырял вот еще осенью keepassx, который на куте, чтобы попробовать запилить ему морду на gtk. Но как оказалось, там все внутри связанность высокую имеет и пришлось бы полностью софтину перепиливать на gtkmm.
Чем бы таким заняться можно было, пока руки чешуться написать чего-нибудь гуишного?
> как мне выйти из функции или отправить запрос другому серверу, когда сервер закончил передавать данные
С UDP ты не можешь узнать, когда сервер закончил передавать данные, если протокол не предусматривает оповещения об этом (или, например, количество пиров не передается заранее). Если у тебя так, выходи по таймауту.
struct foo = { 0 };
Инициализирует нулем первый элемент (какой бы он ни был), забивает нулями все остальные. По сути тот же memset.
Ну или инициализируй сразу нормально:
struct foo = { .a = 1, .b = 2.0f, .c = "hello" };
Или сделай все же функцию для инициализации, скажи, что она inline (хотя даже если не скажешь, компиляторы мелкие функции весьма неплохо с -O3 -flto инлайнят).
Install Gentoo. Arch if laptop. Fedora Rawhide if you too stupid to install Arch.
>Если у тебя так, выходи по таймауту
Пойдет ли такое использование таймаутов, или можно сделать лучше?
https://ideone.com/hiiXzL
IMHO застрянешь в лупе на recvfrom
почему для лэптопа арч?
Я бы хотел сократить до: ODD_NAME. Делаю: #define ODD OCHE_DLINNY_DEFINE и после этого пишу ODD_NAME, но нихуя не работает. ЧЯДНТ?
Ну блядь, грит что ODD_NAME ундекляред, фёрст юз ин зыс функшин понимаешь ли, что тут ещё сказать.
Что происходит если 2 длл-ки экспортят одинаковый символ? Или например когда у нас в exe файле уже такой символ есть, но при загрузке и в длл-ке есть. Какой из двух будет вызываться после рантайм линковки?
Или лучше выбрать реализацию на другом яп?
есть qt, всякие nucle для богов
Препроцессор работает на отдельных токенах (словах), а не произвольных подстроках, иначе бы, например #define place LOL заменял replaced_items на reLOLd_items и ты бы соснул с проглотом (впрочем, ты и так соснул).
Тебе нужна макро-функция:
#define RASKUKOZHIT(x) OCHE_DLINNY_PREFIX_##x
Готовая программа конечно 55кб весит, но мне кажется что 700 строк это дохуя для такой простой программы.
Она бы могла зависеть всего от одной либы и вмещатся в 20 строк.
зависит же от размера файла
>Что бы вы сказали если бы программа которая выводит содержимое файла в консоль занимала 700 строк?
Я бы сказал, покажи исходники этой программы. Только потом можно разговаривать.
как будто помимо GNU больше не существует реализаций cat...
https://github.com/freebsd/freebsd/blob/master/bin/cat/cat.c
А где 700? Поудаляй комментарии с форматированием, останется строк 200.
>мне кажется что 700 строк это дохуя для такой простой программы
ну так перепиши с меньшим количеством строк и сделай пул реквест, кто тебе мешает
Блядь, и как я сам не додумался.
Да, ребята все правильно сказали, установи операционную ситему, там все из коробки работает при том что весит система 8 гб, а арч и того меньше. И для этого даже графическая оболочка не надо, в фреймбуфере работать можно.
ХЗ, у меня начиная с шестой студии никогда таких проблем не было, поковыряй тут https://msdn.microsoft.com/ru-ru/library/ee855621.aspx, макросы подстановки ($) проверь в свойствах проекта и в шинде посмотри переменные окружения командой set,
у меня там пара таких прописана:
VS140COMNTOOLS=C:\Program Files\Microsoft Visual Studio 14.0\Common7\Tools\
VSSDK140Install=C:\Program Files\Microsoft Visual Studio 14.0\VSSDK\
Зачем пердолится с виндой? Ни справки ни компилятора, нихуя нет, еще и тормозит, файловых ситем не завезли, оконных менеджеров не завезли, пакетный менеджер не завезли, нихуя не работает, 64битность без 32битного говна не завезли.
Установил бы федору раз спермач до глубины жопы, и работал бы по людски.
Но лучше арч и тайловый оконный менеджер на выбор.
Надо было ставить VS 2017 RC, тем более в начале марта будет релиз
Если бы не ноутбук с гибридной графикой, то давно бы сидел на прыщах. А так, к сожалению, приходиться быть спермачем.
и обгладывайте там щёки димки-гребненосца.
Есть же Bamblbee и еще что-то там.
Хотя брать ноут с гибридной графикой тупизм, встройка интола идеальна.
А, в этом плане. Но я не программист - мне много не надо, пару программ скомпилить раз в год, никогда пердолинга не было со студией, просто почему-то у анона сломано, я подсказал что где поковырять и как у меня, а так конечно слышал, что на линухах удобнее всё это.
Бамблби уже 2 года не развивается, а других альтернатив нет. Встройка интола сейчас идеальна, а вот 4 года назад, ее все еще считали говном.
Поэтому и взял ноут с HD4000 и GT 730M, хотя сейчас понимаю, что это было большой ошибкой.
Спасибо.
ALLO! VAS PLOHO SLISHNO! PSHPSHPSHPSHPSHPSH
Выключи дискретку и сиди на прыщах.
> Пойдет ли такое использование таймаутов
Ну да, как-то так.
>>931587
> вопрос по крестам
В крестах то же самое, что и в Си, разве что символы по умолчанию манглятся, а не просто декорируются. Ну и COMDATA еще. Других различий на уровне линковки нет.
> если 2 длл-ки экспортят одинаковый символ
В винде (по сравнению с линуксом) все просто - импорт всегда идет по имени длл+имени символа. И, соответственно, символ может присутствовать сколько угодно раз в разных модулях, имя модуля будет для него своеобразным неймспейсом. При раннем связывании (когда ты не LoadLibrary делаешь, а указываешь библиотеку импорта при линковке) линкер будет искать символ по порядку в каждой указанной библиотеке. В которой найдет первой, из той и возьмет.
>>931588
Чисто под винду - имеет смысл, если проект долговременный и качественный. Нативного look-and-feel нет ни в одной либе, кроме... нативных. В том же кутэ нет фирменной патентованной примочки Microsoft с диагональным перемещением мыши во вложенных меню, поэтому меню в Qt крайне хуевые. Если кроссплатформенность на первом месте (а такое бывает гораздо чаще), то проще всего взять C++/Qt для GUI, а либы писать на Си.
>>931741
> Как настроить?
В студии должно все само настроиться (ты C++ support вообще поставил?). Для командной строки есть целая куча всяких vcvarsall.bat.
Имеет смысл конечно, но юзай winapi или какой там у нее родной гуй.
вдруг поймал себя на мысли, что до сих пор объявлял переменные только в самом начале функции
Я тоже, это правильно, но сейчас ситуация вынуждает нахуячить определение переменных в зависимости от результата свитча.
1. Что не так с указателями?
2. Что не так с while (p++ = q++) ; на хабре жалуются
3. Что не так с препроцессором?
Меня, например напрягают совершенно другие вещи:
-из коробки нет размерных типов inb4:stdint.h
-бедная стандартная беблиотека. Не могу понять, почему до сих пор не добавили безопасные функции для работы со строками?
-почему не добавили битовые поля и упакованные структуры в стандарт?
-ну и да, неопределённое поведение в точках следования, аля i++ + ++i почему не определить в стандарте как это должно работать?
Блядь, да потому, что область видимости переменной и определяется {} за скобочками переменной уже не существует.
А так получается, ты создал в стеке переменную, только если попал в условие, а ниже свитча ты будешь её использовать всега?
Ты ебанутый?
иди почитай, мудак. это компост-тред, говноед на говноеде.
пойди хабрик почитай, как нужно переменные называть правильно.
Особенность (баг) грамматики: после меток (а case - по сути метки) ожидается statement, а не declarator. Это пережиток прошлых времен, когда декларации разрешались только в начале блока.
>>931998
> Что не так с указателями?
Все так, просто с современным подходом "хуяк-хуяк и выпустили из универа" программисты получаются тупые и допускают ошибки.
> Что не так с while (p++ = q++) ;
Все так, но чтобы понять это, нужно понимать указатели, но см. пункт 1.
> Что не так с препроцессором?
Он совершеннейшее, остойнейшее говно. Чтобы осознать это, попробуй... ну нупример реализовать макрос DEBUG, который будет принимать любое количество аргументов и вызывать функцию printf, автоматически добавляя перед сообщением файл, строку и имя функции, а после - перевод строки. Удачи.
> из коробки нет размерных типов inb4:stdint.h
Редко нужны (для структур только), легко сделать самому, есть в stdint, иди нахуй.
> почему до сих пор не добавили безопасные функции для работы со строками
Тебе с какими? Вот есть сишные, есть паскалевые, есть комбинированные. Единственная правильная придирка - нет нормального strcpy.
> почему не добавили битовые поля
Щито? Ты, наверное, про способ упаковки? Так приоритет языка - не кроссплатформенный формат файлов (его нет, достаточно лишь почитать про stdio, чтобы охуеть), а скорость выполнения на любых, даже самых извращенных архитектурах.
> упакованные структуры в стандарт?
Когда твой микроконтроллер не сможет прочитать невыровненный дворд - поймешь.
В той статье на хабре все правильно пишут. Си говно, юникс говно, но альтернатив-то нет!
> А так получается, ты создал в стеке переменную, только если попал в условие, а ниже свитча ты будешь её использовать всега?
Объяснение не катит. Наслаждайся:
switch (1) {
int foo = 100;
case 1:
foo = 1;
default:
printf("foo is %i\n", foo);
}
Потом убери присваивание в case 1 и насладись повторно.
>Особенность (баг) грамматики: после меток (а case - по сути метки) ожидается statement, а не declarator. Это пережиток прошлых времен, когда декларации разрешались только в начале блока.
Неверное объяснение.
>>Он совершеннейшее, остойнейшее говно. Чтобы осознать это, попробуй... ну нупример реализовать макрос DEBUG, который будет принимать любое количество аргументов и вызывать функцию printf, автоматически добавляя перед сообщением файл, строку и имя функции, а после - перевод строки. Удачи.
Та не поверишь, есть у меня такой! Лол, но только до 10 аргументов. Бля, ну а в каком языке посмотреть лучше?
Про сторки... Из коробки есть только нуль-терминированны "". А так я могу и корпускулярно-гравицапные забыдлокодить.
Вот скажи, strlen() с ограничением по максимальной длине в стандартной либе есть?
Про размеры типов.
Нужны блядь, просто ВИЗДЕ! Любой бинарный проктокол, любой микроконтроллер - все блядь, без них не уйдёшь. И что предлагаешь в каждый хеадер хуячить stdint? Заебца просто.
Битовые поля в структурах, чтобы работать с отдельными битами без использования битовых операций.
>Когда твой микроконтроллер не сможет прочитать невыровненный дворд - поймешь.
Блядь, меня ебёт как он будет это читать? Пускай читает в два регистра по пол слова и комбинирует в третьем! Это блядь работа компилятора обернуть всю эту хуету в понятный и удобный вид. 95% мк работают с последовательными интерфейсами, сетью сетвыми протокалами, там блять ВСЁ выравнено!
Ты блять упоротый?
>я могу декларировать переменные после case:
В твоём случе деклараци есть, а вто все инструкции между switch и case - никогда не выполнятся - нет условия. Можешь поэксперемнтировать с goto. Ебаный недоносок.
> Лол, но только до 10 аргументов.
Да, я тоже умею абузить препроцессор. О том и речь.
> strlen() с ограничением по максимальной длине
Либо строка заканчивается нулем, либо это не сишная строка.
> Любой бинарный проктокол, любой микроконтроллер
Endianess, alignment requirements, trap representations (молчу про способ хранения отрицательных int, тут вроде у всех согласие). Если ты читаешь структуры копированием байтиков поверх структуры - у тебя проблема, просто ты о ней еще не знаешь. Ну или ты о ней знаешь, но привязан к конкретной архитектуре и протоколу, и тогда проблема у тех, кто придет после тебя.
> И что предлагаешь в каждый хеадер хуячить stdint
Я еще и stdbool подключаю. Или объединяю часто нужные вещи (assert, atomics еще) в один хедер. Ты же подключаешь stdlib, когда тебе нужен malloc(), почему бы тебе не подключить stdint, если ты хочешь потерять в производительности, использовав типы фиксированного размера (или выиграть, использовав (u)int_fast(N)_t)?
> Блядь, меня ебёт как он будет это читать?
Язык проектировался как раз для тех, кого ебет производительность, и кто согласен в обмен на это вникать в детали. Не хочешь вникать - бери высокоуровневый язык. Алсо, да, именно побайтово всякие ARM и читают невыровненные структуры. Открываешь дизасм функции, а там портянка из килобайтов LDRB. Сэкономили, епта.
>ну нупример реализовать макрос DEBUG, который будет принимать любое количество аргументов и вызывать функцию printf, автоматически добавляя перед сообщением файл, строку и имя функции, а после - перевод строки. Удачи.
Не понимаю, в чём проблема...
#define dprintf(fmt, ...) fprintf(stderr, "%s:%d:%s: " fmt "\n", __FILE__, __LINE__, __PRETTY_FUNCTION__, ##__VA_ARGS__)
dprintf("ты обосрался");
Хотя ок, обосрался я, не заметил, что ты GCC-шное расширение используешь. В языке этого нет.
даже не представляю зачем вы пытаетесь из с сделать с++.
>Либо строка заканчивается нулем, либо это не сишная строка.
Либо это сишная 10байтовая строка в которую влетело 11 байт от юзера.
Я же и спрашиваю о БЕЗОПАСНЫХ функциях.
>эндианс, выравнивание
Извини не понял аргумента.
>stdint
В 99% ты подключаешь stdlib не в хеадере. А базовые типы нужны всегда.Это просто маразм что их нет из коробки.
>Язык проектировался
И? От того, что некая разновидность ARM на некоем быдло-компиляторе лопатит портянки из ldr - бинарные протоклы перестануть использовать упакованные уструктуры?
>В языке этого нет.
Щито?
>Variable-argument macros were introduced in 1999 in the ISO/IEC 9899:1999 (C99) revision of the C language standard, and in 2011 in ISO/IEC 14882:2011 (C++11) revision of the C++ language standard.[1]
Из gcc мана:
>The C standard mandates that the only place the identifier __VA_ARGS__ can appear is in the replacement list of a variadic macro. It may not be used as a macro name, macro argument name, or within a different type of macro. It may also be forbidden in open text; the standard is ambiguous. We recommend you avoid using it except for its defined purpose.
>Variadic macros became a standard part of the C language with C99. GNU CPP previously supported them with a named variable argument (‘args...’, not ‘...’ and __VA_ARGS__), which is still supported for backward compatibility.
Я про ##__VA_ARGS__
> строка в которую влетело 11 байт от юзера
В сишную строку не может "влететь" 11 байт, когда ожидалось 10. Либо они влезли в буфер, либо тебя уже хакнули. А вот при копировании строк, конечно, хочется strcpy с лимитом, и ее всегда приходится реализовывать вручную.
> эндианс, выравнивание
> Извини не понял аргумента.
Смотри, протоколы и файловые форматы бывают разные. Например, в сетевых протоколах с незапамятных времен принято использовать big-endian, а значит, как бы ты не упирался, а тебе придется читать одно поле структуры за другим и свопать байты (желательно автоматически), и это приводит тебя ко всяким stream_read_uint16, и тебе становится абсолютно похуй на выравнивание структур. А еще при копировании байтов поверх структур ты можешь ненароком прочитать float, а FPU иногда может выдать тебе exception, а пользователь будет возмущаться, мол, как это, почему у него холодильник с вайфаем завис.
> А базовые типы нужны всегда.
Это не базовые типы. Это типы с четко ограниченной областью применения. Если ты используешь их слишком часто, твой код может тормозить на архитектурах, отличных от той, под которую ты пишешь.
> бинарные протоклы перестануть использовать упакованные уструктуры?
Во-первых, умные дяди, зная о том, что упакованные структуры непортабельны, считают хорошей практикой выравнивать их вручную, обмазывать static_assert-ами и выживать хотя бы так. Во-вторых, если появляется хотя бы призрачная вероятность, что программа будет работать на разных архитектурах, структуры читают побайтово.
>>932027
> Искусственная придирка.
Это был искусственный пример. Но есть подобный реальный: мне нужно было два раза проитерироваться макросом по __VA_ARGS__, а это в общем случае невозможно, и даже для ограниченного числа аргументов нужна препроцессорная магию поэтому я просто написал очередной внешний кодогенератор. Препроцессор сосет практически на каждой нетривиальной задаче.
Алсо, мне всегда очень нравятся разговоры линуксоидов про Microsoft и вендорлок, но когда разговор заходит про расширения GCC, так им сразу становится похуй, и они жрут и нахваливают. Хуй с ним, это расширение еще норм, оно рано или поздно появится в стандарте, но ведь есть упоротые, которые используют чуть ли не все, что им дает GCC.
>>932033
В языке нет игнорирования trailing comma c помощью магического ##.
> строка в которую влетело 11 байт от юзера
В сишную строку не может "влететь" 11 байт, когда ожидалось 10. Либо они влезли в буфер, либо тебя уже хакнули. А вот при копировании строк, конечно, хочется strcpy с лимитом, и ее всегда приходится реализовывать вручную.
> эндианс, выравнивание
> Извини не понял аргумента.
Смотри, протоколы и файловые форматы бывают разные. Например, в сетевых протоколах с незапамятных времен принято использовать big-endian, а значит, как бы ты не упирался, а тебе придется читать одно поле структуры за другим и свопать байты (желательно автоматически), и это приводит тебя ко всяким stream_read_uint16, и тебе становится абсолютно похуй на выравнивание структур. А еще при копировании байтов поверх структур ты можешь ненароком прочитать float, а FPU иногда может выдать тебе exception, а пользователь будет возмущаться, мол, как это, почему у него холодильник с вайфаем завис.
> А базовые типы нужны всегда.
Это не базовые типы. Это типы с четко ограниченной областью применения. Если ты используешь их слишком часто, твой код может тормозить на архитектурах, отличных от той, под которую ты пишешь.
> бинарные протоклы перестануть использовать упакованные уструктуры?
Во-первых, умные дяди, зная о том, что упакованные структуры непортабельны, считают хорошей практикой выравнивать их вручную, обмазывать static_assert-ами и выживать хотя бы так. Во-вторых, если появляется хотя бы призрачная вероятность, что программа будет работать на разных архитектурах, структуры читают побайтово.
>>932027
> Искусственная придирка.
Это был искусственный пример. Но есть подобный реальный: мне нужно было два раза проитерироваться макросом по __VA_ARGS__, а это в общем случае невозможно, и даже для ограниченного числа аргументов нужна препроцессорная магию поэтому я просто написал очередной внешний кодогенератор. Препроцессор сосет практически на каждой нетривиальной задаче.
Алсо, мне всегда очень нравятся разговоры линуксоидов про Microsoft и вендорлок, но когда разговор заходит про расширения GCC, так им сразу становится похуй, и они жрут и нахваливают. Хуй с ним, это расширение еще норм, оно рано или поздно появится в стандарте, но ведь есть упоротые, которые используют чуть ли не все, что им дает GCC.
>>932033
В языке нет игнорирования trailing comma c помощью магического ##.
>А вот при копировании строк, конечно, хочется strcpy с лимитом, и ее всегда приходится реализовывать вручную.
strncpy в твой TurboC for DOS 5.22 не завезли ещё?
Завезли. Только strncpy: 1) не терминирует строку нулем, если она не влезла в буфер, 2) забивает нулями весь остаток буфера, если строка таки оказалась меньше буфера. Получаем уязвимость и тормоза одновременно.
3) вместо ясной сигнализации о том, что строка не влезла и обрезана (что может привести к еще одной уязвимости), strncpy возвращает бесполезный указатель на буфер.
Да, именно на ней обычно и городят свои strlcpy. Нормальное решение, если забыть о том, что snprintf может вернуть -1 на кривой строке у пользователя с кривой локалью, и еще о том, что у Microsoft есть свой, особенный _snprintf, который нихуя не терминирует строку нулем, если она не влезла. Некоторые альтернативно одаренные личности делают #define snprintf _snprintf где-нибудь в хедере, что приводит к веселым последствиям.
Запутался в теме с указателями. Пытаюсь разобраться с битами и адресами. Вот например есть тип int, для него выделяется 4 байта (32 бита), есть переменная со значением например 35. В двоичной системе это 100011, и вот эти куда эти биты записываются? Нихуя не понимаю, запутался уже. Также прошу объяснить как вообще выделяется память для указателей (в двоичном виде же?).
>куда эти биты записываются
Либо в область стека, один из регистров. Посмотри в гугле: Эндрю Таненбаум, «Архитектура компьютера».
>как вообще выделяется память для указателей
Точно так же. На большинстве современных компов указатель — это просто длинное целое без знака. Редко встречаются компы где в указатель добавлено что-нибудь ещё (в старых ARM'ах были флажки в старших разрядах, но это сейчас уже никто не делает). Указатель — это целочисленный адрес.
Ладно, в сишную строку не может.
char user_name[11]; //10symbols + null
Очень часто возникают ошибки с заполнением до 11 байт.
Ну то такое.
> А еще при копировании байтов поверх структур ты можешь ненароком прочитать float, а FPU иногда может выдать тебе exception
Где почитать об этом?
>будет работать на разных архитектурах, структуры читают побайтово
Говноеды. Какая разница ты будешь напрягаться с побайтовым чтением или компилятор сделает это за тебя?
Слушай сюда тупорылый уебан.
Указатель - это ячейка памяти с адресом. Размер этой йчейки обчно равено слову на твоей машине.
Обычная переменная находется в стеке или в RAM.
Указатель на int это адресс который может лежать в стеке, в регистре в RAM, похуй где.
ВНИМАНИЕ БЛЯДЬ!
Когда к укзатешь ты прибавляешь число -адресс увеличивается не на это голое число. А на число размер типа на который указывает.
int p_huy = 0; //Положили адресс 0
p_huy += 1;// Прибавили 1 * (sizeof(int))
На 32битной машине адресс станет
p_huy == 4
The answer, obviously
> Где почитать об этом?
C11, 6.2.6.1, Representation of types, пункт 5. Пример для x86 (ой, опять надуманный): http://ideone.com/FyO7tv
Ок, т.е. ты создал инвалидное значение float, поставил трап? И надо же, он сработал!
И что ты этим хотел доказать?
Что float это не набор байт, но ещё и имеет диапазон валидных значений?
Ты бы ещё разыменовал NULL и на 0 поделил, а потом удивлялся, почему твой рефрежератор с Bluetooth 5.0 завис.
Логика уровня школяра
> поставил трап
Где-то он по умолчанию.
> И что ты этим хотел доказать?
Если я не с тобой разговаривал, то срачик выше.
> Ты бы ещё разыменовал NULL и на 0 поделил
Вот именно поэтому копирование памяти поверх структур и плохая практика. Все согласны, что разыменовывать NULL - плохая идея, но вот когда дело доходит до упакованных структур, им почему-то кажется, что undefined behavior в этом случае их не касается.
> switch (ptr->type & ~0x80) {
Что делает "&~0x80"?
Ясно, спасибо.
Алсо, я тут постигаю увлекательное байтоёбство — нормально вообще писать целое число в char? Вроде экономия, когда работаешь с небольшими значениями, но я такое редко вижу.
Экономишь на памяти - проигрываешь в коде. При наличии арифметики с этой переменной, в дизасме на том же x86 будет постоянное перепидорашивание числа из какого-нибудь 8-битного AL в 32-битный EAX и обратно, т.е., код будет и раздуваться, и тормозить.
> Это же обычные typedef'ы на стандартные типы.
Только эти тайпдефы отличаются на разных архитектурах.
> В чём профит
Гарантировать размер (а не городить MyInt и пачку #ifdef-ов, как делает каждая вторая либа), бесплатно сэкономить на памяти, если процессор (и компилятор) таки умеют работать с мелкими типами быстро.
Т.е. int8_t может тормозить, а int_fast8_t будет работать заебись, я правильно тебя понял?
>вы лучше подсаажите как мне длину литеральной строки на препрцессинге вычислить, что бы без этого пидерского strlen
Только для константной строки:
http://ideone.com/HWNmw7
Не забудь, что там ещё '\0'
И да, как ты хотел для динамической строки вычислять её длину во время компиляции, уебан?
Зависит от применения. В одной из моих вещей только на байкиках и выехать по памяти.
мне не нужно для динамической, sizeof оно самое
> При наличии арифметики с этой переменной, в дизасме на том же x86 будет постоянное перепидорашивание числа из какого-нибудь 8-битного AL в 32-битный EAX и обратно, т.е., код будет и раздуваться, и тормозить.
Для знаковой арифметики разницы в сгенерированном для char и int асме почти не будет. Переполение знаковых переменных — UB, поэтому компилятор будет обращаться с char как с int в плане использования регистров (да и не только поэтому, а integer promotion).
Проливать из регистров в стек тоже будет как 4 байта.
Передача из/в функцию — так же, как int.
Максимум где будет отличие — в сохранении в массив char-ов или в структуру, если padding-байтов не хватает для сохранения char-а как int-а
>Хочешь рассказать нам об удивительной жизни с CHAR_BIT != 8?
ДиЭсПи, чуть больше чем на половину.
Обычно там char == int
> то внутри будет char, а если нет - int или еще что-нибудь
Пизда.
Стоит полностью переходить с обычных типов на stdint с его фастами? Это ведь, в теории, сплошной профит, правда код будет плохо выглядить, особенно если использовать fast. Названия длинные будут. Текста много. Но профит.
И ещё. Есть одна либа xcb, где этими интами всё обмазано, но погрепав её я не обнаружил ни одного int_fast/least. Почему там это не используется? ЧТО МНЕ ДЕЛАТЬ Я ЗАПУТАЛСЯ
Использование stdint — профит. Я экономлю. Я пишу более понятный код. А использование фастов просто свод недостатков stdint на нет, если тот Анон не пиздит.
Долбоёбов полон тред!
Блять, да возьми тыуже ебёный gcc, скомпиль пару тестов с o0 и 03. Открой отладчик да посмотри как это выглядит на твоей платформе.
Напиши тест оцени время выполнения.
В 99.95% случаев - это выигрыш на спичках.
Если блять совсем риалтайм-ультраперформанс, всё равно прийдётся на ассемблере разворачивать циклы и тулиться в регистрах с минимумом обращений к памяти.
Ну хуй знает, возможно у меня просто нет подходящего опыта и я слишком узко мыслю
Мне похуй как это выглядит на моей платформе. Я знаю, что это экономия на спичках. Но надо ведь идти к идеалу! К лучшенькому! В теории эти инты всем лучше дефолта, но я хочу узнать как на практике и не только на моём железе, тут вопрос не про это.
Была, кстати, статейка перевод на швабре про то, что всем поголовно нужно переходить на stdint, а дефолтные типы — прошлый век. Читал я её когда был ваще полным ньюфагом, уже толком ничего не помню, хотел бы ещё раз перечитать, но не могу нагуглить. Доставьте, может знает кто. Хорошая статья была, и срачи под ней тоже хорошие были.
> Почему там это не используется?
Тот анон пишет про какой-то волшебный компилятор который возможно сможет сделать так что с char скорость работы будет такая же как и с интами. Тогда будет выигрыш по памяти. Авторы библиотеки про которую ты говоришь скорее всего несколько скептично относятся к вероятности что их библиотеку будут копмилировать на таком волшебном компиляторе, поэтому просто не заморачивались на эту тему.
> какой-то волшебный компилятор
Какой, в жопу, волшебный компилятор, довен?
https://godbolt.org/g/7ZhxR0 вот, смотри.
Где там " постоянное перепидорашивание числа из какого-нибудь 8-битного AL в 32-битный EAX и обратно"?
Оказывается с гномом люди какой-то libsoup используют, буду пробовать, не в том направлении я гуглить начал.
> Использовать char ради экономии оперативной памяти — с вероятностью 98% долбоёбизм
Двачую кстати.
поддвачну, однако
Но к лучшенькому! Например если в коде есть тип с uint8_t, то сразу понятно, что там небольшое значение. С учётом контекста легко понять для чего оно и что вообще тут происходит. А ещё и экономия какая!
> Где там " постоянное перепидорашивание числа из какого-нибудь 8-битного AL в 32-битный EAX и обратно"?
А ты возьми реальный код из реального проекта. Я очень часто сталкиваюсь с необходимостью смотреть дизасм и вижу, во что превращается код, в том числе и собранный с -O3. На простых тестах все красиво, компилятору хватает регистров, вон циклы в константу сворачиваются >>932669, да. А вот когда переменных много, когда зависимости менее очевидны, когда куча алиасинга, когда есть вызовы функций, начинается цирк.
>>932616
> Переполение знаковых переменных — UB, поэтому компилятор будет обращаться с char как с int в плане использования регистров
Представлять байтики как signed char (а фиксированные типы пользуют обычно для байтиков, вордов и двордов) опасно, а переполнение unsigned уже не UB.
> Передача из/в функцию — так же, как int.
Я тоже так думал, отреверсил функцию, написал int вместо short, а потом однажды мне студия положила в стек eax с мусором в старших битах. Был сеанс увлекательной отладки. Впрочем, это к делу не относится.
>Чем бы таким заняться можно было, пока руки чешуться написать чего-нибудь гуишного?
Решил таки написать свою йобу на питоне с гуишным клиентом на gtk по типу keepassx. Хз, нечем после работы заняться. Посмотрим, что через пару месяцев выйдет.
>студия
Понятно, откуда у тебя такие извращённые представления о компиляторах и ужасах, связанных с char против int
Зря ты так. Студия в последние годы все больше похожа на нормальный компилятор, и оптимизирует она неплохо.
Если из этих двух, то арч.
А вообще ставь абанту, если ты язык собрался учить, а не пердолиться с конфигами.
Оптимизирует она неплохо с ещё не вышедшей версии, в которой спиздили SSA-based оптимизатор из clang-а.
У этого треда два состояния: либо он висит полудохлым по два месяца, либо в нем кто-то снова не прав.
Не смотрел еще на 2017, но и родной C2 был неплох. А они точно спиздили? Не припомню в анонсах про кодогенератор новостей./spoiler]
Слышал, что, начиная с 2015
> родной C2 был неплох
Не знаю что за C2, вот слайд с cppcon 2016 про новый SSA-оптимизатор
> А они точно спиздили?
Неточно, но откуда ещё они могли взять SSA-оптимизатор? И если ты скормишь код со слайда clang-у, ты получишь тот же асм-код, с точностью до переименования регистра, в котором передаётся параметр в данном ABI. Ах, да. Ещё 2*reg против reg+reg. Ну, peephole-оптимизатор натравили, чтобы замести следы.
Кстати, и тут оптимизатор MSVC соснул, ибо
8d 04 4d 02 00 00 00 lea eax,[rcx2+0x2]
8d 44 09 02 lea eax,[rcx+rcx1+0x2]
видимо я так часто попадал на одно состояние.
>peephole-оптимизатор натравили, чтобы замести следы.
В свете >>932734 скорее ещё не успели спиздить.
>пердолиться с конфигами
Вообще арч довольно просто установить и накатить какую-нибудь гуишное окружение потом.
Русский за язык у программистов не считается? Никто не кодит кириллицей и даже не комментирует по-русски?
Хорошая книга, спасибо.
1С жи есть.
>даже не комментирует по-русски
я комментирую и доки пишу, англопидоры в моем проджекте ненужны
Пример с установкой Bullet Physics Engine. Прелестно описано тут:
http://bulletphysics.org/mediawiki-1.5.8/index.php/Creating_a_project_from_scratch
Всё получается, НО... вложеные проекты прописаны абсолютными путями, что убивает возможность тоскать папочку между десктопами разных компов (пути разные из-за <username>). Держать тупо в корневом на c:\ работает, но это некрасиво.
ВОПРОС: как перенастроить вложеные проекты под относитеьные пути? Где они вообще прописаны, чтобы поменять?
Я хуй знаю, как там сейчас в студии, но никто тебе не мешает открыть .vcxproj/.sln и тупо заменить все общие префиксы путей на точку.
Записывай список выделения в файл. Другие сессии при попытке переместить или копировать будут этот файл читать.
Обдумывал этот вариант, забыл написать про него и почему он не годиться. Хотелось бы, чтобы выделенные файлы были помечены визуально во всех сессиях, чтобы можно было их удалить из выделенных. Для этого придется при смене директории каждый раз проверять, изменился ли этот файл. Из этого есть выход - сделать поток с inotify. Опять же, по дополнительному потоку на каждую сессию для такой хуйни... Всё равно, благодарю.
Я тоже думал о таком варианте. Спасибо.
Вопрос снят. Нашел хорошее решение для этого варианта.
В общем вот часть задания вторая часть с вводом/выводом, но не суть, вот, к примеру, имеем (( )), программа скажет что скобки стоят верно, а если имеем )) ((, то скажет также, но математически это неверно, может анон подскажет? Могу заново переписать
Дам тебе подсказку:
проходя строку по буквам, считаешь открывающие и закрывающие
Пока строка не пройдена полностью, количество открывающих >= закрывающих
Если это условие хоть раз нарушено, уже невосполнимый пройоб
Когда встретишь \0, колвы должны быть равны
Нужно просто проверку на отрицательность в цикл занести.
Хакинг искусство эксплойта 2-е издание Эриксона.
Спасибо, саженяша.
Неосилятор в сишном тхреаде!
Сап, пр, есть файл с символами( у меня это скобки), в коде нужно из этого файла считать эти символы в массив и дальше с ним работать, я перечитал пару справочников и статью в учебнике и нигде не нашел примеров, погуглив также ничего годного не нашел, можете написать сам кусок кода в котором массив заполняется символами.
Отмена! Я ультрадаун, мой компилятор не читает с notepada++, поставил обычный блокнот и все..
Ну да, поменял на дефолтный блокнот и строчку символов считало в массив, с нотепада ничего не происходило, хз почему
То есть ты брал файл, созданный в нотепад++, и не получалось, а получилось с тем же контентон, сохранённым в файл из шиндовского блокнота?
Кодировка, в которую дефолтный почти не может?
Охуеть. Но теперь объясни ему, как ему этот стек сделать.
> человечское решение
Один тип скобок. Стек вот просто нахуй не нужен. Тупые люди с шаблонным мышлением тоже.
действительно, неужели никто не писал парс для скрипт-языка собственного сочинения?
Аноны, для построения графиков нужно пользоваться openGL? И сложно ли будет написать код для построения такой функции с базовыми знаниями си?
А что не так? Просто у меня препод ничего не объясняет и все лабы я делаю с помощью учебника и двача
В общем случае OpenGL не очень-то хорошо подходит для построения произвольных графиков. Зависит от конкретной функции - от того что поддерживает видеокарта, так как шейдер не может выполнить произвольный код. Правда, конкретно твою можно просчитать и на современных GPU, так как с определенного момента они вроде как умеют вычислять синусы, еще и дохуя быстро (скорее всего по таблицам). Но общий алгоритм такой что ты формируешь пиксельный буфер с графиком на CPU, а потом как-то выводишь: OpenGL, SDL, может вообще просто на диск сохранить в чем-то типа png. Возможно у преподователя спроси.
а что там сложного, открываешь опенгл, учишь, как строить линию по точкам. делаешь вот эту формулу, применяешь ее к точкам. p - это точки а параметр умноженный на синус функции. функция - это линия из точек. как-то так.
Ну у меня уже был 2-летний опыт на первой работе, надо было свой велосипед поверх udp писать и поддерживать, после такого это кажется не очень сложным.
в сетевом погромирование очень много ньюансов о которых нужно знать, теже опции сокетов например
Чтобы писать на си нужно знать стандартную библиотеку, а более говенной с.б. чем в си нет в природе.
А как просто задать ему значение? Что-то вроде arr = 20, но чтобы работало.
>нужно знать стандартную библиотеку
Нахуя? Когда понимаешь, как это работает все, написать свой аллокатор памяти под конкретный девайс не столь сложно, как это кажется вначале. Или числа/строки вручную сложно конвертить?
Ну если ты только хеллоу ворлд делаешь то безусловно, но в реальных задачах везде требуется взаимодействие с коллекциями, строками, потоками, файлами, сетью и ещё кучей различной поебени.
org 0x7C00
startboot:
cli
xor ax,ax
mov ds,ax
...
...
...
org 0x7E00
start:
код на си
...
mov ax,peremennaya поместить в ax значение переменной
...
...
...
У меня в начале программы загрузчик операционной системы, который занимает 512 байт, а потом уже главная часть программы. С помощью кода на си там считается всё, потом перемещается значение из нужной переменной в регистр ax.
Идеального кода по крайней мере на си не существует. Это миф!
Всюду используются свои правила, свои стандарты свои методы и правила оформления. Кое где, встречаются удачные решения. Но в общем, везде бардак, а идеала нет.
gcc. Забыл написать, а ведь собирался.
Если ты - тот кун из RE-треда, предлагаю не ебаться с ассемблерными вставками - это плохой и неудобный путь. Пиши то, что требует ассемблера на ассемблере в отдельных файлах, а то, что хочется писать на Си - на Си. А время лучше потрать на чтение туториала про ld, ld-скрипты и objcopy.
arr+=20;
Нафига вообще комментить? Код должен читаться без комментариев, имена функций/переменных коммендируют сами себя, вместо магических констант - дэфайны.
А теперь представьте ситуацию: над проектом работают несколько комментаторов-патриотов, и каждый срёт в каментах в своей кодировке. Иногда правится один и тот же файл в разных кодировках. И читать это дело потом - адов пиздец, хорошо если кодировки быстро переключаются по хоткею, а если надо в менюшку лазить? Нет ребята, такой хоккей нам не нужен.
> Нафига вообще комментить? Код должен
Бла-бла-бла, я пишу хелловорлды, мне нинужны комментарии. В дюбой нетривиальной программе нужны комменатрии (и еще документация вдобавок). В реализациях сложных алгоритмов комментариев может быть в десять раз больше, чем кода.
> кодировке
Аргумент устарел, UTF-8 есть везде, но комментировать все равно нужно по-английски, за исключением случаев, когда это 1C или какой-нибудь локальный продукт, который никому кроме его разработчиков нахуй не всрался.
Вы видите копию треда, сохраненную 24 апреля 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.