Вы видите копию треда, сохраненную 3 апреля 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Что читать:
- Классика от Отцов: http://www.ime.usp.br/~pf/Kernighan-Ritchie/C-Programming-Ebook.pdf
- Годное пособие для гуманитариев: http://c.learncodethehardway.org/book/
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (он же C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт) не драфт ищем на торрентах
- Стандарт ISO/IEC 9899:2011 (он же C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- man/Dash/zealdocs
Чем конпелировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует. Дрочим на --analyze.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio 2015 Community Edition: внезапно этим стало можно пользоваться. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека" (да, в студию в последнее время завезли stdint и stdbool, почти все новые фишки из C11, static_assert и даже юникод). C snprintf все до сих пор плохо. Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (в частности, потыкать threads.h и stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и неполной поддержкой C99.
- Borl... ээээ...
Что еще почитать:
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 (4th Edition)" (2014)
Jon Erickson "Hacking: The Art of Exploitation, 2nd Edition" (2008)
Анон из предыдущего треда рекомендует например, в качестве примера применения Си на практике.
Прошлые треды:
- https://arhivach.org/thread/106153/
- https://arhivach.org/thread/131949/
- https://arhivach.org/thread/140570/
Сурс шапки: http://piratepad.net/bJ1SdmkZyu
треды
_Static_assert()
Плюшки из с99
Главное что с11 поддержали, нормально. А так то ничего нового, просто стандартизировали/закрепили старое. Короче с99 по нормальному.
Околошаблонные макроопределения препроцессора.
Там почти полная копия pthreads. Так что можно просто пролистать соответствующий раздел стандарта, и всё сразу станет понятно в общем-то. Если всё ещё непонятно, то изучать pthreads тогда, по ним инфы навалом.
parse_tree (FILE f, NBTree root)
{
int h;
char tag_line, tag;
int meta = hash_tag ("meta"),
doctype = hash_tag ("doctype"),
title = hash_tag ("title"),
dl = hash_tag ("dl"),
dd = hash_tag ("dd"),
dt = hash_tag ("dt"),
h1 = hash_tag ("h1"),
p = hash_tag ("p"),
a = hash_tag ("a");
while ((tag_line = read_tag (f)) != NULL)
{
if (is_commented_tag (tag_line))
continue;
tag = get_tag_name (tag_line);
h = hash_tag (tag);
if (h == meta) {
} else if (h == doctype) {
} else if (h == title) {
} else if (h == dl) {
}
}
}
Можно ли такую простыню как-то сократить? Можно ли грамотно в такой ситуации switch по строкам как-то использовать?
parse_tree (FILE f, NBTree root)
{
int h;
char tag_line, tag;
int meta = hash_tag ("meta"),
doctype = hash_tag ("doctype"),
title = hash_tag ("title"),
dl = hash_tag ("dl"),
dd = hash_tag ("dd"),
dt = hash_tag ("dt"),
h1 = hash_tag ("h1"),
p = hash_tag ("p"),
a = hash_tag ("a");
while ((tag_line = read_tag (f)) != NULL)
{
if (is_commented_tag (tag_line))
continue;
tag = get_tag_name (tag_line);
h = hash_tag (tag);
if (h == meta) {
} else if (h == doctype) {
} else if (h == title) {
} else if (h == dl) {
}
}
}
Можно ли такую простыню как-то сократить? Можно ли грамотно в такой ситуации switch по строкам как-то использовать?
Да, но inline как был хинтом, так и остался. Если нужно обязательно заинлайнить что-то, используй расширения своего компилятора.
>>629965
Треды, как и многие другие библиотечные фишки C11 еще не везде поддерживаются, поэтому пока писать код только на тредах C11 я бы не стал. А вот то, что язык теперь официально знает про многопоточный код и умеет в нативные thread-local переменные - это охуенно.
@
Сделал выделение памяти, связывание её, сохранение, загрузка
@
Как делать структуры? Сильно специфично. Как делать поиск. Сильно специфично.
@
Сижу пишу интерпретатор своего байт кода.
@
Придётся придумать человеческий код и его компиляцию в байтовый.
@
Заебись сел.
Ты пишешь парсер с использованием gtk+? Больной ублюдок. Открой уже для себя perl. С ним, я уверен, ты сократишь свою программу до одной строчки.
status ты объявляешь как int, какое нахер служебное слово.
Функция scanf() возвращает число успешно считанных элементов.
Если операции считывания не происходило, что бывает в том случае, когда вместо ожидаемого цифрового значения вводится какая-либо буква, то возвращаемое значение равно 0.
Для выхода можно использовать не только q, а любую другую БУКВУ
Не знаешь, что происходит - пиши printf
#include <stdio.h>
#include <stdlib.h>
int main()
{
long num;
long sum = 0L;
int status;
printf("Please enter on integer to be summed ");
printf("(q to quit): ");
status = scanf("%ld", &num);
while(status == 1 ){ // == means "is equal to"
sum = sum + num;
printf("Please enter next integer (q to quit): ");
status = scanf("%ld", &num);
printf("status = %i ", status);
}
printf("Those integers sum to %ld.'n", sum);
return 0;
}
Я слишком туп для такого дерьма, я и обычными базами пользоваться не умею, просто васяню. главная задачи - избавить себя от геморра связывать данные. Потому что код становится жутким.
Но мысль всей хрени в чём, данные - не типизованы, главно чтоб их получить, нужно пройтись по массивам(хеш таблицы, например)/спискам/деревьям и прочие. То есть какая-то такая, простая система. Меня больше волнует фрагментация...
Аноны, помогите пожалуйста, нужно написать GUI на C с полем для ввода и выводом графика в реалтайме, как это сделать? На все есть 6 часов, с GTK+ раньше вообще не работал.
> На все есть 6 часов, с GTK+ раньше вообще не работал
Если ты раньше не работал с графичискими тулкитами и учитывая то, что ты тратишь время здесь... Ты не осилишь.
структура меню{
структура меню *ссылканафункцию();
}менюшка;
ее инициализация вида
менюшка = {&смехкартинки};
Единственный вопрос: как вызвать эту функцию.
>>631617
Дереференсить указатели на функции не обязательно. Можно просто менюшка.ссылканафункцию().
Я даже WinBGIm не могу подключить, делаю все по инструкции, а он мне выдает undefined reference.
Может все же есть какие-то небольшие библиотеки под мои нужды?
#include <stdio.h>
#include <conio.h>
main()
{
while (!kbhit())
printf("You haven't pressed a key.\n");
return 0;
}
>Потому что это нестандартное и неподдерживаемое говно?
Но ведь это же стандартная библиотека на C, везде, где я смотрел, предлагают или использовать kbhit(), или системные прерывания - я бы их мог накодить, но это будет слишком геморройно для маленькой утилиты.
>ОС, компилятор?
Windows 8 Pro x64, MinGW
Попробовал решение с сайта майков: https://msdn.microsoft.com/en-us/library/58w7c94c - тоже не работает.
>Но ведь это же стандартная библиотека на C, везде, где я смотрел, предлагают или использовать kbhit()
посмотри в K&R
Это нестандартная библиотека, доставшаяся в наследство со времен Borland C. Если тебе всего лишь нужно прервать программу, сделай: http://ideone.com/v3sGZ7 - будет мммаксимум портабельно.
А вот что касается проблем с kbhit - там может быть все, что угодно. Начиная от кодировки консоли по умолчанию и заканчивая режимом ввода. Если хочешь разбраться, изыскания можно начать отсюда https://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx Алсо, MinGW использует CRT студии, к ней есть исходники - посмотри, как kbhit реализована.
void foo(int bar[], int bar_length){
/ fancy loop over the array /
}
Лол, никак. Или массив + длина, или пара указателей start end, по которым итерируешься.
Если в массиве хранятся указатели - можно делайть while not null и всегда массив нулем завершать. Как со строками короче.
Ну и третий вариант - написать динамичские массивы себе, если есть необходимость. Минимально, это будет структура, содержащая: указатель на данные, текущий размер массива, размер выделенной памяти (чтобы не перевыделять память с добавлением каждого элемента, а иметь некоторый запас).
>>631617
А если я хочу передать аргумент, то это должно выглядеть как менюшка.ссылканафункцию(аргумент) или нет?
Да, как обычный вызов функции: менюшка.ссылканафункцию(аргумент). Но в самой структуре, в указателе ссылканафункцию ты должен заранее указать тип этого аргумента.
>>633785
Сложи указатели в массив и касти указатель к нужному типу структуры. Или объясни подробнее, зачем тебе по разным структурам ходить в одном цикле.
Да, понимаю, что массивом проще. Делаю поиск по слову среди структур с одинаковой структурой, но разным содержанием (например, книги и машины итп)
> например, книги и машины
Ты тот анон, который БД пилит? У тебя вообще как данные хранятся? По рандомным структурам в рандомных местах пройтись for-ом можно только уложив указатели в массив. Если у тебя используется какая-то структура данных (а должна!), которая содержит структуры или указатели на них, то расскажи, какая.
Стало быть, для С обязательно нужно линубх ставить?
MS Visual C в комфортности работы с кодом один из лидеров + имеет бесплатную версию с кучей плюшек искоропки. Безусловно, если ты планируешь после изучения языка закатиться во встраиваемые системы, линукс изучить придется. Но работать можно и на виндовс, просто используя кросскомпиляцию. Главное не ставь средство работы как самоцель, просто программируй много и часто, смотри как работают другие, читай книги и тут же практикуй, иначе ты никогда не продвинешься.
Не советуй говна кушать, пусть сразу как вторую ось поставит (тем более, что сейчас для этого пердолится даже не надо).
мильпардон, MS Visual C, это нужно качать визуал студио? Я пытался найти просто msvc, не получилось. Спасибо за разьяснения кстати
Окажется у него видюха нестандартная и привет, очередной бугуртыш. Пусть в виртуалке сначала опробует.
Нет, конечно. Почему ты так решил? Какой-нибудь code::blocks в винде работает так же, микрософт вон конпелятор делает, gcc можно прикрутить, никаких проблем
Полно проблем. Вместо sudo apt-get install libчто-тотам-dev, вечный пердолинг и, как следствие, любовь к самописным костылям.
Visual Studio Express тебе хватит просто за глаза. Можешь скачать с торентов видеокурс по Си от "Специалист"а, вроде. Там довольно быстро но достаточно полно расжевывается суть языка и его основные особенности.
В микрософтовской студии всё из коробки, делать нихуя не надо. Впрочем, я сам линуксоид с недавних пор, но по другой причине
>посоны как отключить дискретную видеокарту
>посоны, отключил встроенную видеокарту, линупс не стартует в графической среде
>посоны где посмотреть настройки графической системы на хуйнянейм
>посоны драйвер неправильно встал, кривое разрешение, как поправить
>посоны монитор не дает настроек, где посмотреть частоту развертки моего хуйнянейм
Линукс хорошая вещь, но хороша ложка к столу. Совершенно ни к чему ебаться с новой и неизвестной системой, если на старой можно решать эту же задачу с таким же результатом.
> БД пилит
Не, нея, я долго всё обдумывал и сопоставлял. В итоге отказался от байт-кода, потому что будет некрасиво в коде (отдельным процом же лишь опция, эксперимент в будущем), а если пытаться красиво, например на макросах, то ебли дай боже. Поэтому я нашёл для себя оправдание всё это (эту хуйню) оборачивать в функции - гибкость, чтоб можно было указатели иметь и в виде смещения от начала "хипа" и в виде прямых указателей, с конвертацией в разные варианты, int16 int32 int64 - короче занимаюсь хуйнёй.
Но зачем типизировать данные, я до сих пор не понимаю. Ты же типа их туда создавал, тебе виднее что они есть. Хуй знает.
Проблем МНОГО и не еби мозг. Виртуалка для обучения - самое то.
Да не будет того же результата. Под виндой удобно разрабатывать только в стиле проприетарного софта 90-х годов, когда зависимостей у твоего кода мало и они все куплены.
Что за хуйню ты несешь, наркоман свободолюбивый. Человек хочет НАУЧИТЬСЯ программировать, а не ебашить корпоративный софт.
Яш не про это, про байткод к условной функции fudb_inter(uintp* pcod) - понятно там строчка, все дела... Ты понял.
>>633832
Что не понятно, ты же когда на хипе память выделяешь, не заставляешь систему хранить тип твоих данных?
Но ведь это актуально только если ты пердолишь графеновые приложения или в игорей гоняешь
Ну зачем ты такой тупой. Как ты решишь проблему порядка байт, через инлайны? Такой ты парень, думаю даже добрый.
Да не, я понял, кончено, просто ты гонишь за оверхед в рантайме, который может обсчитываться тупо в препроцессинге.
Сам часто имею делему, между предоставлением проверки глупости пользователя, или скоростью (мнимой кончено). Но это же C - выбор очевиден.
Или у кого есть что подискутировать?
не вижу проблемы, объявление точно такое же, зато легко модернизируется и контролируется по коду
Что за глупости. А менять функционал ты будешь через IF ?
Но то ладно, скажи лучше, что там модернизируется и контролируется.
Мы же про порядок байт всё ещё?
Анон, нужна помощь ну просто пиздец, спросить больше не у кого.
http://rghost.ru/79CSjsxQz
Там два файла, один список бинарный, другой Си.
Необходимо при нажатии на клавишу 5 вывести самый старый инструмент, затем предложить редактирование его даты. (Волнует именно сортировка).
Моих познаний не хватает, три дня как за язык сел, и сразу прошу прощения за кривое оформление кода.
Имеется нормальное знание асм и хорошее знание си.
Как это реализовать?
Мне надо сортировать бинарный файл со структурой по нескольким полям (день, месяц, год). Мне нужно прочитать файл в массив структур, а потом поэтапную сортировку по дате? Или как?
Конвертни бинарь в текстовый файл, а его уже отсортируй блжад стандартными консольными утилитами
Прочитать в массив структур, создать массив указателей (или порядковых номеров, как угодно), и затем второй массив отсортировать.
swap(tmp[x], tmp[y])
Необходимо поменять местами x и y
оператор замены местами, вроде как ^=; пройдись просто по всем индексам и всё.
Если надо поменять ВСЕ значения в структуре, может, просто обменять указатели на эти структуры?
>>634219
>>634236
void old(FILE tf)
{struct tov tmp_buffer[10];
int r=9, j;
clrscr();
tf=fopen("spisok.dat","rb+");
for (int k=0; k<=r; k++)
{fread(&tmp_buffer[k],sizeof(t1),1,tf);
}
for (k=0,j=1; k<=r;k++)
{printf("\n%3d %12s %2d.%2d.%4d",j, tmp_buffer[k].name, tmp_buffer[k].d, tmp_buffer[k].m, tmp_buffer[k].y);
j++;
}
struct tov tmp[10];
for(int h=0;h<12;h++)
{tmp[h]=&tmp_buffer[h];
}
for(int t = 0; t < r; t++)
for(int l = t + 1; l < r;l++)
{
if(tmp_buffer[t].y < tmp_buffer[l].y)
swap(tmp[t], tmp[l]);
else
if(tmp_buffer[t].y == tmp_buffer[l].y)
{
if(tmp_buffer[t].m < tmp_buffer[l].m)
swap(tmp[t], tmp[l]);
else
if(tmp_buffer[t].m == tmp_buffer[l].m)
if(tmp_buffer[t].d < tmp_buffer[l].d)
swap(tmp[t], tmp[l]);
}
}
puts ("\n The oldest item is:");
printf ("\n%12s %2d.%2d.%4d ", tmp_buffer[t].name,tmp_buffer[t].d,tmp_buffer[t].m,tmp_buffer[t].y);
getch();
fclose(tf);
}
void swap(tov a,tov b)
{
tov c=a;
a=b;
b=c;
}
Бля, как код вставлять?
[code]test[/code]
>>634219
>>634236
void old(FILE tf)
{struct tov tmp_buffer[10];
int r=9, j;
clrscr();
tf=fopen("spisok.dat","rb+");
for (int k=0; k<=r; k++)
{fread(&tmp_buffer[k],sizeof(t1),1,tf);
}
for (k=0,j=1; k<=r;k++)
{printf("\n%3d %12s %2d.%2d.%4d",j, tmp_buffer[k].name, tmp_buffer[k].d, tmp_buffer[k].m, tmp_buffer[k].y);
j++;
}
struct tov tmp[10];
for(int h=0;h<12;h++)
{tmp[h]=&tmp_buffer[h];
}
for(int t = 0; t < r; t++)
for(int l = t + 1; l < r;l++)
{
if(tmp_buffer[t].y < tmp_buffer[l].y)
swap(tmp[t], tmp[l]);
else
if(tmp_buffer[t].y == tmp_buffer[l].y)
{
if(tmp_buffer[t].m < tmp_buffer[l].m)
swap(tmp[t], tmp[l]);
else
if(tmp_buffer[t].m == tmp_buffer[l].m)
if(tmp_buffer[t].d < tmp_buffer[l].d)
swap(tmp[t], tmp[l]);
}
}
puts ("\n The oldest item is:");
printf ("\n%12s %2d.%2d.%4d ", tmp_buffer[t].name,tmp_buffer[t].d,tmp_buffer[t].m,tmp_buffer[t].y);
getch();
fclose(tf);
}
void swap(tov a,tov b)
{
tov c=a;
a=b;
b=c;
}
Бля, как код вставлять?
[code]test[/code]
>>struct tov (звездочка) tmp[10];
>>swap(tmp[t], tmp[l]);
>>void swap(tov a,tov b)
У тебя массив структур и тебе нужно поменять их местами? тогда так:
>>void swap(tov (звездочка)a,tov (звездочка)b){
>>tov(звездочка) tmp = a;
>>a = b;
>>b = tmp;
>>}
То же касается и успешного её выполнения.
Перестановка их местами у меня получилась, функция swap внизу файла описана. Мне теперь надо найденную структуру tmp[t], она же temp_buffer[t], редактировать и обратно занести в бинарный файл.
В лучшем случае для улучшения читабельности кода используют макросы вроде SUCCES, FAILURE и тд.
Хорошая идея.
Просто когда в вузике ОС изучал, там что-то говорили, что 0, это когда норм, а 1 не норм.
>>633822
Visual Studio 2015 Community Edition. Старые, в том числе и Express, весят меньше, но умеют нормально только в C89. Если места на винте жалко и/или не хочется ставить гигабайты непонятных программ - вообще лучше взять Pelles C до первого серьезного проекта.
>>633853
Смотришь потом в код, а там простыни вместо полутора инструкций. Интринсики тебе зачем дали? В другие конпеляторы не можешь, так хоть GCC-шные используй.
>>634305
Подход из стандартной библиотеки: 0 - success, > 0 ошибка (получится автоматически, если коды ошибок запихать в enum, а первым членом enum сделать success). Если функция должна возвращать что-то осмысленное в int, то есть вариант: < 0 ошибка, иначе что-то осмысленное.
>>634020
> Что курить для создания своих демосцен?
Любой графический API и книгу по 3D. http://www.enlight.ru/demo/faq/, demoscene.ru, http://web.archive.org/web/20110203073050/http://democoder.ru/ дальше сам
enum { SUCCESS, ERROR_POTRACHENO, ERROR_NO_MAMKA }
> Как ты решишь проблему порядка байт, через инлайны?
А в чем проблема-то? Все твои DBI16TOLE будут инлайн-функциями, с телом или пустыми (препроцессором обеспечишь). Алсо, необходимость в препроцессоре тоже под вопросом: компиляторы сейчас умные, и, как минимум, шланг рантаймовый тест на endianess понимает, оптимизирует до константы и затем ненужные ветки if через dead code elimination выкидывает нахуй. А если какой-то компилятор и не оптимизирует, то две инструкции на тест - нихуя не оверхед.
Попробовал. Он качается, только тупит сильно. И, может быть, у тебя браузер отобразить его пытается, а не скачать. Правой кнопкой по ссылке, сохранить как и т. д. Можешь взять какой-нибудь wget или download master.
Алсо, а зачем тебе именно их LiveCD? Поставь любую убунту, тебе хватит.
Не обязательно интересоваться какингом, чтобы читать такое. Стоит почитать, чтобы потом понимать проблемы с безопасностью в своем и чужом коде.
А чё, getc разве неблокируемый?
Почему-то второй раз память выделяется по тому же адресу, а не как пишут в книге. Это связано с реализацией аллокатора винды? Есть у этих двух способов аллокации какие-то плюсы и минусы?
Дочитал до конца. Теперь стало понятно.
Ну сопоставь шапку и приглашение шелла на пике, что ж как маленький-то?
Представляешь, что плюсы это надмножество си, и пишешь на плюсах.
Создаёшь пустой C++ проект. Св-ва проекта->C/C++->Дополнительно->Компилировать как.
Или просто создаёшь файл с расширением .c
если хочется в хиккерство, а линукс мамка не разрешает устанавливать - используй онлайн машины, типа koding, c9.io и codeanywhere
>а линукс мамка не разрешает устанавливать
Проиграл. У меня мамка считает линукс говом для шизиков-аутистов (дословно, она вообще повсюду детектирует шизиков кто хоть сколько-нибудь отличается от среднего пидорахи), потому что ей там неудобно писать отчеты и делать дипломы для детей в фотошопе. Скоро куплю себе ноут и накачу линукс.
Так поставь как вторую ос, хуле ты.
При покупке ноута главное убедись что для него есть нормальные драйвера, иначе ты скорее админом станешь чем программировать научишься.
>главное убедись что для него есть нормальные драйвера
В каких статьях об этом написано?
>иначе ты скорее админом станешь чем программировать научишься
Тоже нормально. Тем более мне надо не учиться, а углублять имеющиеся знания.
>В каких статьях об этом написано?
Нигде не написано. Лучший выбор - ноутбук без дискретной видеокарты на штеуде. Если дискретка именно нужна - ищи наличие линуксовых драйверов на неё. Со всем остальным проблем давно нету.
>ем более мне надо не учиться, а углублять имеющиеся знания.
Ну тут 2 стула: ты растёшь как хакир-погромист или растёшь как админ, одновременно делать и то и другое не намного продуктивнее, чем поотдельности.
А еще можно не выделываться, и поставить линукс на виртуалку, винду на виртуалку и osx на виртуалку (похуй, что будет хостом, пусть даже и тот же линукс) - это даст возможность проводить различные хеккерские эксперименты без риска угробить ОС/данные. Идите-ка вы с ОС-срачем в /s/. У нас тут тредик языка, которому на ОС, проц и прочие детали похуй. По крайней мере, в теории.
>А еще можно не выделываться, и поставить линукс на виртуалку, винду на виртуалку и osx на виртуалку
Тормозит пиздецово же. Очень раздражают легкие лаги и отрывочные движения мышки.
Проверь, что в BIOS включена поддержка виртуализации (VTx). Проверь, что виртуалка использует виртуализацию. Даже на моем нищепк тормозит только OSX, да и то лишь слегка.
На олимпиадах тебе не си надо дрочить.
Читай про графы, задачу на упаковку рюкзака и рекурсию.
Всёравно
на контроллеры - даташит лучшая книжка
https://ideone.com/lKcWqO
Глобальная переменная будет скрыта в .c-файле. Снаружи будет виден только интерфейс. Неудобство в том, что массив для перестроения в кучу надо заполнять особым образом, оставляя нулевой элемент пустым. Это очень неудобно. Можно сделать так, чтобы индексы начинались с нуля, но тогда не получится написать такие красивые байтоебские процедуры parent, left и right.
> здесь можно
Нужно.
И что это вообще за хуйня? Типо какая-то сортировка? Я уш думал тут дествительно куча
>Я уш думал тут дествительно куча
Почему у меня не куча? Они нужны не только для сортировков, а еще для приоритетных очередей. Потом я буду наворачивать биномиальные и фибоначчиевые сливаемые кучи.
Скажу, что я делаю не так.
Я без понятия, говорю же - не разбираюсь в сортировках. А куча, для меня, это менеджер оперативной памяти, грубо говоря.
Нахуя ты это выкладываешь? Это никто не будет читать. Тем более с твоими петросянскими наименованиями переменных (это может быть забавно для небольшого кода, но для кода из 400 строк). Свой список реализовать на коленке для простейших задач можно в 5 минут. Это не рокет сайенс. Для чего-то более качественного можно просто юзать готовые решения, типа реализации связных списков в ядре Linux, только для юзерспейса.
Для обсуждения качества говнокода есть сайт, который первым вылезает в гугле по запросу "говнокод".
Есть желание и потребность. Нужен для мк.
Убери xorswap, сейчас он уже неактуален т.к. код, генерируемый компилятором, получается хуже, чем "наивно" через временную переменную или банальное сложение/вычитание в случае целочисленных переменных.
Уточню: в большинстве случаев неактуален (если ты не собираешься писать в условиях сильно ограниченной RAM или малого числа доступных регистров).
> Нахуя
Потому что могу
> готовые решения, типа реализации связных списков в ядре Linux
Ты про list.h, лол?
Ебать, если и на сосаче нашёлся господин, доебавшийся до хакирьства. То и я могу накинуть за щёку, например отсутствием проверок на переполнение - но предпологаю, что у парина задача писать и позновать, а не дрочить на стрёме.
И? Ты признвёшь, что петух?
>>637518
Мамка твоя - моветон. Толи дело острочить трапу в подезде....
>писать и позновать
Тогда смысл пользоваться "хитрыми" битовыми приемами? Такие вещи только усложняют понимание.
Сначала код должен правильно работать, а потом уже надо начинать его оптимизировать.
Ну начинается, тут как на формумах становится, какой-то пидорас-завсеглатый решил что нужно так, потому все должны подченится.
>И? Ты признвёшь, что петух?
При чём тут list.h из linux кернела? Я не увидел связи. Как пизда, намёками своими говоришь.
Почему книжка от отцов в подленнике? Дайте на рюзком.
На ebdb.ru и btdigg.org можно найти и эту, и все остальные.
Без понятия о чём ты, отстань от меня, захожу на двущь и тут меня унижают и притесняют. Пользуйся своим list.h и дай другим пожить.
Да ты наркоман походу.
CLion, Eclipse CDT - если не пугает монструозность и нужно максимум функционала IDE.
Code::blocks, gnome builder, kdevelop и прочее - из легкий и минималистичных.
Если хипстер дохуя - любой атом/саблайм с плагинчиками.
ed
>gnome builder, kdevelop
>легкий и минималистичных.
У них зависимостей 10Гб и надо ставить гномы/кеды.
Для xfce не подходит.
Да хоть QtCreator, чо ты как маленький.
https://ru.wikipedia.org/wiki/Сравнение_интегрированных_сред_разработки#C.2FC.2B.2B
Тыщи их.
Ну системную хуету, что ещё писать можно. Местные вон ОС свою пилят, где-то анончик здеся БД делал, кто-то в реверсинг вкатывается. Компилякторы ещё всякие для мастурбации, драйвера пишущие хэлло сосач до загрузки ядра.
>чья деятельность наиболее безблагодатна: ФПвноедов или байтоебов.
Ну ОСями, драйверами, интерпритаторами, дебаггерами и прочим кто-то же пользуется, в отличие от кластеров мультипарадигм.
Я конечно всё понимаю, но пока ты не скажешь что и для чего тебе нужно, посоветовать можно только его или гугл.
Я лично не пишу, я в основном читаю.
Google -> Английския язык учебник
Google -> Язык C учебник
Google -> Написание драйверов для %os_name%
Google -> Написание вирусов для %os_name%
Google -> Ассемблер %processor_type%
Google -> Реверс инжиниринг
Google -> Исходники драйверов %os_name%
http://ru.stackoverflow.com/questions/75754/Защита-памяти-при-сегментной-организации?rq=1
Что делать с рандомизацией стека?
Правильно говорили.
> Алсо, а зачем тебе именно их LiveCD? Поставь любую убунту, тебе хватит.
Там только хитрый косяк будет, если на 64-разрядах запустишь. Регистры будут другими. И команды при отладке тоже малость отличаться будут.
Блять, ну контейнер заведи, или найди модный адрес в системе.
чёт я тут не врубился, ты, мразь, хочень провести тесты или хочель хакирить? может быть нты не сюда зашёл, или даже скорей не смог прочитать тему до конца? может мне за тебя прочитать, и например, пояснить какой адресс выставлять на возврате? сдохни сука
очевидное системное программирование и ебля с микроконтроллерами.
Пойду на трамайщика обучаться.
Вразумите меня, залечите меня.
Все правильно, пацану нужен под задачу контейнер - он пишет контейнер, нужда база данных - пишет базу. Не слушай всех этих питухов, что упиваются этим тармазным генерализированным библиотечным кодом, он нужен только для полных нулей. Норм пацан всегда напишет идеальную реализацию под свою задачу.
Из инклюд файлов убран math.h (сейчас, типа, все в cmath хранится). Но чет сишные файлы с ним не хотят компилится. Может, кто сталкивался?
ты бы может заглянул бы хоть в cmath прежде чем подключать? Увидел насколько там код похож на си.
>>641659
>>641666
Угу, я заглянул же. Темлейты-хуемплейты.
Собственно, math.h убрали, и как теперь компилить сишную хуйню?
Скопировать из папки со старой вижлой
Что ты несешь? Откуда убрали? Студия сишку поддерживает.
>что б максимально шустрый для нее был
Нихуя не понял, что ты там своим потоком сознания изложить пытался.
>Аналог int из Nim, например.
Он же транслируется в си => сконпелируй и посмотри.
> соответствующий разрядности машины
Тебе это не нужно. Используй int/long и положись на компилятор. Если нужна какая-то гарантированная размерность, посмотри в stdint.h типы int_fast_t. С плавающей точкой особого выбора нет - float/double в зависимости от требуемой точности.
Пардон, переформулирую:
для x86 хочу int32, для x86-64 хочу int64, для Сетунь-70 хочу 18 тритов целочисленное, например.
Допустим у меня есть FILE* pizda;
В некоторых случаях, мне надо поменять дескриптор файла для вывода(перенаправить stdout куда-нибудь/или при ошибке его сделать невалидным) Я писал что-то типа:
stdout->_File = myNewMegaDescriptor;
myFile->_File = -1;
и т.д.
В последних версиях Visual C++ CRT скрыли поля структуры _iobuf. Ну и хуле теперь делать? Нигде не написан нормальный механизм работы с дескриптором файла. И уверен, где-то подобное говно использовалось.
Может кто че знает?
нельзя трогать содержимое FILE же, оно не определено стандартом. Заменяй указатель, инвалидность через NULL
>перенаправить stdout куда-нибудь
почитай про unix way, это ни разу не твоей программы дело, т.е. вообще, от слова совсем
>или при ошибке его сделать невалидным
его можно закрыть - навсегда, а не нахрен
Тебе freopen мало?
Допустим 16 битный char, я делаю fread из файла и хочу на разобрать на 8бит байты.
Как правильно по стандарту:
char byte0 = buffer[0]>>8 & 0xFF, byte1 = buffer[0] & 0xFF;
или
char byte0 = buffer[0], byte1 = buffer[1]; / т.е. всегда buffer[N] & 0xFF00 == 0 /
(Особенно интересует различие win7 и win10)
И что, ты часто с 16-битными char работаешь? Я тебе секрет открою: fread/fwrite по стандарту эквивалентен fgetc/fputc в цикле, а еще по стандарту читать из файла можно ровно то, что ты туда написал. Что приводит нас к интересной мысли о том, что на системах, где CHAR_BIT != 8 ты либо в принципе не можешь читать с помощью стандартной библиотеки файлы из "мира людей", либо тебе подложат костылик, и в одном char будет ровно один байт. Поэтому все это твое дрочево не имеет никакого практического смысла. Не говоря уже о порядке байтов в твоем 16-битном char.
>>642576
У нас сейчас существует такая штука, как ASLR. Все, на что ты можешь надеяться, это > 0x400000 и < 0x7x000000 на 32-битной системе (x зависит от ОС).
Я же не из практических соображений спрашиваю, а так, вообще.
А по теме то я уже понял что из мира людей не получить стандартными функциями. По стандарту все эти функции пишут/читают весь байт (он же char).
А на всех DSPхах stdio не стандартный, и от хостовой системы зачастую зависит. До полного безумия и отсутствия портируемости вообще.
Это определяется используемым стилем в проекте.
Сам пишу после типа, т.к. Указатель это или объект, как мне кажется, относится к типу.
int ∗variable;
void ∗function(void ∗);
void (∗function)(void ∗);
Правило простое: декларация указателя отражает использование. Например, первый пример: ∗variable = 1;
Нет, не так. Я решаю задачу из N&R. Условие ниже. Цикл ввода придумал таким. Кстати, почему из очереди каждый раз выводится один и тот же элемент?
https://ideone.com/6oLJ94
Write the program tail, which prints the last n lines of its input. By default, n is 10, say, but it can be changed by an optional argument, so that tail -n prints the last n lines. The program should behave rationally no matter how unreasonable the input or the value of n. Write the program so it makes the best use of available storage; lines should be stored as in the sorting program of Section 5.6, not in a two-dimensional array of fixed size.
Каст перед malloc убери, тут у нас Си.
Насчет одного и того же элемента - покажи, где у тебя в enqueue выделяется память, в которую копируется вводимоя строка? Нигде, ты хранишь указатель на буфер, который каждый раз перезаписываешь fgets.
На самом деле tail не так прост, как кажется. Строки могут быть очень длинными, длиннее 100 символов.
>Нигде, ты хранишь указатель на буфер, который каждый раз перезаписываешь fgets
Блджад, действительно. Указатель, который я сохраняю, указывает на постоянный блок памяти, которая перезаписывается. Стало быть, надо создавать новые строки перед сохранением в очереди?
>Каст перед malloc убери, тут у нас Си
Понятно, что указатель это просто unsigned число, но почему компилятор сам выводит нужный тип? В чем отличаются C и C++ в этом отношении?
Интересно, сколько бы понадобилось времени, чтобы отреверсить даже такой код и понять, что здесь используется очередь?
Он его не выводит, ему просто похуй - у нас здеся слабая статическая типизация в отличие от крестов.
Хотя лучше пиши с кастами - с ними труднее ошибиться.
да какое говно эта ваша борда
Дополню вопрос этого ньюфага: от чего зависит тип, возвращаемый маллоком? (64 или 32 инт)
От процессора и ОС (разница в адресном пространстве между x32 и x64).
malloc возвращает указатель на void. Особого смысла в касте при присваивании нет, потому что информация справа от = дублирует тип указателя слева. Я не знаю, почему в плюсах решили, что каст обязательно должен быть, но в сишечке каст избыточнен.
> указатель это просто unsigned число
Не думай так. Указатель - это непрозрачное значение. На одних архитектурах это просто число, на других архитектурах указатель на функцию может быть численно равен указателю на данные, а где-то в указателе вообще могут быть закодированы метаданные.
>>642931
> от чего зависит тип, возвращаемый маллоком? (64 или 32 инт)
В общем и целом, размер указателя определяется размером адресуемой памяти, что в свою очередь определяется разрядностью процессора. А на практике размер определяется разрядностью кода, который ты компилируешь. Т.е., 32-битный исполняемый файл содержит 32-битные указатели. Этот же 32-битный файл можно запустить на 64-битной системе, если проц и ОС умеют, но указатели останутся 32-битными.
Вроде, решил задачу, но теперь выводятся какие-то лишние пустые строки после каждой строки текста, и всего выводится строк на одну меньше. А еще непонятно, как освобождать память.
https://ideone.com/r1gS6X
>А еще непонятно, как освобождать память.
Просто free(очередь) ведь уничтожит все строки, на которые ссылаются указатели?
free освободит память по тому указателю, который ты в нее скормил, т.е., только саму queue. Строки тебе нужно освобождать самому. Например, можешь сделать API вида dequeue(struct queue ∗q, char ∗dest_buffer) и вызывать free внутри dequeue, а можешь просто решить, что вызывающий dequeue получает строку во владение и должен сам вызвать free.
>можешь сделать API вида dequeue(struct queue ∗q, char ∗dest_buffer) и вызывать free внутри dequeue
Смотри, вот так нормально? https://ideone.com/VlIRVw
Только здесь совсем не проверяется переполнение буффера.
А, нет, все еще плохо написано. Надо кономно выделять память для строк и использовать для этого свой аллокатор.
> Хотя лучше пиши с кастами - с ними труднее ошибиться
> struct queue q = (struct queue )malloc
Чёт угорел тут.
Но чё вызывает мою основную жопоболь - printf - ладно, возможно они и не нужны в отлаженном проекте, но бля...
Ну ты же животное просто если у тебя всё на маллоке заканчивается. Когда в си занимаешься вещами вроде ptr = something лучше явно указать тип, если не уверен, иначе выебешь сам себе мозг пока будешь искать где у тебя могло даные перекосоёбить силами слабой типизации.
>>644664
Ну C так-то и позиционирует себя как высокоуровенный ассемблер (у которого, на секунду, типизации нету), которому похуй что ты там ворошишь.
> лучше явно указать тип
Если справа void ∗, ничего нигде перекосоебить не может. Оно так задумано, и нормально работает.
> типизации нету
Типизация есть, просто компилятор ничего не проверяет (потому что не может). А стандарт говорит, что при указании несовместимых типов будет UB.
Вот у нас есть malloc() и calloc(). malloc выделяет sizemem неинициализированной памяти, причем для изменения объема по malloc требуется вызывать realloc. А в calloc память выделяется динамически, сразу инициализируется и сама добавляется по мере необходимости. Вопрос: а нахуй тогда нужен неповоротливый malloc? То есть malloc, конечно, возвращает указатель на начало блока, что удобно, но после calloc мы тоже можем один раз спросить указатель, что явно удобнее, чем потом походу программы добрую дюжину раз ебаться с realloc.
> и сама добавляется по мере необходимости
Это ты к чему? Вся разница между ними что calloc зануляет память (потому чуть медленее) в отличие от malloc.
>А в calloc память выделяется динамически, сразу инициализируется и сама добавляется по мере необходимости.
Ты, видимо, живёшь в каком-то волшебном мире.
calloc - это просто malloc с обнулением памяти.
Ну вон там в шапке C Primer Plus есть. Лишнее проскроллишь.
На Пистоне я, допустим, скрипт, который проверяет почту и созраняет файлы написал. Скриптота деформировала мой мозг лол.
Основную реализацию твоего петона поправить например.
Вообще все, чему нужна производительность до пары миллисекунд и близость к железу.
Инкрементирую этого. Всегда чесались руки сделать свой ламповый спойт, только вот между теорией и практикай огромная пропасть. Алсо, сколько мандеев стоит один сплойт?
Хочу хорошо знать си - пока изучаю LCTHW, затем планирую изучить "k&r c". Затем, возможно, что-то из литературы в шапке.
А как насчет практики? Где имеет смысл применить и закрепить полученные знания?
> Где имеет смысл применить и закрепить полученные знания
Я десктопный софт и дрова пилю, мне норм. Можешь расширение для руби написать, например.
>>648390
>>648760
Можете попробовать поразбирать чужие сплоенты и малварь, поскроллить blackhat archives, ну и целенаправленно искать презентации и статьи по интересующим техникам.
>Я десктопный софт и дрова пилю, мне норм. Можешь расширение для руби написать, например.
спасибо, именно в этом направлении пока и думаю. Только в сторону младшего брата руби - mruby, там, пока, есть где развернуться.
>Я десктопный софт и дрова пилю, мне норм.
какие дрова пилишь, какой софт?
Короче говоря, копать в системное программирование и реверс-инженеринг. Спасибо.
Скомпилировал так: gcc simplenote.c -o simplenote
Запускаю так: ./simplenote data.txt hui
Возникает ошибка: No such file or directory
Файл существует и лежит рядом с программой.
>Файл существует и лежит рядом с программой
Даже когда создал файл notes в /tmp, все равно появляется ошибка. К тому же флаги говорят создавать файл, если его нет.
Нашел ошибку, хуй записать получилось.
Вна слюниксе, соре.
Все правильно, люникс это юникс от Линуса.
Хуй знает, я вот написал написал свою выделялку памяти, а на ней выделяют память всякие авлдеревья (я типо базу данных писал, как будто, а на самом деле стл чтоль)... - угарно вроде. Некогда не любил рекурсию, но сбалансированные деревья, в общем они дают мне спокойствие что стек не переполнится.
> выделялку памяти
В смысле для чего: чтобы сохранять на хдд, чтобы пользоваться не только прямыми указателями, а и смещениями...
> Я не знаю, почему в плюсах решили, что каст обязательно должен быть
В C любой указатель неявно кастуется в void°, и наоборот.
В C++ появились классы и иерархии типов. Неявный каст разрешён только вверх по иерархии, адрес объекта класса-потомка можно присваивать указателю типа базового класса. Если бы возможно было работать с void° как в C, это бы привело к аномальной системе типов, где void одновременно и базовый тип для всех типов и подтип всех типов.
Анон, в K&R, как это работает? Как получается букву хранить в int?
int c;
c = getchar();
Буква это число. Текст число. Картинка число. Программа - число. Все число. Проблема только в том чтобы размера переменной хватило.
В компьютере буквы пронумерованы. Он не хранит буквы, только их номера. И с помощью кодовой страницы определяет, какие буквы показывать при выводе.
Именно буквы вводимые с клавиатуры пронумерованы получается? Тогда понятно.
Вообще все символы пронумерованы.
То есть, это какие-то философские заморочки, никакого отношения к практике не имеющие.
>>649871
Можно добавить, что:
- это просто общепринятая практика. У себя ты можешь создать массивчик, и если ты встречаешь в нем число 1 - твой код рисует смайлик, а если 2 - букву 'A', а если 3 - фразу "ОП - хуй" - компьютеры всегда работают с числами, а программа решает, как их интерпретировать;
- существует дохуя многобайтовых кодировок, и в каком-нибудь UTF-8, где для кодирования символа используется от 1 до 6 байтов, getchar() будет возвращать не весь код символа, а эти байты по одному когда создавался Си, такой проблемы не было - 128 символов хватало всем, поэтому в языке до сих пор тут и там вылезают проблемы по поводу Unicode .
>То есть, это какие-то философские заморочки, никакого отношения к практике не имеющие.
Система типов это самая практика и есть. Просто кодерам непонятно, они же TAPL не читали.
Коды клавиш вроде как не такие же как аски, если ли вообще по этой теме соглашения?
Да, есть, скан-коды повторяют аццки древнюю клавиатуру IBM PC, где ещё не было клавиш F1..F12.
Разве? Насколько я помню, сканкоды PS/2 к ASCII отношения не имеют, их нужно транслировать в ASCII по таблицам. То же самое и с USB-шными скандкодами.
>>651058
Да, есть стандарты, они описывают, у какой клавиши какой сканкод.
Именно. Скан-коды начинаютьса с единицы, и это код клавиши "Esc".
Она уже в те времена была первой на клавиатуре.
Извини, неправильно прочитал "аццки".
#include <stdlib.h> в самое начало файла, system("pause"); в самый конец main() (перед return, если есть return). Если это решит проблему, рекомендую научиться компилировать и запускать программы из командной строки.
Ни как
Вот код в оригинале:
#include <iostream>
#include <stdio.h>
int main() {
double nc;
for (nc=0; getchar() !=EOF; ++nc)
;
printf ("%.0f\n", nc);
}
Откуда тут iostream? Ты ошибся либо тредом, либо книгой.
Возможно, ты не вводишь Ctrl+Z после своих символов, и твоя программа крутится в for, вечно ожидая EOF. Возможно, ты хочешь выводить счетчик после каждого сиимвола, в таком случае ; перед printf надо убрать.
Если там нормальные уроки по нормальному спп то не стоит.
Если хочешь вкотится в программинг - учить читать, тебе это предстоит делать в очень и очень большом объёме.
Мы тут все такие умные, знаем путь к библиотеке, даже имеем задолжность - библиотекарша наверно думает что мы зачитываемся, и мечтает познать этот внутренний мир. Но я только пролистал формы сортировки - чтобы ловко козырять глубинами мысли. Короче кидаю посыл, не читал - программинг не внял.
Кроме как после практики от технического вуза, увы, мало шансов попасть на Си-джуна.
>практики от технического вуза
Это как? Это если вуз меня сам засунет в какуюнить конторку где нужны сишники?
Да. Большинство историй успеха в Си по крайней мере такие. Не представляю, как можно попасть с улицы.
Можно попробовать устроиться на скриптокодера и писать нативные расширения для язычка на Си. Или в асушники/плисоводы/эмбеддеры, но там проблема как выше: без опыта не нужны, особенно в кризис.
Написать в отдел кадров ближайшего завода ВПК и попасть. Ничем от "практики в ВУЗе" отличаться не будет.
В большом городе точно просто, программистов дефицит.
Хм. А "срезы" поверх массива?
Срез - это когда я хочу посчитать среднее не с 0 до (N-1), а с A до (B + (N-1)), и часть массива передаю в функцию.
Это в чистом виде не передаются. А можно обернуть в структурку и структурку по значению передать. Другое дело, что передача по значению чего-то кроме примитивных типов в сишечке не оправдана.
>>657759
Передаешь указатель на массив, стартовый индекс, количество элементов. Или передаешь указатель на начало "среза" и количество элементов. Сам массив ты не передаешь.
Создал там же ссылку на первый указатель по типу:
struct *adress = &struct1
Когда вызываю эту ссылку в функции в другом подключаемом сишном файле, хуячит ошибку. Если объявляю ссылку на адрес внутри этой функции программа компилируется. Но если пишу после этого сразу что-то по типу
adress = &struct1.next
выводит предупреждение и данное присваивание не работает.
Если присваивание так не работает, то как правильно?
Если я объявляю в хидере структуру и ссылки и он подключается к главному файлу, то тип данных структура и ссылка должна же являться глобальным объявлением и должна работать в любых функциях?
В общем, что я делаю не так?
>хидере
Сука, чтобы у тебя хуй не стоял.
А вообще хедер без прямого инклуда в каждом объектном файле сам не подключается, так что в каждом модуле хуярь этот хедер, если у тебя там не определены эти структуры.
При CHAR_BIT != 8 нет никаких uint8_t. Вообще. Не поддерживаются.
>>657860
Покажи код, нихуя не понятно.
>Как правильно по стандарту:
stdint.h
The header <stdint.h> declares sets of integer types having specified widths, and
defines corresponding sets of macros. It also defines macros that specify limits of
integer types corresponding to types defined in other standard headers
>CHAR_BIT != 8 нет никаких uint8_t. Вообще. Не поддерживаются.
Че за платформа?
>>657871
хедер я подключил в объектном файле, к счастью извилин на это все таки хватило
Объявление стуруктуры из хедера:
typedef struct {
voidNext; // ссылки на следующую строку
voidPrevious; // ссылка на предыдущую строку
voidLeft_neighbor; // сслыка на левого соседа-столба
voidRight_neighbor;// ссылка на правоо соседа-столба
uint8_tY; // координаты ячейки с которой начнется вывод символов из массива
uint8_t X; // У - номер строки, Х - номер позиции в строке
uint8_tSelect_comand; // код команды
charText[20]; // текст строки(в оригинале была const char)
} MenuLine; // название типа
MenuLine ScreenLine1_1;
MenuLine ScreenLine1_2;
MenuLine ScreenLine1_3;
MenuLine ScreenLine1_4;
MenuLine Select_MenuLine = &ScreenLine1_1;
если последнюю строку оставить так, то в при вызове в другой функции он выдает ошибку что эта ссылка не декламирована( точнее не скажу, т.к. прога на домашнем компе нихуя не хочет работать на 8ке)
А вот если последнюю строку перетащить в нужную функцию то вроде ошибку не выдает. Но если приписать еще
MenuLine Select_MenuLine = &ScreenLine1_1;
Select_MenuLine = &ScreenLine1_1.Next;
то warning и не работает. А мне подобное нужно, т.е. через эти ссылки перехожу на другой экран меню.
>>657871
хедер я подключил в объектном файле, к счастью извилин на это все таки хватило
Объявление стуруктуры из хедера:
typedef struct {
voidNext; // ссылки на следующую строку
voidPrevious; // ссылка на предыдущую строку
voidLeft_neighbor; // сслыка на левого соседа-столба
voidRight_neighbor;// ссылка на правоо соседа-столба
uint8_tY; // координаты ячейки с которой начнется вывод символов из массива
uint8_t X; // У - номер строки, Х - номер позиции в строке
uint8_tSelect_comand; // код команды
charText[20]; // текст строки(в оригинале была const char)
} MenuLine; // название типа
MenuLine ScreenLine1_1;
MenuLine ScreenLine1_2;
MenuLine ScreenLine1_3;
MenuLine ScreenLine1_4;
MenuLine Select_MenuLine = &ScreenLine1_1;
если последнюю строку оставить так, то в при вызове в другой функции он выдает ошибку что эта ссылка не декламирована( точнее не скажу, т.к. прога на домашнем компе нихуя не хочет работать на 8ке)
А вот если последнюю строку перетащить в нужную функцию то вроде ошибку не выдает. Но если приписать еще
MenuLine Select_MenuLine = &ScreenLine1_1;
Select_MenuLine = &ScreenLine1_1.Next;
то warning и не работает. А мне подобное нужно, т.е. через эти ссылки перехожу на другой экран меню.
бля, попытка попытка номер два
typedef struct {
voidNext; // ссылки на следующую строку
voidPrevious;// ссылка на предыдущую строку
voidLeft_neighbor;// сслыка на левого соседа-столба
voidRight_neighbor;// ссылка на правоо соседа-столба
uint8_tY;// координаты ячейки с которой начнется вывод символов из массива
uint8_t X;// У - номер строки, Х - номер позиции в строке
uint8_tSelect_comand;// код команды
charText[20];// текст строки(в оригинале была const char)
} MenuLine;// название типа
MenuLine ScreenLine1_1;
MenuLine ScreenLine1_2;
MenuLine ScreenLine1_3;
MenuLine ScreenLine1_4;
MenuLine *Select_MenuLine = &ScreenLine1_1;
Не занимайся хуетой, юзай pastebin.com
>>657880
typedef struct {
void Next; // ссылки на следующую строку
void Previous; // ссылка на предыдущую строку
void Left_neighbor; // сслыка на левого соседа-столба
void Right_neighbor; // ссылка на правоо соседа-столба
uint8_t Y; // координаты ячейки с которой начнется вывод символов из массива
uint8_t X; // У - номер строки, Х - номер позиции в строке
uint8_t Select_comand; // код команды
char Text[20]; // текст строки(в оригинале была const char)
} MenuLine; // название типа
MenuLine ScreenLine1_1;
MenuLine ScreenLine1_2;
MenuLine ScreenLine1_3;
MenuLine ScreenLine1_4;
MenuLine *Select_MenuLine = &ScreenLine1_1;
извиняюсь, впервые такую хуету вижу
Множество DSP.
>>657895
> эта ссылка не декламирована
В Си нет ссылок.
> прога на домашнем компе нихуя не хочет работать на 8ке
Поставь себе компилятор (в шапке несколько есть на выбор, все работают на 8).
> warning и не работает
Какой ворнинг?
> void ∗Next
Почему void∗ тут? Пиши что-то типа:
typedef struct MenuLine
{
struct MenuLine ∗Next;
struct MenuLine ∗Prev;
...
}MenuLine;
> при вызове в другой функции он выдает ошибку
Значит верное тебе сказали про хедеры. Про extern не забудь.
> Select_MenuLine = &ScreenLine1_1.Next;
Ты хоть структуры-то заполняешь?
Не пробовал менюшки массивами делать? Типа:
MenuLine menu[] =
{
{ .Text = "Первая строка" },
{ .Text = "Вторая строка" },
{ 0 }
};
На конец массива можно проверять, например, как menu[index].Text[0] == '\0'.
И да, используй pastebin.com или ideone.com. В крайнем случае, заменяй звездочки на ∗
Множество DSP.
>>657895
> эта ссылка не декламирована
В Си нет ссылок.
> прога на домашнем компе нихуя не хочет работать на 8ке
Поставь себе компилятор (в шапке несколько есть на выбор, все работают на 8).
> warning и не работает
Какой ворнинг?
> void ∗Next
Почему void∗ тут? Пиши что-то типа:
typedef struct MenuLine
{
struct MenuLine ∗Next;
struct MenuLine ∗Prev;
...
}MenuLine;
> при вызове в другой функции он выдает ошибку
Значит верное тебе сказали про хедеры. Про extern не забудь.
> Select_MenuLine = &ScreenLine1_1.Next;
Ты хоть структуры-то заполняешь?
Не пробовал менюшки массивами делать? Типа:
MenuLine menu[] =
{
{ .Text = "Первая строка" },
{ .Text = "Вторая строка" },
{ 0 }
};
На конец массива можно проверять, например, как menu[index].Text[0] == '\0'.
И да, используй pastebin.com или ideone.com. В крайнем случае, заменяй звездочки на ∗
>typedef struct MenuLine
>{
>struct MenuLine ∗Next;
>struct MenuLine ∗Prev;
>...
>}MenuLine;
Кстати, никогда не понимал зачем нужна возможность дважды именовать структуру до и после (кроме спермоизъебств где первое как тип второе как указатель.
В отличие от плюсов, в Си пространства имен struct и типов не пересекаются (у тебя в коде могут быть struct Foo и typedef unsigned int Foo). Имена структур указываются с ключевым словом struct, а если тебя такой способ не устраивает, тебе нужен typedef.
В typedef ты можешь определить безымянную структуру, как в >>657880, и это будет работать. Но если тебе потребуется тип этой структуры во время ее определения, пока typedef еще "не отработал", ты никуда не денешься от необходимости обозвать структуру и обращаться к ней через struct, как в >>658014, либо сделать почти то же самое отдельно:
// Объявляем тип Foo, на данный момент являющийся "incomplete struct Foo".
// На основании неполных типов можно объявлять указатели, но их дереференсить,
// пока тип не будет определен.
typedef struct Foo Foo;
// Определяем содержимое struct Foo.
struct Foo {
// Объявляем указатель на Foo, который пока все еще является
// "incomplete struct Foo".
Foo ∗anotherFoo;
};
В обоих случаях тебе нужно, чтобы у структуры было имя. А уж дублировать его, или в вендостиле писать tagFoo - дело твое. Некоторые пишут struct _Foo - это неправильно, идентификаторы с подчеркиванием зарезервированы.
Вариант с отдельным typedef на практике более удобен - он скрывает реализацию. Ты можешь определить API, работающий с Foo ∗, положить в .h только строчку с typedef, а саму struct определить в .c, и потом менять содержимое структуры как угодно, не требуя изменения или перекомпиляции "клиентского" кода.
Вот как лучше сделать, несколько раз делать разыменование или 1 раз перегнать в переменную и далее работать с ней?
С точки зрения кода, разыменование в компиль-тайме станет обычным обращением к ячейке через регистр и, возможно, каким-нибудь смещением, но при этом на стеке не будет выделятся место для хранения этой переменной (хотя, конечно, сильно зависит от компилятора), но с точки зрения читаемости кода, лучше перегнать в переменную, ибо синтаксис Сишечки позволяет городить невообразимые конструкции.
ты всё больше и больше меня пугаешь. представляю длину твоей бороды и как там воняет. сидишь тут, расстыковываешь всё, популярно. мочек чтоль?
Там же не просто складываются размеры членов структуры, а как-то выравниваются?
И самый главный вопрос. Как рассчитывается размер, если там указатель на такую же структуру? Не могу догнать.
Например, вот.
struct node {
int id;
struct node *next;
};
Какой будет размер у неё в битах/байтах?
Помогите пожалуйста.
> Как рассчитывается размер, если там указатель на такую же структуру?
Как и размер любой другой структуры: сумма размеров её членов плюс выравнивание. То, на что указатель указывает, частью структуры не является и в её размер не входит. Для 32-битной системы, для не хитровыебанного компилятора sizeof(struct node) будет 8. 4 байта инт + 4 байта указатель.
И сделано это для того, чтобы можно было один раз выравнять массив структур, и спокойно пользоваться.
Компилятор: GCC 5.3.1-1 с -Wall.
> Restrict is a "no data hazards will be generated" contract between the programmer and the compiler. The compiler relies on this information to make optimizations. If the data is, in fact, aliased, the results are undefined and a programmer should not expect the compiler to output a warning. The compiler assumes the programmer is not lying.
Ясно. Не нужно обманывать доверие компилятора. Спасибо.
Вопрос отменяется. Я понял, что нельзя менять ориентацию потока до самого закрытия.
Что лучше, Qt или Eclipse?
CODE:: Blocks реально монстр, раньше писал на Dev-C++, но он протух уже год как.
VS - это просто пиздец, я же только хеллоуворды пишу пока.
Pelles C возьми, если хеллоуворлды.
Сиди и разбирайся, какой же ты после этого погромист?
Любой текстовый редактор с возможностью встроить запуска компилятора.
мимо vimобог, не знающий IDE-проблем
Поссал консольную парашу из 76-года, для которой надо учить ее собственный язык, чтобы нормально пользоваться.
Поссал на парашку со своим недоскриптоязычком для детей, которая имеет 1/5 от возможностей расширения Единственного Божественного emacs-а.
Поссал на парашу с полумертвым недолиспом, которым пользуются 3,5 говноеда и без которого emacs не юзабельное говно, вместо классического и для всех удобного управления при помощи скриптов Божественного Vim'а.
В треде тихо как-то. Что же еще делать, кроме как указывать фанатикам путь истинный?
Да хуй знает, обсуждайте свои редакторы или что угодно делайте, но не сводите все к "поссал на дурака - нет это я на тебя поссал"
Так теперь называют нерасширяемое деревянное говно, замёрзшое на морозе 20 лет назад?
Аргументация уровня goвно даунов и purebasik полуебка.
>>666010
Иди ставь свою студию/clion и жри говно.
Я понимаю, что плюсотред в другой стороне, но неужели никто не использует встроенную поддержку JTAG, GDB, TDD?
>ВЫ ВСЕ ВРЁТИ!!! БОЖЕСТВЕННЫЙ ВИМ УСТАРЕЛ!!! ТВОЯ АРГУМЕНТАЦИЯ ГОВНО!!! ЕМАКС!!!ЕМАКС!!!ЕМАКС!!!ЕМАКС!!!ЕМАКС!!!ЕМАКС!!!
>Иди нахуй пользователь не emacs'а
Ясно. Этот петух, поклоняющийся мозолееду порвался. Кстати, твоя параша уже почти год не обновлялась. И тебе ли говорить о говне мамонта? В Vim'е хотя для скриптописания обновы постоянно выходят.
Возможно потому, что пользователей Vim'а больше и в нем быстрее правят недостатки нежели в emacs'е, который и нахуй никому не нужен, имеющий код еще из 70-х годов и тормозящий даже на среднем железе, если не выпиливать из него не нужное говно, которым его обвесили из коробки?
>больше хипсторов допущеных до коммитов
>чаще обновляется
>кудах кокок лагает
Эта боль дебила-нищеброда.
>нет людей, которые согласились бы коммитить
>следственно и обновляется раз в несколько лет ибо никто не хочет разбираться в говнокоде, написанном >40 лет назад
>лагает на core i5 образца конца 2011 года и 6Гб памяти - нищеброд кококо
Ясно. Эти мозолеоправдания.
Лел, сударь не знает, что богоподобный сублим запускается и на вин и на никсах, ууух, какой ты еблан
>на i3 540 (2010), 8 gb и последней бубунте не лагает, а на железе лучше – лагает
>нету нормальных кодеров, осиливших лисп
>зато куча скриптомакак
Гибкость вашего манямирка поражает, василий.
>думает, что ОСей кроме Linux, Windows и MacOS не существует
Уебывай. Даже емаксопетухи лучше тебя.
>>666031
>убунтенок
Ясно. Для тебя тормоза емакса даже не заметны. Вероятно ты привык к тормозам.
>нету нормальных кодеров, осиливших лисп
>считает, что elisp имеет что-то общее с божественным лиспом
>>зато куча скриптомакак
>не осилил скриптописание и считает, что конфиги для ПО надо писать на своем ЯП.
Ясно.
>Ясно. Для тебя тормоза емакса даже не заметны. Вероятно ты привык к тормозам.
Просто я не хочу тратить время на арчи и прочее дерьмо, которое мне ничем не поможет в будущем. Ты, конечно, можешь компилировать себе генту с федорами и наслаждаться своей илитарностью.
>считает, что elisp имеет что-то общее с божественным лиспом
Щитаю что это семейство языков, а не куча размазанного макаками по зоопарку скриптопараши дерьма.
Согласен. Емаксопетухов мало. Но емакс хоть запустить на кофеварки можно в отличии от твоего проприетарного говна. Впрочем, если тебе нравится кушать то, что позволит тебе господин...
>Просто я не хочу тратить время на арчи и прочее дерьмо, которое мне ничем не поможет в будущем. Ты, конечно, можешь компилировать себе генту с федорами и наслаждаться своей илитарностью.
>Считает, что конфигурировать систему нормально можно только на раче с гентой.
Ясно.
>Щитаю
Еще раз ясно.
>что это семейство языков, а не куча размазанного макаками по зоопарку скриптопараши дерьма.
>считает, что интерфейсы для взаимодействия с ПО - не нужны
Понятно.
Кстати, твой емакс научился уже в подсветку синтаксиса сразу нескольких языков без мокрописечных аддонов? К примеру связку HTML+CSS+JS осилит? Или придется пердолится? По крайней мере пару месяцев назад еще приходилось пердолится.
>К примеру связку HTML+CSS+JS осилит?
Понятия не имею, и сомневаюсь в этом. А ты случаем не пробывал редактировать си, питон и лисп в одном файле?
>Считает, что конфигурировать систему нормально можно только на раче с гентой.
Какие профиты в этом? Нитармазит, кококок, на 0,5 быстрее включается? разве что в случаях когда у тебя последний суперйобапроцессор с каким-то экзотическим набором инструкций
Молодой человек, ознакомтесь с литературой по этому вопросу.
>Понятия не имею, и сомневаюсь в этом. А ты случаем не пробывал редактировать си, питон и лисп в одном файле?
Ну-ну-ну. Исходник странички, на которую ты сейчас смотришь - это как раз смесь HTML+CSS+JS. Так что юзкейс жизненный, нечего передёргивать.
независимый наблюдатель
а) Я смотрю на приложение;
б) То, что требуется смесь языков не значит, что это нельзя структурировать;
в) Никогда этим не интересовался, не передёргиваю. Возможность наверняка есть, но вряд ли из коробки.
>ь си, питон и лисп
Слишком экзотично для меня. Но мне хватило и HTML+CSS+JS, с которыми, без дополнительных инструментов невозможно работать. То ли дело Vim, в котором все базовые возможности работают из коробки .
>Какие профиты в этом? Нитармазит, кококок, на 0,5 быстрее включается?
Будучи сишником, мне интересно знать как работает то, чем я пользуюсь. Разница между дистрибутивами небольшая, но все та же Убунту предназначена для домохозяек в большей степени и есть некоторые ограничения. Поэтому, считаю что лучше взять дистрибутив, в котором предусматривается сразу возможность гибкой настройки.
>То ли дело Vim,
>от скриптоваськов скриптоваськам
>Будучи сишником, мне интересно знать как работает то, чем я пользуюсь
Будучи сишником, мне интересно что и как работает, но мне посрать какой там будет менеджер пакетов, в чём там отличия возможности администрирования, стандартных пакетов библиотек и все остальное. Файловая система, модель памяти и всё остальное там не отличается разнится – мне легче поставить дистрибутив для домохозяек и писать что-то, а не ебурится со сборкой.
>Файловая система
Может отличаться. Где-то ext4, где-то btrfs.
>стандартных пакетов библиотек
Может сильно отличаться. Как минимум версии библиотек. И если ты любитель использовать новые возможности, у тебя могут быть занятные проблемы, если не знаешь подробностей.
>Скрипты не нужны.
Ясно. Ты этим все сказал. Иди почитай о том, что такое скрипт и для чего он нужен.
>Может сильно отличаться.
Если буду писать что-то кроссплатформенное – предпочту поставлять всё в комплекте, либо писать конкретные версии зависимостей. Сомневаюсь что самые базовые вещи в какой нибудь glibc сильно разнятся при разбросе в пару версий.
>Ясно
Это можно написать о твоём манявидении.
Ты больше похож на школьника, который вчера выучил hjkl и уже засрал доску этим.
В роли констант у enum практически нет преимуществ по сравнению с #define, зато есть ограничение на тип значения (только int), в то время как макросом можно задать любое значение. Вот вообще ни разу мне не пригодились enum'ы, и более того, даже специально подумав, я не знаю где их реально можно было бы применять так, чтобы это было однозначно лучшим решением для данной ситуации.
Есть. Битфилды. В рантайме дешевле bool делать и жрать на 7 бит больше памяти, чем тормозить процессором, а для обмена битфилды использовать не получается, потому что они даже в пределах платформы часто непереносимы, и проще сразу делать масками.
А вот про enum ты зря. Очень удобно указывать в качестве аргумента функции вместо безликого int. Алсо, ограничение на тип (и особенно то, что он знаковый) иногда мешает, тут ты прав.
Как минимум не надо ебаться с макрофункциями, если перечисления идут по возрастанию, задал начальный и ок, компиль сам все сделает. Плюс типизация - для интерфейсов либ, например, более понятное назначение аргумента функции.
Для однобайтовой кодировки просто кастани к указателю на uint8_t и еби побайтово или побитово. Для юникода - преобразуй к UTF-8 сначала.
>Очень удобно указывать в качестве аргумента функции вместо безликого int
Так-то да, но typedef int Yoba ничем не хуже же, а typedef long long Yoba, там где это может понадобиться, даже объективно лучше.
Что до битфилдов, то тут обычный трейдоф память/скорость, это я еще могу себе представить — например в каком-нибудь эмбеде, если таких структур вдруг нужно хранить дохуя, а обращения к ним нечастые, то почему бы и не упаковать их. Хотя тоже, конечно, довольно сомнительная фича.
> typedef int Yoba ничем не хуже же
Хуже. Тебе придется где-то указать, что пихать в Yoba. Сравни с:
typedef enum YobaMode
{
YOBA_MODE_AUTO = 0,
YOBA_MODE_FOO = 1,
YOBA_MODE_BAR,
YOBA_MODE_BAZ,
} YobaMode;
Не понимаю до конца. Смотри, есть генератор m-последовательности над конечным расширением двоичного поля, просто поток нулей и единиц. И есть символ из восьми бит. Как выполнить XOR гаммы с кодом символа? Ведь гамма вырабатывается непрерывно, а символ фиксирован.
Допустим, символ такой: 00011010
И гамма - это поток 1011010101110101101
Имеем:
00011010
10110101
XOR: 10101111
Если бы оба числа были фиксированы, то можно было бы завести bit_iterator и пройти по всем соответствующим битам. Но генератор выдает по одному биту за обращение к нему.
>>666720
Просто там же рядом те же самые YOBA_MODE_FOO и т.д. задать дефайнами и всё, получится не хуже, ведь никакой автоматической проверки корректности значений для enum'ов не завезли, и у тебя вполне можно сделать YobaMode var = 567 (вообще любое совместимое с int значение).
У тебя задача какая стоит?
Не понимаю, кто тебе мешает 8 раз взять из генератора по 1 биту, собрать из этого байт и поксорить. Или наоборот реализовать битстрим из байтового потока сдвигами и масками.
Ты прав, однако. Хотя унарному плюсу и можно при очень большом желании найти применение, в первую очередь он есть в языке просто "шоб было". Я даже совсем забыл про него.
>никакой автоматической проверки корректности значений для enum'ов не завезли
ты там ворнинги принципиально не включаешь чтоли?
enum test_enum { nol, odin, dva, tri } test_var;
...
test_var = 555;
Ни clang, ни gcc с ключом -Wall нихуя не выдают, только что проверил.
Тоже всегда включен у меня.
Загляни в исходные коды разных проектов, ты заметишь, что их очень много. Как и говорит само название "enum", он создан для перечислений.и вполне удобен, если надо определить целую группу констант. Через define'ы это будет более громоздко выглядеть.
Не переживай, я на C практически не пишу, а если пишу, то только какие-то мелкие вещи, обычно только исходники читаю в большом количестве. Битфилды на практике ни в одном коде, что смотрел, не встречал.
Эта трата мозгового времени на обдумывание чего-либо, связанного с памятью.
мимоджавапроходил
Явапидор не в курсе, что в его курятнике ебли с памятью ещё больше. Вот тебе 2ух часовая лекция про Java Memory Model: https://www.youtube.com/watch?v=iB2N8aqwtxc
Для оптимизации какого кода он его применяет и насколько эффективно? Только для вычислений или так же всякие поиски строк может ускорять?
Ну, во-первых, все вычисления с плавающей точкой по умолчанию на SSE (FPU мёртв настолько, что уже из процессоров выпиливают). У GCC не всегда получается разглядеть параллельные операции, и он высирает лапшу там, где можно было упаковать и посчитать разом. Циклы векторизуются более-менее нормально (особенно если про restrict не забывать, а если еще и количество итераций константное, то вообще заебись). За строки не скажу, но предполагаю, что не осилит без твоей помощи. А вообще, objdump тебе в помощь - конпелируй, смотри.
У Криски есть пару статеек на тему оптимизации компиляторов. Протухо правда, но что есть.
Короч пытаюсь я сделать так
HANDLE hThread;
DWORD dwThread;
DWORD exThread;
HANDLE lib = LoadLibrary("ntdll.dll");
LPVOID _NtSetInformationThread = GetProcAddress(lib,
"NtSetInformationThread");
(_NtSetInformationThread) (GetCurrentThread(), 0x11,
0, 0);
А эта сука мне пишет
151 C:\Dev-Cpp\.c called object is not a function
ЧЯДНТ?
>(_NtSetInformationThread) (GetCurrentThread(), 0x11,
>0, 0);
((void(*)())_NtSetInformationThread) (GetCurrentThread(), 0x11,
0, 0);
Неужели в сишку ВНЕЗАПНО типы завезли? Не было же.
Вот этот код не компилируется: http://pastebin.com/GgjaARaW
error: value out of range. в строке mov al, [b + si]
Что здесь не так? Адрес массива b - 32-битное число, прибавляем к нему байт и получаем адрес следующего элемента. Я подумал, что надо явно указать размер числа, которое берется по адресу в скобках, но mov al, byte [b + si] тоже не компилится.
Ты пытаешься вызвать указатель на void. А вызывают обычно функции. Определи правильный тип, а чтобы не запутаться и не писать лишние касты, еще и тайпдеф к нему:
// Определяем тип NtSetInformationThread, являющийся указателем на функцию с
// определенными типами аргумнтов и возвращаемого значения, с конвенцией вызова
// __stdcall (она же NTAPI).
typedef NTSTATUS (NTAPI ∗NtSetInformationThread(HANDLE,THREAD_INFORMATION_CLASS,PVOID,ULONG);
// Определяем переменную типа "указатель на функцию" и присваиваем ей значение.
NtSetInformationThread pNtSetInformationThread = (NtSetInformationThread) GetProcAddress(...);
// И вызываем.
pNtSetInformationThread(...);
>>668850
У тебя 32-битный код. Используй для адресации 32-битные регистры (ESI блять!). Алсо, ты тредом ошибся, ну да и похуй.
Спермоворы не в курсе, что уже давно продаются ноуты с предустановленным линуксом.
Буст с стл крестовой индексируют, а проект на си заебутся. Лол.
Торвальдс, например, юзает git, grep и вот это
http://git.kernel.org/cgit/editors/uemacs/uemacs.git/
Есть видео где Торвальдс пишет ядро? Не представляю как можно пользоваться такими инструментами эффективно.
Порно с ним ещё поищи. Он пробитый олдфаг, и не стоит пытаться подсесть на хуец емакса если сам Линус на нём пишет – это говноедство уровня совка. Открывай в студиях/цлионах и не парься – они и не такое дерьмо индексируют (последний правда с дикими свопами).
можешь пофапать на другого жиробаса
хуярит на имаксе онлайн
ссмотреть бесплатно без смс реистрации
https://www.youtube.com/watch?v=btGVLs4NSOM
После 'git pull' я юзаю 'ctags -R && vim <нужный-файл>'. Без 'git pull' просто 'vim <нужный-файл>'. 'ctags -R' у меня на пекарне отрабатывает за 10-15 секунд. Ещё Taglist плагин для vim юзаю, но это так, чисто для общего представления, какая хуета объявлена/определена в файле, что я смотрю в данный момент.
А нахуй всё ядро индексировать? Там есть какая-то более менее независимая центральная часть типа управления памятью/процессами/объектами ядра плюс драйверы с архитектурами.
>Народ, а на каком IDE
> IDE
Хипсторы отодвинули в сторону смуззи, отложили книгу по раби и решили посмотреть на ядро linux.
Кто сказал, что не должны? Кто сказал что "самоограничение" через const должно требовать явный каст? И почему мы должны его слушать?
Когда работают – это и означает, что нет типов. PHP и JS так работают, им норм. Почему бы и не вызвать void* как функцию? Ничего ведь не мешает.
> Почему бы и не вызвать void∗ как функцию? Ничего ведь не мешает.
Мешает. Существуют машины, где два указателя на данные и на код могут быть численно равны, но указывать на различные сущности, поэтому Си однозначно отделяет указатели на функции от указателей на данные. Примерно потому же и void∗ нельзя разыменовывать. Ну и недостаток информации о способе вызова функции тоже мешает, да.
Очевидно сишка никакой проблемы ни в первом, ни во втором не видит: http://ideone.com/qBhXL6 С каких вообще пор сишке стало не хватать информации о способе вызова функции? Всегда хватало, а тут вдруг перестало? Тут кто-нибудь сишку учил?
>>671838
Ой, я умоляю, в PHP и JS тоже есть разные типы.
>>671849
Дык говорю, типизация уровня PHP.
проиграл
Ты скастил к указателю на функцию. Это официально UB, на нормальном компиляторе будет предупреждение.
Нужно ли для этого писать отдельный компилятор и libc?
Компилятор писать не нужно, GCC вполне хватит. А писать нужно первичный загрузчик, который прочитает твой код с диска, перейдет в защищенный режим и передаст управления (придется разобраться с objcopy). Но ты можешь просто взять GRUB, который загрузит твой ELF. А вот libc придется писать. По крайней мере, простейшую puts, которая запишет твой хелловорлд в видеопамять. Погуляй по osdev.ru, наверняка там гайды есть.
А, понял, это типа просто прототип функции.
http://wiki.osdev.org/Main_Page
>>672676
Зачем ты с людьми так неуважительно - ссылки на русскоязычные сайты даешь?
C Zver99 Edition, азаза.
На каком языке советовать инфу на русскоязычной борде?
>>672735
А чо он не нормальным должен быть-то?
Ну так хули ты выёбываешься, пёс?
Второй вопрос: что происходит в теле цикла while
static int foo;
void bar(void) {
foo = 0;
while (foo != 255)
; //что это?
}
Ну там же условие!
>foo != 255
Алсо, пример отсюда.
https://en.wikipedia.org/wiki/Volatile_(computer_programming)#Example_of_memory-mapped_I.2FO_in_C
Там видимо идёт поллинг этой переменнной, но что именно делает ; я не понимаю.
>что именно делает ; я не понимаю
Нихуя не делает. Тело цикла должно содержать хотя бы один оператор, а каждый оператор должен заканчиваться символом ';'. В данном случае, оператор не содержит ни одного выражения, т.е. является пустым.
Ну я тащемта про то же. Чем тогда мотивировались те, кто запостил этот пример на вики? выше ссылка
Бля, там нет никакого поллинга самого по себе в этой программе. Это просто пример, когда компилятор может оптимизировать код и заменить условие на while(1). Но если переменная foo может быть изменена чем-то извне, в отрывае от этой программы, то тогда нужно юзать volatile, чтобы компилятор оставил проверку выражения перед каждой итерацией.
Ааа, то есть ';' в этом примере это такой placeholder. Ok.
2^n в случае с 16 = 2^5 (т.к. в десятичном представлении разрядов пять), то есть 2^n = 32
Значение величины без знака = 16
Итого у меня выходит 16, а у Подбельского — 65520
Где я проебался?
n - количество битов используемых для хранения числа заданого типа, а не количество рязрядов в конкретном числе. Если для инта используется 16 битов то 2^16 - 16
2^16 - 16 = 65536 - 16 = 65520
>will notice that no other code can possibly change the value stored in foo
А как вообще что-то может изменить значение переменной вне функции, где она определена?
Допустим это ячейка памяти микроконтролёра, которая может меняться извне, но тогда у неё есть конкретный адрес. А в этом псевдокоде при рантайме только определяется её адрес.
>>673761
А, всё понял. Было такое подозрение, но что-то затупил.
Мне всё равно что-то непонятно, почему при применении "-" точка отсчёта именно 65536
Просто придумали такую условность, чтобы не городить преобразование типа на ровном месте?
> как вообще что-то может изменить значение переменной вне функции
Ну например ты зарегал какой-нибудь асинхронный ввод/вывод, зарегал флаг register_flag(&foo) и сидишь в таком простом spinloop, ждешь завершения. Произошло прерывание, и обработчик поменял foo.
Я нуб в сишке пока что, и твои слова мне мало о чём говорят, остаётся только на веру принять, лол.
Не слушай даунов, глобальная переменная foo может где то изменяться, может быть в другом потоке, может еще где, хотя еще по идее должна быть волатильной.
>Зачем нужен short, если у него битность такая же, как у простого инта?
Это ты про какую платформу говоришь то?
По стандарту char <= short <= int
На 32 битной short = 16bit, int = 32 bit
Меня вот эта таблица смутила. Тут для IBM PC. Всё равно странно, что там битность одинаковая.
Ну вот тебе простой, но надуманный пример: http://ideone.com/Y26JzT
>>673787
Таблица показывает общепринятые размеры для одной конкретной платформы (x86), для других платформ размеры могут быть другими. Лишь бы соблюдалось неравенство, которое >>673780 упомянул.
Ради интереса, а в твоём надуманном примере volatile обязательно? Компилятор сам не определит, что оптимизация здесь не уместна?
Не определит. Внутри цикла ты локальную переменную stop не меняешь, поэтому он мог бы считать, что она не меняется. Если бы не volatile. Но в моем надуманном примере можно выкинуть локальную переменную и указатели, сделав глобальную (ну, почти - видимость static ограничена модулем) static volatile bool ctrl_c_trapped и устанавливать в обработчике сигнала сразу ее, и ее же проверять внутри цикла.
Интересно.
>>673805
А где она меняется?
Я вижу только присвоение адреса stop определённой ранее termination_flag_ptr
termination_flag_ptr = &stop;
И как это вообще работает?
Сигнал прерывания приходит в функцию trap_ctrl_c но как?! там же выполняется другой цикл другой фукнции!, в ней меняется *termination_flag_ptr на тру зачем условие на проверку незанулённости указателя вообще?, а дальше-то что?
Каким образом это присвоит true стопу?
Да не, в этом примере справился
С выключенной оптимизацией и c volatile:
http://ideone.com/2p9qLu
С выключенной оптимизацией и без volatile:
http://ideone.com/N1P9QP
ОС обрабатывает Ctrl+C специальным образом (в *nix приложению сигнал посылается, в Windows это имитируется), рантайм приостанавливает и сохраняет состояние того, что выполнялось (регистры процессора, вся хуйня) и вызывает установленный тобой обработчик SIGINT, а после того, как обработчик вернет управление, восстанавливает состояние и продолжает выполнять код. Ну а обработчик просто по указателю меняет значение переменной stop.
>>673818
> справился
То, что в конкретном случае все работает, как надо, не гарантирует, что оно будет работать, как надо с другой версией компилятора, на другом компе и т. д. Надеяться на компилятор НЕЛЬЗЯ.
>в ней меняется termination_flag_ptr на тру
termination_flag_ptr - это и есть стоп. Там хранится адрес переменной stop, а через * мы обращаемся к самой переменной.
Да я же не спорю, просто ты так категорично заявил, что компиль глупенький, что аж засвербило.
>- Классика от Отцов: http://www.ime.usp.br/~pf/Kernighan-Ritchie/C-Programming-Ebook.pdf
Привет! Как там в 1988?
А какова функция строчки
>signal(SIGINT, trap_ctrl_c);
она только определяет в какую функцию посылается сигнал?
Или она постоянно выполняется? Я запутался.
Регистрирует. Почитай Роберта Лава Системное программирование Линукс, очень полезная книженция.
> ты так категорично заявил, что компиль глупенький
С выключенной оптимизацией компилятор как раз глупенький. Он для удобства отладки старается не класть переменные в регистры, а перечитывать их какждый раз. А вот с -O3 и без volatile пример превращается в бесконечный цикл как раз потому, что компилятор не глупенький.
>>673825
Почитай первый тредик. Большинством голосов было решено, что читать стоит. Если тебе что-то не нравится, там есть еще и C Primer Plus и ебаный hard way.
Запишу себе. Сейчас мне бы подбелку для начала осилить и все задачки из него перерешать.
Си - не тот язык, который можно выучить по туториалом. Он простой, но в нем есть множество неочевидных подводных камней. Приношу свои извинения, если мое определение хардвея тебя задело.
Ну а как его в таком случае учить и чем пример + в этом смысле лучше?
Можно конечно лезть писать на одних циклах и ифах, но это же хуйня полная.
Я могу простенькие проги писать, но чужой промышленный код на C я не понимаю, там очень много используются конструкции, о которых у меня представление в лучшем случае приблизительное.
>Большинством голосов было решено
Я не про K&R мир праху R и долгих лет K, которые достойны всяческого уважения. Я про упоротых, изучающих С в 2016.
Когда я учил язык, я читал все, что было доступно на тот момент (хотя доступно было не так много).
>>673852
Ну вот как перепишут хотя бы одну из распространенных ОС на другом языке, тогда и будем с тобой про упоротых разговаривать. А еще лучше тогда, когда embedded с сишечки перекатится.
>чужой промышленный код на C я не понимаю, там очень много используются конструкции, о которых у меня представление в лучшем случае приблизительное
Итак, 2043 год.
Виртуальная реальность процветает.
Изобретена телепортация через компьтер - между двумя экранами возникает
связь, и телепортируемый объект в цифровом виде передается по Сети адресату.
Старый, грязный подвал.
В нем живет 60-летний хакер Пупкин, до сих пор безуспешно пытающийся
выразить свой протест обществу. Изредка его навещает внук, горящий
желанием постигнуть азы давно утерянного искусства - хакерства.
- деда, а деда, а правда что раньше программисты знали ассемблер?
- да, внучек, сорок лет назад все было совсем по-другому...
вот помню спиздил я пароль на интернет у соседа - и в тюрьму угодил...
- деда, а деда, а правда что ты умеешь ворды ксорить в уме?
- да, было дело... как я ксорил ворды в 2000-м!... а как я ксорил дворды
в 2010-м!... а в 2020-м, вот это был ксор!!!!
- деда, а деда...
Внучек с дедушкой медленно шли по прекрасному зеленому парку,
мимо них проходили довольные жизнью люди...
Светило солнце, дул прохладный освежающий ветерок...
Но что-то было не так.
Вот исчез один проходящий мимо; вот пропал еще один человек где-то вдали.
Гнусный металлический голос где-то рядом картавя произнес:
"Ваше время истекло. Введите номер кредитной карточки..."
В то же мгновение свет померк и внучек с дедушкой оказались сидящими
перед загаженными экранами старинных компьютеров в одной из комнат
грязного вонючего подвала, где дед собственно и обитал.
Внучек сбросил блестящий шлем виртуальной реальности на заблеванный
и усыпанный окурками пол и подбежал к деду.
С тем явно было не все в порядке.
Старик в корчах стучался головой о старую разъебанную клавиатуру.
Внук проворно снял с того шлем и принялся откачивать...
- ненавижу, ненавижу... сквозь слезы трясся дед, злым взглядом
буравя монитор.
На экране того красовалась надпись: "Попытка несанкционированного
доступа пресечена".
В добавок из динамика донесся хриплый прокуренный смех и голос,
нечто навроде "получил свои 220 вольт, придурок? хакер, бля, недоделанный."
И тут стальная решимость появилась в старческих глазах.
Старик отключился от сети и принялся что-то писать в хексах...
Прошло два месяца.
- Смотри, внучек. Вот это - хак последнего механизма компьютерной
телепортации. Теперь все, что получают эти кретины за свои деньги,
сможем получить и мы, и - абсолютно бесплатно.
Пара нажатий на клавиши - и перед экраном компьютера материализовались
две бутылки холодной пепси-колы.
Но вышло так, что хак опять не удался. На экране появилось лицо
администратора.
- Опять ты, старпер ебучий.
Уже полгода тебя ищем, откуда ты нахаляву к сети подключаешься.
А тут еще и механизм телепортации вздумал наебать.
Ну сука, жди наряд через пол-часа...
Аааааааааааа! - взвыл от ужаса неудачливый хакер.
Глаза его быстро-быстро забегали по сторонам.
- Опять менты придут, коаксилами отпиздят. Но назад уже не повернуть.
Идти некуда.
Прокуренные желтые пальцы забегали по клавиатуре.
И через пять минут, роняя слюни, старик, с трудом распрямившись встал
и ударил кулаком по ENTERу.
В ту же секунду от удара ментовской ноги вылетела входная дверь.
- Ну что, попался, СУКА??? В комнату медленно зашли трое здоровенных
амбалов в синих формах. На рукаве у каждого эмблема - четырехцветное
развевающееся окошко и белая надпись - Microsoft.
Старик медленно расстегнул ширинку.
Достал свой сморжопившийся хакерский хуй.
И начал ссать в экран монитора....
Как позже выяснилось, последний пупкинский хак все же удался.
Все включенные в это время системы телепортации оказались в тот момент
каким-то неизвестным образом подключены к его терминалу.
И все, что попадало в экран пупкина метериализовывалось в самых разных
частях света...
Итак, на глазах охуевших ментов мощная хакерская струя била прямо в экран
и пропадала где-то за ним.
И попадала прямо в рожи несчастным перепуганным юзерам, затапливала
компьютерные залы, истинно хакерское ссанье стекало по клавиатурам и
пиджакам миллионов пользователей, погонам и фуражкам военных...
Пока один пьяный майор из службы безопасности не достал пистолет и
не выстрелил в экран.
Пуля ранила хакера в живот.
Довершили дело майкрософские ублюдки, добив деда ногами...
Вот такая вот грустная сказка.
>чужой промышленный код на C я не понимаю, там очень много используются конструкции, о которых у меня представление в лучшем случае приблизительное
Итак, 2043 год.
Виртуальная реальность процветает.
Изобретена телепортация через компьтер - между двумя экранами возникает
связь, и телепортируемый объект в цифровом виде передается по Сети адресату.
Старый, грязный подвал.
В нем живет 60-летний хакер Пупкин, до сих пор безуспешно пытающийся
выразить свой протест обществу. Изредка его навещает внук, горящий
желанием постигнуть азы давно утерянного искусства - хакерства.
- деда, а деда, а правда что раньше программисты знали ассемблер?
- да, внучек, сорок лет назад все было совсем по-другому...
вот помню спиздил я пароль на интернет у соседа - и в тюрьму угодил...
- деда, а деда, а правда что ты умеешь ворды ксорить в уме?
- да, было дело... как я ксорил ворды в 2000-м!... а как я ксорил дворды
в 2010-м!... а в 2020-м, вот это был ксор!!!!
- деда, а деда...
Внучек с дедушкой медленно шли по прекрасному зеленому парку,
мимо них проходили довольные жизнью люди...
Светило солнце, дул прохладный освежающий ветерок...
Но что-то было не так.
Вот исчез один проходящий мимо; вот пропал еще один человек где-то вдали.
Гнусный металлический голос где-то рядом картавя произнес:
"Ваше время истекло. Введите номер кредитной карточки..."
В то же мгновение свет померк и внучек с дедушкой оказались сидящими
перед загаженными экранами старинных компьютеров в одной из комнат
грязного вонючего подвала, где дед собственно и обитал.
Внучек сбросил блестящий шлем виртуальной реальности на заблеванный
и усыпанный окурками пол и подбежал к деду.
С тем явно было не все в порядке.
Старик в корчах стучался головой о старую разъебанную клавиатуру.
Внук проворно снял с того шлем и принялся откачивать...
- ненавижу, ненавижу... сквозь слезы трясся дед, злым взглядом
буравя монитор.
На экране того красовалась надпись: "Попытка несанкционированного
доступа пресечена".
В добавок из динамика донесся хриплый прокуренный смех и голос,
нечто навроде "получил свои 220 вольт, придурок? хакер, бля, недоделанный."
И тут стальная решимость появилась в старческих глазах.
Старик отключился от сети и принялся что-то писать в хексах...
Прошло два месяца.
- Смотри, внучек. Вот это - хак последнего механизма компьютерной
телепортации. Теперь все, что получают эти кретины за свои деньги,
сможем получить и мы, и - абсолютно бесплатно.
Пара нажатий на клавиши - и перед экраном компьютера материализовались
две бутылки холодной пепси-колы.
Но вышло так, что хак опять не удался. На экране появилось лицо
администратора.
- Опять ты, старпер ебучий.
Уже полгода тебя ищем, откуда ты нахаляву к сети подключаешься.
А тут еще и механизм телепортации вздумал наебать.
Ну сука, жди наряд через пол-часа...
Аааааааааааа! - взвыл от ужаса неудачливый хакер.
Глаза его быстро-быстро забегали по сторонам.
- Опять менты придут, коаксилами отпиздят. Но назад уже не повернуть.
Идти некуда.
Прокуренные желтые пальцы забегали по клавиатуре.
И через пять минут, роняя слюни, старик, с трудом распрямившись встал
и ударил кулаком по ENTERу.
В ту же секунду от удара ментовской ноги вылетела входная дверь.
- Ну что, попался, СУКА??? В комнату медленно зашли трое здоровенных
амбалов в синих формах. На рукаве у каждого эмблема - четырехцветное
развевающееся окошко и белая надпись - Microsoft.
Старик медленно расстегнул ширинку.
Достал свой сморжопившийся хакерский хуй.
И начал ссать в экран монитора....
Как позже выяснилось, последний пупкинский хак все же удался.
Все включенные в это время системы телепортации оказались в тот момент
каким-то неизвестным образом подключены к его терминалу.
И все, что попадало в экран пупкина метериализовывалось в самых разных
частях света...
Итак, на глазах охуевших ментов мощная хакерская струя била прямо в экран
и пропадала где-то за ним.
И попадала прямо в рожи несчастным перепуганным юзерам, затапливала
компьютерные залы, истинно хакерское ссанье стекало по клавиатурам и
пиджакам миллионов пользователей, погонам и фуражкам военных...
Пока один пьяный майор из службы безопасности не достал пистолет и
не выстрелил в экран.
Пуля ранила хакера в живот.
Довершили дело майкрософские ублюдки, добив деда ногами...
Вот такая вот грустная сказка.
Переусложнён и нет того изящества. Не нужен.
Вам-то может и завезли, а я тут на днях прошивку для мультиварки реверсил и никаких плюсов там не заметил.
Хочу научить Sublime Text варить кашу.
Пердолюсь с stm32 и индикатором hd44780.
Надо реализовать иерархическое меню, по типу:
1 Уй
1.3 Изда
1.3.2 Джигурда
Во время навигации по меню надо обновлять строку на индикаторе и запускать функцию которая будет чего-то делать (считывать данные с цифрового энкодера, чего-то включать/отключать и т.п.).
Как это правильно реализовать?
Посмотри, нормально ли я придумал?
Хочу сделать представление меню в виде массивов структур
typedef struct {
int StrPointer;
int Pointer;
uint8_t PointerType;
} MenuStructTypeDef;
Где,
StrPointer - указатель на строку (длина фиксирована), для вывода названия функции или дочернего подменю.
Pointer - указатель на функцию или массив.
PointerType - тип предыдущего указателя, т.е. определение чем является данный пункт меню: конечной функцией или точкой входа в подменю.
И соответственно хочу рекурсивно подобным образом заполнить все дочерние подменю, т.е. массивы.
В нулевом элементе каждого массива данные хранить не буду, запишу только его длину в каком нибудь поле структуры. (иначе не понятно до какого значения его можно обходить)
Вроде в такой реализации можно без проблем будет проходить по меню и вниз и вверх. Памяти займет не так много. И выглядеть будет менее убого, чем вложенные case/enum.
Только вот проблема: Никак не могу придумать как можно объявить данные массивы структур константами, так чтобы они попали во flash память, а не RAM? Ведь все значения полей структур всех массивов будут определены уже на момент компиляции.
> Никак не могу придумать как можно объявить данные массивы
Не выделывайся. Сделай максимально банально и просто: http://ideone.com/XVDif6 Всё константно, обходить - c проверкой .title != NULL. При переходе в подменю текущее меню пихать в какой-нибудь стек, пункт Back (если нужно) можно добавлять кодом (незачем его хранить везде). Хэндлеры у подменю - нужная штука, ибо позволяют до захода, допустим, в меню Bluetooth, проверить его наличие и сказать "Нет у меня никакого Bluetooth".
https://2ch.hk/pr/res/681348.html (М)
Нам норм. К тому же это такая аналогия: в шапке крестотреда хуева туча свистоперделок и дохуя всего, что аж блять она из монитора начинает вытекать, а у нас всё чётко, лаконично.
В последней строке первого поста ссылка на шапку.
>>681553
Ось, компилятор? Проще всего сохранить исходник с той же кодировкой, что и у консоли.
крестобляди - почти как уже сишарпобляди и джавабляди - обмазываются своей поеботой и не замечают очевидных вещей. Все правильно анон сказал - ярая аналогия по языкам.
Смотрится почти как на нормальных форумах, но всё-равно немного убого из-за уродливого выравнивания из-за рудиментарной картинки в ОПпосте.
>Ось, компилятор? Проще всего сохранить исходник с той же кодировкой, что и у консоли.
Win10 x64 VS15.
>>681934
Спасибо попробую.
Нет, но всё равно спасибо!
Проверь, что у исходника кодировка UTF-8 с BOM (она же UTF-8 with Signature). В Microsoft недавно сдались и обещали сделать распознавание без BOM по умолчанию, но это вроде в бетке еще.
>>682423
Но, тем не менее, до того, как человек узнаёт о других, безопасных функциях, а заодно и о локалях, у него будет scanf, который сломается из-за десятичного разделителя.
Нет.
ты не шаришь, тут нет выстрела
Ну всякий курл и прочие либввв.
Есть либы охуенные, забыл название.
fscanf же
Перекатывайся, слоупок.
Вы видите копию треда, сохраненную 3 апреля 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.