Это копия, сохраненная 13 мая 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 2017 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)
Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)
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/
- https://arhivach.org/thread/237852/
Шапка: http://piratepad.net/bJ1SdmkZyu
Заебись
При чем тут ассемблеры? Там этой темы не так много относительно общей темы и примеров именно на Си.
Посмотреть бы, как атаку переполнения буфера на змее реализуют.
Книга все-таки не о крекинге. А о безопасном кодинге на Си. Плюс внятно описаны криптография и сетвой кодинг.
For machine-specific weaknesses use appropriate tools like C or C++.
ANSI C.
Открываю файл 1.txt, чтобы считывать с него по строке.
file=fopen("1.txt","r");
Также открываю 2.txt для записи:
filec=fopen("2.txt", "w");
Ранее 1.txt был записан в этой же проге, если что, а потом закрыт.
Знаю кол-во строк заранее, пишу в цикле fgets(outstr, 178, file);
Размер массива outstr 180 символов, если что.
Проверяю некоторое условие (оно внешнее, от содержимого outstr не зависит).
Если оно выполняется, то
хочу записать outstr в filec:
fputs(outstr, filec);
И ничего, файл filec пуст всегда. Я в этой программе удачно заполнил 1.txt, но не могу никак заполнить filec, и в консоль ничего вывести не могу, даже если написаь fclose.
ЧЯДНТ?
Но вам проще будет ответить на общие вопросы, наверное. Речь о стандартной библиотеке, ОФК.
1. Можно ли одновременно открывать несколько файлов и переносить из одного в другой, сравнивать их и т.п.?
2. fgets где оставляет каретку после своей работы? Написано, что она считывает до первого символа след строки.
Т.е. три fgets подряд благополучно заполучат три строки? Ничего между ними вписывать не надо?
1. Можно.
2. Каретка - это про печатную машинку или консоль. Позиция в FILE остается там, где закончилось считывание. Считывание заканчивается, когда заканчивается буфер или встретится символ конца строки (в зависимости от того, что случится раньше). Позиция в нижележащем файле ОС может быть где-то дальше из за кэширования прочитанных данных во внутрененм буфере FILE. Три fgets могут прочитать три строки, а могут только одну, если она длиннее буфера.
>>935864
Выкладывай минимальный собирающийся код.
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(void)
{
...
FILE file, filec;
...
/ Благополучное заполнение файла 1.txt. Имеем массив str размером strn с числами, где strn - число строк./
fclose(file);
int strm=0;
char outstr[180];
file=fopen("1.txt","r");
filec=fopen("2.txt", "w");
for (i=0; i<=strn-1; i++)
if (str>=strm)
strm=str;
if (strm==0)
return 0;
for (i=0; i<=strn-1; i++)
{
fgets(outstr, 178, file);
if (str==strm);
fputs(outstr, filec);
}
return 0;
}
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(void)
{
...
FILE file, filec;
...
/ Благополучное заполнение файла 1.txt. Имеем массив str размером strn с числами, где strn - число строк./
fclose(file);
int strm=0;
char outstr[180];
file=fopen("1.txt","r");
filec=fopen("2.txt", "w");
for (i=0; i<=strn-1; i++)
if (str>=strm)
strm=str;
if (strm==0)
return 0;
for (i=0; i<=strn-1; i++)
{
fgets(outstr, 178, file);
if (str==strm);
fputs(outstr, filec);
}
return 0;
}
Конкретная проблема в точке с запятой тут:
> if (str==strm);
Но макаба съела звездочки наверняка, поэтому там могут быть и еще какие то проблемы.
Да, с двоеточием я обосрался. А ты уверен, что у тебя цикл работает, и строчка читается? Что ты не вышел по return чуть раньше? Если в gdb не умеешь пока, воткни printf, да побольше.
> у тебя цикл работает
Да какой же я тупой!
У меня strs занулилась в вышецикле. Ну грёбаный писец...
Заработало, спасибо, анон.
Если найдено то структуру, если нет, то null.
>оптимизации, тысячи их.
Включая такие оптимизации, как обрезание производительносит на процессорах AMD.
>Посмотреть бы, как атаку переполнения буфера на змее реализуют.
Атаку row hammering сбацали на ЖС.
Я сюда не из /hw/, я сюда из-за моих попыток написать что-то на Qt.
В конце марта амд выкатывает процессоры вдвое дешевле интеловских при той же производительности и при меньшем энергопотреблении, вылезайте из танка.
NDA-то NDA, но результаты бенчей уже в сети, и фотка охуевающих оверклокеров тоже есть.
Предзаказ - это я о том, что вот оно, уже почти свершилось, и игнорировать это не надо.
>В конце марта амд выкатывает процессоры вдвое дешевле интеловских при той же производительности и при меньшем энергопотреблении
Кроме геймеров, кому на это должно быть не похуй?
з.ы. ну или Plan9 завести
>поясни за сабж, как они дали интелу пасасать?
Скоро узнаем: >>936141
Если верить тестам и конференциям, они наконец-то дотянули однопоточную производительность. Перестали функциональные блоки урезать - Гипертрединг у них скелится лучше, чем у интела (тоже не факт, только циферки), и такого фейла, как у бульдозера (который даже в пределах физических ядер не скейлился даже близко к пропорциональности, пока обновы планировщиков не вышли, и при этом кушал больше, чем Интел с тем же числом ядер), быть тем более не может. И это при примерно вдвое меньших ценах.
С моей диванной точки зрения видится то, что Интел сам себе дал пососать: могли бы продавать процессоры по сильно меньшим ценам и задавить x86-подразделение АМД напрочь, вместо этого выставили такие цены, что АМД сможет нагнуть их по всем практическим характеристикам и ещё и заработать на этом.
Можешь почитать Анандтек:
http://www.anandtech.com/show/10578/amd-zen-microarchitecture-dual-schedulers-micro-op-cache-memory-hierarchy-revealed
http://www.anandtech.com/show/10585/unpacking-amds-zen-benchmark-is-zen-actually-2-faster-than-broadwell
http://www.anandtech.com/show/10591/amd-zen-microarchiture-part-2-extracting-instructionlevel-parallelism
>>936142
Например, конпеляющим программистам.
Интел постоянно пихали АМД палки в колёса своими финансовыми выворотами (можно вспомнить премию за неиспользовани АМД и бенчмарки времен Netburst), из-за них производительность дороже, чем могла бы быть в условиях честной борьбы. Когда ты будешь собирать новый ПК, ты сможешь взять себе процессор с вдвое большим числом ядер примерно по той же цене. Это может быть интересно очень многим - хотя бы тем, кто сейчас может позволить себе только двухъядерник, и при этом хочет плавную работу нескольких программ.
С другой стороны, с моей точки зрения проблема современных ПЭВМ не в вычислительной мощности, но это уже другая история.
> проблема современных ПЭВМ не в вычислительной мощности, но это уже другая история.
Го в /b/, там создашь и раскроешь эту тему
так хули, копитолизды не заинтересованны в улучшении продукта, их цель - агрессивная реклама. АМД малацы, Интел должен был cдохнуть еще на i286 параше
Я хочу
-полностью опенсорсный софт в рамках одной машины,
-никакого preemptive-пердолинга хотя бы на всех ядрах, кроме главного
-математически-строгие стандарты обмена без ошибок и и без всякого legacy (форматы любых данных, протоколы и т.д.) с референсным универсальным кодом, чтобы один раз и надолго,
-математически строгую оптимизацию компиляции без багов и распараллеливание кода (основанные на математической модели процессора),
-максимально простое и прозрачное сохранение состояния всех программ в хранилище (HDD или ещё куда),
-неимпераитвный язык, структура которого будет учитывать устройство современной вычислиловки и набор типичных методик работы с устройствами,
-ГУЙ с развитой самодокументацией (любой достаточно сложный ГУЙ требует прочтения мануала, нужно всю справку встроить в ГУЙ),
-IDE с развитой самодокументацией (конверсия между различными представлениями программы, предпросмотр дерева разбора, встроенный стандарт языка, средства автоматического доказательства)
-средства языка и компилятора для обнаружения ошибок вычислений без ECC и полного дубляжа вычислений, с помощью частичного дубляжа, дешёвых проверок, хранения хэшей
- изоляция костылей для поддержки разных форматов
Если у меня всё это или большая часть этого получится, я захочу написать стек софта под несколько конкретных профессий/занятий: дизайнер, маркшейдер, доярка, студент, инженер, таксист, статист и так далее, потому что без софта ни одно благое дело, которое не тащит за собой обратную совместимость, не взлетит.
Ввиду того, что никто за меня это делать не собирается, прямо сейчас я пишу то, что могу писать (на плюсах), набираюсь знаний и не живу мечтами, ведь я даже программистом не работаю.
И ещё хочу 1:1 монитор, потому что даже 16:10 задолбало. Как ни странно, джве модели есть.
>неимпераитвный язык
>ГУЙ
Поделил на ноль.
Окошки с кнопочками императивны, хоть ты упрограммируйся вконец.
>Окошки с кнопочками императивны, хоть ты упрограммируйся вконец.
Зависит от того, как это оформить. Если ввести новые концепции в язык, то можно даже Аллаха неимперативным сделать.
Что потом компилятор будет делать с этими конструкциями - разворачивать их в императивщину (процессоры императивные же) или нет - не важно.
Остальное ОК?
> Зависит от того, как это оформить.
Хоть ты усрись, нельзя. Интерфейс априори императивен, со своими новыми концепциями можешь в /mg/ уебывать, там тебя встретят как своего.
Пытаюсь в эту вашу СИ, и вот проблема.
Написал стронгли по учебнику код, который должен сравнивать введенные строки, потом печатать самую длинную, затем её же наоборот. Так вот, в любой ситуации печатается 661304 после вывода максимальной строки, переделанный в обраточку массив идет уже без чисел. Что это?
Надо в шапку походу уже добавить правило, что если кто-то хочет помощи по коду, пусть выкладывают минимально компилируемый код на какой-нибудь пастебин. А то почти каждый долбоёб либо сразу в тело поста копирует код, где макаба съедает все звёздочки, либо выкладывет СКРИНШОТ С ТЕКСТОМ. Первое я ещё могу понять, но второе... Блядь, ну нахуй вы это делаете.
sooqa, забыл почистить, спасибо. Мог бы и сам догадаться
Тi знаеш єто настолко древнея копiпаста што кажетьса што тогда энторнетов, не было:
http://rsdn.org/forum/decl/794170?tree=tree
А зачем? Экономить память в компиляторе - это какое-то непередаваемое извращение. Нет, оттайпдефать нельзя. Что единожды затайпдефано, останется тайпдефнутым до конца текущего модуля.
А перетайпдефить? У меня не экономия а немного другая ситуация. Нужно для заголовков функций затайпдефить один тип, в тупую на void, а потом поменять void на нормальную структуру.
> А перетайпдефить?
Нет, нельзя, вообще никак. Можешь препроцессором нужный вариант выбирать разве что.
А вообще, расскажи, что сделать хочешь? Если ты хочешь скрыть детали реализации, делай в хедере:
typedef struct SomeType SomeType;
а уже в .c-файле, который со структурой работает (или в приватном хедере, если .c-файлов несколько):
struct SomeType {
...
};
У меня есть файл main.c, там хедеры функций, которые принимают структуру type.
Также у меня есть файл func.h, в котором функции и эта самая структура.
Делаю:
#include "func.h" // файл со структурой type и функцией "func"
typedef type low_type;
void func(low_type type); // хедер функции func
И получаю хуй, так как сначала инклюжу файл с функциями, а потом какого-то хуя идут хедеры функций. Так нельзя.
Делаю:
void func(low_type type);
#include "func.h"
typedef type low_type;
и функция принимает в себя несуществующий тип low_type;
Хотел сделать перед функциями "typedef void low_type", а потом, заинклюдив func.h, "typedef type low_type", но так нельзя.
Единственное до чего додумался, так это просто вынести структуру в отдельный файлик func_struct.h и инклюдить его перед функциями, но это не красиво.
> main.c, там хедеры функций
> у меня есть файл func.h, в котором функции
Ты все перепутал. В .h кладут хедеры, а в .c реализацию.
func.h:
#pragma once
typedef type low_type;
void func(low_type);
func.c:
реализация func
main.c:
#include "func.h"
компиляция:
cc main.c func.c
> Ты все перепутал
Нет. В основной программе main.c это тоже .h файл. Я пишу библиотеку.
Конкретно у меня в основном .h файле лежат все хедеры и реализация половины функций из этих хедеров, а в том "func.h" лежит реализация второй половины этих функций и структурка.
Можно убрать хедеры функций из func.h в этот самый func.h, но я не хочу. У меня есть одной место, где прекрасно видно все функции и комментарии к ним. Так красиво получилось, незачем портить.
Я тут мимо походил, но разве в этой вашей няшной не действует правило - у функции моет быть одно определение и сколько угодно объявлений? Тогда я не понимаю зачем этот человек складывает определения в хэдеры, разве что чтобы потом поиметь проблем при их инклуде в два линкуемых объектника
>Хоть ты усрись, нельзя.
Это в твоём мире нельзя, а в моём - можно.
>со своими новыми концепциями можешь в /mg/ уебывать, там тебя встретят как своего.
Могу съебать, а могу и не съебать. Кстати, ты (?) сам спросил.
>императивен
аноны, нахуй вы такие пидерские слова используете?
книжн., юр. не допускающий выбора, требующий безусловного подчинения, исполнения
комп., прогр. описывающий процесс вычисления в виде последовательности команд, инструкций
вы же не петухатики
>Окошки с кнопочками императивны, хоть ты упрограммируйся вконец.
Поддержу этого анона. Программирование ГУЯ - линейные вычислительные процессы, обрабатывающие изменяемые данные. Никакой функциональностью здесь не пахнет.
>>936402
>Зависит от того, как это оформить. Если ввести новые концепции в язык, то можно даже Аллаха неимперативным сделать.
Любимая задача борщехлеба - на ровном месте создавать себе трудности, чтобы их героически преодолевать. Вместо того, чтобы комбинировать функциональный и императивный код, используя тот и другой там, где они нужны (как принято в Лиспе, Скале и других нормальных языках) - они выдумывают глупые концепции вроде монад и зависимых типов, удаляя гланды через задний проход.
При этом полноценный фреймворк НА СТРЕЛКАХ написать им так и не удалось.
> >Посмотреть бы, как атаку переполнения буфера на змее реализуют.
> Атаку row hammering сбацали на ЖС.
> Эксплойт успешно сработал на на данных системах в браузере Firefox версии 39. Эксплотируется сама уязвимость в DRAM. Эксплойт, не позволяет получить права администратора в системе .
Ну и нахуй оно нужно?
>Конкретно у меня в основном .h файле лежат все хедеры и реализация половины функций из этих хедеров
На кой ляд?
>Можно убрать хедеры функций из func.h в этот самый func.h, но я не хочу. У меня есть одной место, где прекрасно видно все функции и комментарии к ним. Так красиво получилось, незачем портить.
Съеби.
> На кой ляд?
А как иначе? Я бы вообще всё положил в этот основной .h файл, и был бы у меня проект из одного файла, но реализаций func.h может быть много. Каждая для своей платформы, например. В итоге, чтобы собрать мою либу под сперму, нужно просто заинклюдить "func_win.h". Охуенно же.
> Съеби.
Ну ти чего.
Алсо, я тут кое что вспомнил и могу оправдать эти действия: Функция func используется в основном .h файле, описывается в другом, func.h файле, но при этом должна быть static. Если шапка будет где-то в другом месте, то основной .h файл не сможет её использовать.
> 2017
> при нажатии кнопки гуй зависает пока производит вычисления
> если начать две кнопки одновременно, программа крашится
Давно во всех учебниках гуй представлен конечным автоматом, для представления которых ничего лучше фп не придумали, одни императивные мудаки лепят самописные очереди событий для самописного межтредового взаимоднйствия
В инклуде у тебя уже заинклудятся и тип и функция, зачем ты их опять описываешь?
> Ну и нахуй оно нужно?
Реализация эксплоита не позволяет получить права. А сама уязвимость потенциально позволяет ебать компьютер как угодно.
>конпеляющим программистам
Лол, у меня firefox на i5 собирается минут за 5. Максимум это в геймдеве востребована хуита будет.
int i;
int j;
} num_struct;
num _struct num;
Как мне эту структурку в одну строку заполнить? Что-то вроде num = {5, 10}; есть в сишке?
А ты попробовать сам не мог? Есть, именно так и заполняется. Если ты хочешь заполнить НЕ при инициализации, и тебе жизненно необходимо сделать это одной строкой, тогда num = (num_struct) { ... }; Алсо, при инициализации можно указывать конкретно, что куда присваивать: { .i = 10, .j = 20 };
чукча не читатель, чукча писатель
Ещё один вопрос на эту тему: Нет ничего плохого в забивании структуры нулями memset'ом? Т.е. "memset(num, 0, sizeof(num_struct));".
Нет ничего плохого. Но ты можешь сделать num = { 0 }, и компилятор сам решит, что выгодней: сделать несколько mov для маленьких структур, или заинлайнить/вызвать memset для больших.
@struct
class Petuh(val s1: CString, val s2: CString, val s3: CString)
val petuh = stackalloc[Petuh]
!petuh = new Petuh(c"Kudah", c"Pokpok", c"Kukarek")
Возможно, тебе стоит взять какой-нибудь iconv и не ебаться вручную (если задание позволяет). Что касается UTF-8, там в старших битах первого байта кодируется количество байтов в последовательности:
(b & 0x80) == 0x00: 0xxxxxxx: 7 бит текущего байта
(b & 0xe0) == 0xc0: 110xxxxx: 5 бит текущего байта и 6 бит следующего
(b & 0xf0) == 0xe0: 1110xxxx: 4 бита текущего байта и по 6 бит из двух следующих
(b & 0xf8) == 0xf0: 11110xxx: 3 бита текущего байта и по 6 бит из трех следующих
Дополнительные байты (если первый байт их требует), выглядят как 10xxxxxx, в старших битах всегда 10, чтобы можно было узнать, что это не старт очередного символа, а середина, а младшие 6 битов используются для сборки codepoint. Можешь упростить себе жизнь, выкинув последние две проверки. В однобайтовом варианте у тебя по определению будет ASCII, а в двухбайтовом, возможно, кириллица. Добавишь пару проверок диапазонов, lookup-табличку сделаешь, и будет норм.
Спасибо огромное! Я уже отчаялся. Мне говорили, что старшие биты нужно с 10 начинать, но я чет не понимал, зачем мне это. Теперь же все ясно и по полочкам.
Cаси спасиба.
Правильно ли так делать или нет?
Сейчас пишу фронтенд для сайта и стили, на сервере всё работает, как сделать, чтобы у клиента запускалось?
>ас пишу фронтенд для сайта и стили, на сервере всё работает, как сделать, чтобы у клиента запускалось?
То ли тонко, то ли толсто.
Гугли writing portable code.
Спасибо.
Notepad++ тоже не будет этого делать и другие редакторы тоже.
Только не говорм мне, что ты ручками табы и пробелы вставляешь.
Все редакторы умеют как минимум в "тупые" автоотступы. Один раз сделал отступ - на следующей строчке он будет таким же.
А, всё, отключил.
if(a > 0x09 && a < 0x10)
a = a + 0x06;
if(a > 0x19 && a < 0x20)
a = a + 0x06;
if(a > 0x29 && a < 0x30)
a = a + 0x06;
if(a > 0x39 && a < 0x40)
a = a + 0x06;
if(a > 0x49 && a < 0x50)
a = a + 0x06;
А, не, хуита какая-то у тебя
переменная "а" - тупой счётчик, считает от 00 до FF. Шестнадцатеричная система.
Нужно исключить, перескочить все НЕ десятичные комбинации. Убрать 0A,0B,0C,0D..... F9,FA.....FF.
Чтобы "а" выражалось исключительно цифрой без букв.
Ну хоть подскажите что гуглить мне, уже голову сломал.
ты наркоман, ну тебя нахуй, условие описал выше
Хотя да:
while (a < 0x100) { while ((a & 0xf0) >= 0xa0 || (a & 0x0f) >= 0x0a) { a++; } printf("%02x\n", a);
a++; }
жесть
Спасибо, анон, реально помог.
Вот так в итоге вышло:
if ((a & 0xF0) >= 0xA0 || (a & 0x0F) >= 0x0A)
a = a + 0x06;
Лол. Если сматчится первое подвыражение (при a = 0xb0, например), то твои цифры пойдут по пизде. Если уж тебе хочется именно скипать до следующего "правильного" числа, то разбей на два if, и при совпадении в старших разрядах скипай 0x60, а не 6.
Бля, я дебил *(some_struct->some_value)
А, разобрался, для этого еще плагин сверху нужен.
Спасибо, всё сделал, работает в железе идеально.
Алсо как бы вот это ещё уплотнить (пик, макакин спам-лист вставить мешает):
Все эти книги настолько старые, что уже давно обзавелись переводом. Качество хз какое.
Аналог твоего кода:
if (a % 0x10 > 0x09) a += 0x06;
Если именно "проскочить" a-f до ближайшего нуля в последнем разряде, т.е. из 0x0b надо сделать 0x10:
if (a % 0x10 > 0x09) a = (a / 0x10 + 0x01) * 0x10;
Каким образом в определении типа этой структуры используется тип PLIST_ENTRY до того, как даже определена структура? Как транслятор решает это?
http://www.nirsoft.net/kernel_struct/vista/LIST_ENTRY.html
Це ж дефайн, препроцессор подложит всё что надо.
Сам листинг довольно незамысловатый: http://pastebin.com/1vRnQ3m4
Запускаю программу, пишу строку (да что угодно), завершаю комбинацией Ctrl+C. Выдаёт что-то типа:
"Blanks: 2147344387, tabs: 0, newlines: 2.". То есть, табы и переводы строк правильно считает, а с пробелами выдаёт не то.
ЧЯДНТ?
Что ты несешь, поехавший? В Java так инициализировать нельзя.
http://ideone.com/OQUJP6
Как и в других языках с C-синтаксисом.
Да, ето так.
https://blog.cloudflare.com/incident-report-on-memory-leak-caused-by-cloudflare-parser-bug/
Байтоёбы соснули.
даже читать лень, гуглопараша не может в разработку по. и да, вебкит на крестах же.
В том-то, блять, и дело, что в Ragel багов нет, просто это императивное говно в C транслируется и безопасность у него такая же, как у C.
просто ооп питухи не могут в байтоебство
> в C транслируется и безопасность у него такая же, как у C
То есть, если бы он транслировался в нативный код процессора, виноват был бы процессор?
Почитай статью, там синтаксис такого же уровня, как и в C. Пропустили fhold - получи пизды.
>>940159
А что, он по-твоему не транслируется в нативный код? Как ты себе это представляешь? Статью прочти, неосилятор.
>>940161
Он нужен для того, чтобы любой сайт мог защититься от ДДОСа и спама без пердолинга с хостером.
> Как ты себе это представляешь?
Как делают нормальные люди - берут llvm и генерят IL, из которого генерится машинный код. Транслировать в си ненужно.
> Статью прочти, неосилятор.
Я проскроллил, какой-то говноязык, какие-то криворукие студенты.
Нет, ты выяснишь, что ты пидорас-байтоёб и ЭМБЕДЕД НИНУЖОН, СЪЁБЫВАЙ ОТСЮДА И ГОВНО СВОЁ ЗАБЕРИ
b vyjuj bynthtcyjuj ghj cdjb[ hjlcndtyybrjd^ dxfcnyjcnb ghj vfvfie
а че, пездоглазы из самсунга свой днищелесапед джерискрипт и разрабатывают как жс ембедед. движок на си, а сверху жс и все это говно в телевизор, лол.
Если спам забивает весь твой даунлинк, ты можешь хоть бочку сделать.
>>940188
>Я проскроллил, какой-то говноязык
Такая же ошибка могла быть в C.
>>940190
Это ты про то, что двачевский скрытый IP откуда-то взяли, лол. Если одмен профукал IP сайта, это его проблемы.
>>940192
>Нет, ты выяснишь, что ты пидорас-байтоёб
Прочитай следующий мой пост, там о байтах ни слова.
> Если я учу Си и собираюсь по серьёзке упарываться
То есть, ты учишь язык, но не знаешь, зачем? Имей в виду, что нормально ты начнешь писать года через три, не меньше.
> стоит ли мне гуммантираю лучше изучать электротехнику
Нет. Даже если пойдешь в эмбеддед, для начала хватит понимания самых базовых вещей, которые можно за вечер прочитать в википедии.
> где вообще Си полезен
Либы, сервисы.
> почему он круче ассемблера
Си соберется на другой архитектуре, если код писал не криворукий мудак, код читабельнее и компактнее, компилятор пишет более быстрый код, чем ты (ты можешь обогнать компилятор на маленьком куске, но ты заебешься качественно оптимизировать весь код).
> куда его можно впихнуть с натяжкой
Писать для веба неприятно. Писать гуи неудобно по сравнениню с высокоуровневыми языками. В остальных случаях никто не мешает писать на Си.
бладжд там есть квест 1.13 написать гистограмы. Я так и не понял как их делать, но в консольку вывел ">" в горизонтальную гистограмму, а с вертикальной дак вообще охуел там корячиться. Четыре дня думал, так и не понял, как эти ёбанные гистограммы вертикальные запилить, не подлкючая сторонних средств. Но в книге ничего вроде не написано вообще про сферу применения языка. Тупо приходится отовсюду выискивать где и что пишут на сях.
чаю, адекват.
> так и не понял, как эти ёбанные гистограммы вертикальные запилить
А в чем проблема? Ты не можешь посчитать на основе простейшей пропорции, стоит ли выводить в консоль заполняющий символ или проблел?
На GTK написан GIMP. Точно Си тяжко подходит для гуишек? Опыт есть в этом? Я бы попробовал (времени навалом) но если это не имеет смысла, то и знакомиться с GTK не стоит.
Да, я как-то криворуко это наделал. Вроде консолька что-то выводит, но всегда что-то непонятное вылазит. Типа массив создаётся, где каждый индекс номер слова, а элемент индекса - количество букв для гистограммы. Вроде правильно проинициализировал массив, но количество строк всегда разное и не поддаётся нужной мне логике.
http://pastebin.com/v8Zbu0aN
А сам я сейчас сижу на квесте 1.21.
http://pastebin.com/aSz4XXif
Должна делать пикрил.
Но делает пикрил2.
>>940425
Норм
А, я начинаю понимать по поводу своего 1.21. Предположение такое: каждый раз после нового getchar() место putchar() уходит в начало строки.
Или как всё обустроено?
Я вообще не могу представить, как C обрабатывает вводимый в консоль текст, как он понимает, когда надо начинать обрабатывать. Т.е. я нажал Enter, это вроде бы \n для C, ноон после Энтер начинает работать и Enter становится как EOF...
Это почему?
> каждый раз после нового getchar() место putchar() уходит в начало строки
Да не, бред какой-то
может шиндосовская кодировка энтера воспринимается как EOF. Я же наоборот не могу найти в Убунте сочетание для EOF ctrl-z работает как стоп-сигнал какой-то
>[1]+ Stopped
> игнорит
Ввод по умолчанию line-buffered. Enter тыкай после Ctrl+Z/Ctrl+D.
>>940429
Таб - это не 8 пробелов. Таб втыкает нужное количество пробелов до следующего табстопа. А табстопы располагаются на каждой 8-ой колонке. Т.е., один символ и таб - 8 знакомест, два символа и таб - тоже 8 знакомест, 8 символов и таб - 16 знакомест. От этого и пляши.
> Таб втыкает нужное количество пробелов до следующего табстопа.
никогда не любил из-за этой неопределённости табы, юзаю только пробелы
канчаю
неактуально
А,я понял. Спасибо, я просто не знал, как работает Tab.
>если это не имеет смысла, то и знакомиться с GTK не стоит.
Имеет смысл, если интересно. А так писать на С с gtk гораздо медленнее, чем на том же python или javascript. Тут тебе и хоть какая-то типизация, сегфолты, если не понимаешь как что-то работает и прочие радости.
typedef struct name {
name next;
name prev;
} name;
Как их использовать? Чтобы в next действительно лежал следующий элемент, а в prev предыдущий. Гуглом ненагуглил.
>Чтобы в next действительно лежал следующий элемент, а в prev предыдущий.
Пока сам не положишь туда указатели на то, что тебе нужно, ничего у тебя там не появится.
Если тебя это пугает, используй C++ и его std::list .
В glib есть реализации нескольких коллекций
https://developer.gnome.org/glib/stable/glib-data-types.html
Без шаблонов это боль: ОП будет кастовать gpointer во время каждого обращения.
К тому же, ОП не про двусвязный список спрашивает, а именно о том, как обращаться с этими структурами.
И теперь мой код не работает. Я не понимаю почему. В области обведённой синем происходит бесконечный цикл. Не понимаю почему. Я проверял через printfы wik и width и у меня через некоторое время wik был больше width. Но цикл продолжал работать как упёртый но глупый рабочий на зло всем.
Из-за чего так? Уже 2 часа мучаюсь над этим
http://pastebin.com/HrreXvdL
> u64 width;
> u64 height;
И ведь только в прошлом треде мы говорили о том, почему вредно копировать байтики поверх структур (и переменных). У тебя 64-битная неинициализированная переменная, ты пишешь значение в младшие 32 бита (на little-endian машине), а в старших битах что? - мусор. Если по счастливому совпадению мусора нет в width, значит, виснет во внешнем цикле из-за height. Алсо, нахуя тебе вообще 64-битные размеры изображения?
А я и не говорил про бесконечные циклы.
Очередной отсос байтослесарей. Всё через жопу.
очень громкий и высокий крик разочарования но и понимания АААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААА
Я всё понял! Почему-то мой мозг принял 64-битные числа за 4-байтные. От жеж дидько, какой я не внимательный иногда. Спасибо, анон.
очень громкий и высокий крик разочарования но и понимания АААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААА
Я всё понял! Почему-то мой мозг принял 64-битные числа за 4-байтные. От жеж дидько, какой я не внимательный иногда. Спасибо, анон.
да уже не актуально, я просто хотел у себя запустить, было интересно, откуда там мог бесконечный цикл взяться, но походу его там не было изначально
http://www.iso-9899.info/wiki/Books
— написано, что 'Learn C The Hard Way' суть негодная книжка и не стоит её на второе место в шапке вывешивать.
Негодная. Написано же - "для гуманитариев". Для нормальных людей у нас есть проверенные временем альтернативы: K&R и Прата.
void random(int mr[],int size,int min,int max)
{
srand(time(NULL));
int r, d;
d=max-min;
for (r=0;r<=size-1;r++)
mr[r]=rand()%d + min;
}
Данной функции передаётся массив, его размер, максимальное и минимальное значения элементов.
Если функцию вызвать три раза массивами разных размеров, но с одинаковыми min и max, то всё будет очень уныло, например, как на пикрил.
Что заменить, что добавить?
double random(void) { return rand() / (double) RAND_MAX; } // 0.0 .. 1.0. И дальше городи эти свои (int) (random() * d) + min. Будет слегка получше.
Ах да, srand() нужно вызывать один раз в начале программы. time() возвращает время в секундах, и если между вызовами прошло меньше секунды, то получается, что ты инициализируешь генератор одним и тем же значением, и, конечно же, получаешь одни и те же данные.
> double random(void) { return rand() / (double) RAND_MAX; }
Это что? Функция? Её перед моей random вызывать? Т.е. ей название другое дать, да?
K&R вполне подходит. Если сложно, предварительно можно Петцольда "Тайный язык информатики" навернуть.
Лол. Нет, твоя основная проблема была >>941613 в этом. А использование RAND_MAX просто дает последовательности с менее заметными корреляциями, по сравнению с использованием остатка от деления.
Лол, я оставил srand на месте, но только теперь srand(time(NULL)_rand());
Всё теперь стало довольно рандомным
>K&R вполне подходит.
Сдаётся мне, что у тебя слишком хорошее мнение о гуманитариях. Энивей, спасибо, попробую.
Я знаю лишь как на ассемблере такое сделать. Надеюсь там можно вставлять асм код.
rdtsc ;ложит в edx:eax количество тактов, которое прошло после последнего сброса процессора
mov peremennaya,eax ;в переменную с названием peremennaya ложит значение eax, которое меняется каждый такт
Правда я могу где то ошибаться, может надо [peremennaya] написать или что-то такое.
>знаю лишь как на ассемблере такое сделать
>Правда я могу где то ошибаться, может надо [peremennaya] написать или что-то такое.
>или что-то такое.
> что-то такое.
Да чего ты к нему придираешься? Необходимость писать квадратные скобки зависит от конкретного ассемблера или от чего-то такого
>Да чего ты к нему придираешься?
Я просто гуманитарий-ниасилятор, который тремя постами выше от K&R охуел. Ты не представляешь, насколько таким как мы бывает в радость технаря подъебнуть, особенно насчёт ассемблера или чего-то такого.
int var = ebat->long->name->var;
или так:
int *var = ebat->long->name->var;
Кто будет работать быстрее? Как надо делать? Надо ли делать вообще?
Ассемблерщик, а ты умеешь призывать RDRAND из процессоров >= Ivy Bridge или >=Excavator?
> chislo=((double)rand()/(double)RAND_MAX);
Рандомлю число таким способом.
Мне может вернуться единица?
ты сломал мой мозг
>Кто будет работать быстрее?
Победила дружба, оптимизирующему компилятору насрать на указатели.
Ебать ты манька.
Есть ли что пизже, если да, то в чем?
Может.
Я и пишу, прост мало ли.
Как ты додумался до такого?
Анон, как понять что ты готов ногой открывать дверб в любую вакансию, где нужны Сишники? Есть ли какой-то заметный УРВОЕНЬ?
Вот тебе три вопроса. Если на каждый ответишь без гугла - то можешь скорее всего. Если же даже вопросы вызовут WTF, то продолжай учиться.
1. Чем конвенция cdecl отличается от fastcall?
2. Дана структура struct { char a; int *b; double c; } x;
Чему равен её sizeof? Как его уменьшить?
3. В двух объектных файлах есть переменная с одним и тем же названием, в файле с main она объявлена как extern. Что произойдет при попытке собрать приложение?
Да, продолжу как учиться.
GTK+
> с main она объявлена как extern
Всмысле? Если название такое, то оно зарезервировано под функцию объявления её в других .c файлов командой extern из хидера, или я чего-то не понимаю.
> Чем конвенция ... отличается
1) Чем угодно. Может не отличаться.
> Чему равен её sizeof? Как его уменьшить?
2) Чему угодно. Удалить из нее лишние члены.
> Что произойдет при попытке собрать приложение
3) Сборка приложения.
Правильно ответил? Меня примут?
Не-а.
Правильные ответы, если кому интересно. Но лучше попытайтесь ответить сами.
1. cdecl передает аргументы на стеке в обратном порядке, fastcall - часть в регистрах, и лишь то что уже не влезет - на стеке.
2. Зависит сразу же от нескольких факторов - разрядности системы (это влияет на sizeof(int *) и размеров данных (это влияет на sizeof(double) - если CHAR_BIT != 8, то размер будет не 8). Дальше в игру включается выравнивание, его уже сами гуглите. Отключить можно через #pragma pack или в gcc через __attribute__((packed))
3. Произойдет ошибка линковки. Что-то вроде Multiple definition of ...
Вся та хуйня, тобой написанная, к языку C не имеет отношения. Ну разве что третий вопрос немного.
Вот правильный ответ.
> Произойдет ошибка линковки.
В оригинальном вопросе про инициализацию не было ни слова, а без инициализации ошибок не будет, привет фортрану.
А Питону никто не передаст привет, суки.
>3...
Сук, что за баг разума... Вроде понимаешь, что ответ такой, ибо это очевидно, но всё равно ищешь какой-то подвох.
1. Стандартная практика в сжатые сроки определять уровень знания предметной области - задавать несколько глубинных вопросов и экстраполировать полученные ответы. Выковыривать знания каждого аспекта - слишком долго.
2. Со всеми тремя вопросами я сталкивался на практике, так что имеет. Ты не представляешь, как часто люди приводят указатель на структуру к (uint8_t *), отправляют как бинарные данные, а потом удивляются, что на другой стороне ЧОТО НИТО ПРИХОДИТ.
Я про явную инициализацию. Неявную делает линкер. Или не делает (когда программа freestanding).
Ок, если не инициализировать не-нулём, то никаких ошибок линковки.
Признаю, мой косяк. Но, собственно, ответ вполне мог был бы выглядеть "если инициализируем переменные, то так, а если не инициализируем - то так". Это был бы только дополнительный плюс тебе в карму.
Скучно. Ты бы лучше спросил, что будет, если сделать так:
#include <stdio.h>
static char foo[]; int main(void) { return printf("%zu\n", sizeof(foo)); }
>fastcall
Да, но текущее архитектурное состояние нам же надо сохранить перед вызовом и после вызова восстановить. Один фиг оно, получается, на стек уйдёт. В чём профит? В обычном варианте ты внутри функции пихаешь на стек значения используемых регистров перед вызовом (push x R), чтобы их потом в конце функции со стека обратно в регистры записать (pop x R), плюс пушишь и попишь аргументы функции (push x A + pop x A). Итого (A + R) x 2 стековых инструкций.
В fastcall -- пихаешь на стек регистры, в которые запишешь аргументы (push x A), в конце функции восстанавливаешь регистры обратно (pop x A). Между делом пушишь и попишь оставшиеся аргументы на стек (push x K + pop x K). Итого (A + K) x 2 стековых инструкций. Получается, что профит в количестве инструкций будет только тогда, когда K < R, т.е. количество оставшихся аргументов (>= 0) меньше количества используемых функцией регистров.
Так?
> один фиг оно, получается, на стек уйдёт
Есть функции, которые больше ничего не вызывают (leaf functions). Во многих RISC-ах даже специально существует регистр LR, хранящий адрес возврата, чтобы вообще не трогать память и работать побыстрее. Сохранять те регистры, через которые передаются аргументы, обычно не нужно, плюс часто есть еще регистры, которые сохранять не нужно. Их можно юзать и получать неплохое ускорение на коротких функциях.
Не все регистры являются callee-saved. Если, допустим, у тебя функция одного аргумента, то он передастся в eax (или rax), ты там же в рамках регистра с ним поработаешь и через eax же вернешь. Никакого стека.
Это какой такой фасткол использует eax/rax? Кроме тех случаев, когда компилятор каждую функцию вызывает по-разному, наиболее удобным ему способом, не следуя никаким конвенциям.
У меня в памяти отложилось, что фасткол в этом плане не стандартизирован и каждый компилятор (идеологически) может реализовывать как хочет. В любом случае, я привел лишь синтетический пример.
__fastcall стандартизирован на x86-64, на x86 есть распространенный стандартный __fastcall от MS и менее популярный вариант от Borland.
Не знал, прикольно. Можно ссылочку, где об этом подробнее почитать можно?
А, значит я таки был прав. Ну и заебись тогда
Ты поехавший что ли? В стандарте си ничего нет, кроме языка. Там даже стека нет. Соглашения о вызовах стандартизируются в описании ABI процессоров.
Есть вообще профит им компилять?
Впрочем, gcc тут молчит. Я думал он лучше справляется с неинициализированными переменными.
> ref class Work
> error: 'ref' does not name a type
В студии работает, при попытке собрать с GCC получается эта хуита
Линуксоеды соснули.
Сук, мне уже пичот
Ха
Ха
Умереть и не встать.
А если по делу? Вывести-то оно выводит в консольке, а запрос ввода где?
Сложна. В документации к коделайту нужной инфы пока не нашёл
> заставить запрашивать инпут?
> запрос ввода где?
Как-то так, думаю:
getchar()
scanf()
мимо-гуманитарий
Толсто.
Но скорее всего - я не так выразился.
После кнопеляции и запуска написанного кода я всего лишь вижу консоль с надписью: Press any key to continue
А по идее - я должен ввести энное количество чисел, но увы
В шланге есть -Weverything, специально чтобы ты страдал. И analyze еще есть, стоит пользоваться периодически. И -fsanitize тоже.
> Нет. В основной программе main.c это тоже .h файл. Я пишу библиотеку.
В голос. У тебя библиотека - это кучка заголовочных файлов?
.h-only либы вполне себе существуют.
Ты ска, ты че на Луа гонишь?
Таких кастрировать надо.
Охуеваю от андроеда на тиви, ну блядь, ну ладно бы железо там было норм, но нет же, на самое вшывое и давлик прокручивает говнокод.
5 минут нахуярить на С гуй с линукса. Написали бы приложение для арча на арм, чтобы консолька, все нормально, вейланд.
Если бы не сраные приложения для телевизоров, в эти телевизоры бы продолжали пихать ртос с мгновенной загрузкой и без тормозов, а не ублюдочный линукс.
Ололо, он мне высрал три страницы ворнингов из /usr/include/cairo/cairo.h, который я использую. Причём ворнинги довольно сомнительны.
Ну я же сказал
> чтобы ты страдал
А чтобы не страдать, ворнинги для системных либ стоит выключать. Я свой код стараюсь собирать с Weverything, даже если считаю, что компилятор излишне придирается. Единственное, что выключаю для всего проекта - высер столмана -Wno-date-time[/spoile]
> ворнинги для системных либ стоит выключать.
Как? Нагуглить не смог. Впрочем, после того, как я внёс pkg-config в "``" вместо "$()" никогда не понимал этой прыщемагии, шланг уже на кайру не ругался.
>ворнинги для системных либ стоит выключать.
И да, шлангист, подскажи такую вещь. Шланг очень много ругается на unused functions, unused parameter, как отключить эти ворнинги?
Или clang, они совместимы на самом деле, а вот поехавшие ворнинги не нужны.
Эти ворнинги не стоет отключать, программа у тебя не годится, либо выпиливай функции либо используй. Доделывай.
Неиспользуемые параметры в колбеках затыкаются чем-нибудь типа: #define UNUSED_PARAM(x) ((void) (x)), а неиспользуемых функций у тебя быть не должно.
Пиздец как у меня горит со СМАРТ ТВ, которое на каждое нажатие пульта по 2 минуты реагирует.
НЕНАВИСТЬ
>>943494
Неиспользуемые функции они на будущее, ещё не реализовал части программы с ними. Тоже самое с неиспользуемыми переменными, функционал с ними просто ещё не запилен. Но зачем мне каждый раз при конпеляции видеть эту информацию? Сейчас отключу, потом включу.
Но приложения все-таки могут быть полезными. На линукс все есть, новое не сложно сделать, а вот через давлик/арт это дохуя ресурсоемко, у меня на пк столько памяти не жрет сколько на вшивом смартфоне, а у тв еще и разрешение большое.
Комп может жрать меньше 100мб с загруженой графической оболочкой. Андроид почти 300 со старта жрет.
>>943500
У моего говно-тв реагирует норм, долго реагирует именно если начать набирать номер канала. Но утубик и все остальное совершенно не работает, вообще. Только одно приложения с говноканалами кое как тащит.
А с флешки почти норм (на самом деле нет).
Хорошо не мой телик, Я бы такой не покупал, лучше взять монитор хороший и отдельно приставку с хорошим железом которую можно будет заменить когда в говно скатится, а монитор - это почти всегда на порядок лучше изображение.
Вот только почему андроид не понял.
Годные смарт тв начинаются от 3К бачей думаю, но переплачивать за смарт не знаю зачем, лучше взять панель с HDMI 2.1 DP 1.4 SuperMHL и ебатся уже только с приставками.
> Я свой код стараюсь собирать с Weverything, даже если считаю, что компилятор излишне придирается.
Кастишь unsigned int в int при, например, сложении одного с другим? Меня шланг завалил подобными претензиями, но по-моему кастинг тут выглядит плохо.
А зачем ты функции эти компилируешь?
Закоментируй, скрой макросами, вынеси в отдельный файл и убери из мейкфайла.
Компилятор ведь прав что ты муть компилируешь, убери, и компилируй что уже работает.
(int) перед выражением написать это каст? Надо явно указывать всегда, или перевести другую переменную в просто инт, так должно производительнее выйти, потому как никаких конвертаций не будет.
> (int) перед выражением написать это каст?
А что же ещё?
У меня в коде много участков с выражениями подобного типа:
a = b + c;
Что выглядит вполне няшно. А так:
a = b + (int32_t)c;
Уже начинает раздражать.
> Кастишь unsigned int в int
Ты такой кастишь, а в результате у тебя отрицательное число. Поэтому, хоть язык и не требует, лучше для себя же пометочку сделать, мол, вот кастую явно, значит, и о проблемах подумал. То же и с кастами в меньшие по размеру типы.
>Что выглядит вполне няшно. А так:
>a = b + (int32_t)c;
Не правильно пишешь, формат задается один раз перед всем выражением.
А вот int+uint вернет мусор, тут и надо указывать (int) в начале выражения один раз.
Или если int+float тоже форматировать надо в флоат.
man gcc
>А вот int+uint вернет
С float все ясно, а вот интеджеры могут прокатить и без форматирования, например если добавляем к юинту отрицательный инт и результат не отрицательный.
Поэтому лучше или один всеобъемлющий инт юзать или явно конвертировать чтобы не получить неожиданых ошибок, дебажить может быть очень трудно если пропустил.
Как быть с char и unsigned char? Строка char* скармливается конечному автомату, у которого есть потребность индексировать этим символом в массивах состояний, и отрицательные индексы ему конечно не нужны. Тут методом тыка за секунды решается, но интересно, как оно по канону.
Очевидно, что если у тебя 8-битная кодировка, то и строки unsigned char. А если 7-битная ASCII (или какой-нибудь ASCII-совместиый UTF-8, и тебе насрать на все кроме ASCII), то можно и проверить, не притащили ли лишнего в старшем бите.
unsigned юзать для ясности, конечно отрицательных значений там быть не может.
static const unsigned char - так объявляется алфавит в ядре linux.
Почему обычный char работает нормально стало интересно, он конвертируется наверно тоже.
Самое главное не сравнивай float и int или INT UINT.
return 0;
}
Почему так пишется, а не
unsigned int main(unsigned int argc, unsigned char argv[]);
Ведь количество не может быть отрицательным, и возвращать отрицательный код ошибки незачем и сами строки по природе из unsigned char состоят, зачем тогда по другому принято?
Было бы гораздо проще вместо unsigned int uint писать.
> Почему так пишется
Потому что давным давно символы были 7-битными. Отрицательный код ошибки удобен (чтобы отличать невырный синтаксис аргументов от ошибок выполнения полезной части программы, например). А вот size_t argc был бы к месту, но... обратная совместимость.
Ну очень уш долго писать, uint заебись, я макросом заменяю, но выглядит как костыль, вот бы дефолт таким был.
Вектор - это последовательность элементов, массив. В Си массивы есть. argv - это массив указателей на char.
>>943620
Если тебе сложно написать два слова, пиши только unsigned. Во-вторых, товарищ Шахиджанян ждет тебя. Или нормальный IDE. В-третьих, макросы для типов зло, используй typedef.
Это не массив а указатель на массив, значения переданые не копируются, а ты получаешь только указатель, тоесть ты можешь переопределить его внутри функции.
Аяаяй такгого не знать.
>>943622
uint короче ведь. typedef не уверен что лучше, макроса в программе уже не будет, а typedef уже в программе обрабатывается, лишние затраты, всегда проигрывал с манек брезгующих #define для констант, это ведь самая настоящая константа hardcoded в програмку, а не определяемая при исполнении с выделением памяти.
Если уж придираться, то указатель на массив имеет типа "указатель на массив". А массивы в аргументах функции неявно преобразуются к указателю на первый элемент этого массива.
static void foo(int *x) {}
int array[1];
foo(&array);
Собери с -Wall и прочитай сообщение компилятора.
prog.c:20:17: error: passing argument 2 of ‘not_main’ from incompatible pointer type [-Werror=incompatible-
уходи
> всегда проигрывал с манек брезгующих #define для констант, это ведь самая настоящая константа hardcoded в програмку, а не определяемая при исполнении с выделением памяти.
Ебать дебил.
А что не так? const int a = 3 выделяет память, компилятору нужно ее читать. Удаляется такая "константа" только с -flto.
Просто интересно, а по каким причинам нормальный компилятор не подставит значения константы в местах использования константной переменной?
означает вектор, но векторов в C нет, это массив argv ты обращае
>>943631
Чем дефайн плох маньк?
>>943660
Он не подставит значения манька тупая, const можно задать во время выполнения. А дефайн это впечатано в код программы.
Попробуй
int s;
scanf("%d",s);
const int d=s;
printf("%d",d);
Это такипеременная которую нельзя менять.
У тебя там какой-то манямирочек, от const можно передать поинтер, от дефайна нельзя.
> Алсо, память все равно выделится.
Да похуй, хоть 100 раз. Никакого "компилятору нужно ее читать" нет и это главное.
>>943671
Научись следить за ходом обсуждения, прежде чем влезать, а пока иди нахуй.
>читать
Если знаешь значение константы зарание то #define как правило лучшее решение.
const же совсем не для того, и конст будет иметь свою ячейку в памяти.
>#define как правило лучшее решение.
Может быть и так, но у многих на препроцессор категорическая аллергия - и на то есть существенные причины.
Это следует понимать, а не быть неполноценным аутистом вроде тебя.
У многих - это у тебя лично?
Во всех сишных проектах, с которыми мне довелось работать - везде так или иначе использовался предпроцессор.
> >многих на препроцессор категорическая аллергия
>везде так или иначе использовался предпроцессор.
Это совершенно ортогональные утверждения.
А ведь ты и правда туповатый аутист, плохо быть тобой.
void main()
{
int a, i, x1=0, cnt=0, summ=0;
printf("Vvedite luboe desyatichnoe chislo:");
scanf("%d", &a);
for (i=1; i<=a-1; i++)
{
x1=i;
if (a%x1==0)
summ+=i;
}
printf("summ=%d\n", summ);
if (a==summ) printf("Sovershennoe chislo");
else printf("Ne sovershennoe chislo");
}
Для начала сделай так чтобы твой говнокод меньше походил на говно и больше на код.
А теперь нахуй иди, дебил обосранный.
Для кого шапка PR написана ? Ссылку на ебучую песочницу делай, а не гавнокод вставляй.
Хочу сделать тоже самое, но теперь на си/си++. Читал, что в крестах есть std::vector, но не уверен, что это то, что мне нужно.
1. Мне нужно хранить 2d вектора. Их будет очень много. Миллионы штук.
2. Отсортировать их в лексикографическом порядоке.
3. Подсчитать число уникальных векторов.
Больше ничего делать с ними не нужно.
Есть ли уже готовые инструменты в стандартной библиотеке для этого?
Алсо могу рассматривать только элементы языка по стандартам C89 и C++03 максимум. Т.к. компилятор будет MSVC 2010. И изменить это нельзя.
Вектор в плюсах - это одномерный массив. Что такое "2d вектор"? Это матрица?
>1. Мне нужно хранить 2d вектора. Их будет очень много. Миллионы штук.
std::vector<std::vector<std::vector<int>>> или что там у тебя вместо int
Это будет твоё хранилице всех матриц.
>2. Отсортировать их в лексикографическом порядоке.
std::sort, тебе нужно лишь написать функцию сравнения двух матриц.
>3. Подсчитать число уникальных векторов.
Сравниваешь каждую пару соседних векторов в отсортированном массиве с помощью уже написанной функции и удаляешь одинаковые.
Нахуй сишнику знание fastcall-a?
>Что такое "2d вектор"? Это матрица?
Вектор в евклидовом пространстве размерности 2 (плоскости). В обычном школьном смысле.
Закодировать его нужно через координаты по осям x и y.
1. За функцией __cdecl стек чистит caller, в __fastcall некоторые аргументы передаются через регистры.
2. Выравнивание, наверное, на double, поэтому sizeof будет 3 * sizeof(double). Или char будет выровнен на размер указателя, а затем будет лежать double.
3. Хуй знает.
все работает. я не понимаю как вывести помимо числа совершенное оно или нет, его делители все
Клади по ходу вычисления делители в массив или делай повторно тот же самый цикл, добавив внутрь if printf делителя.
Как и случаем ранее.
Видишь ли, использовать макроопределения для заранее известных констант - это классическое и повсеместно используемое решение, и на то действительно есть существенные причины. Вне зависимости от чьей-либо (твоей прим. авт.) аллергии.
>препроцессор с - мерзостный высер от дегенератов для дегенератов (тебя)
>использовать макроопределения для заранее известных констант - это классическое и повсеместно используемое решение
Опять же - совершенно ортогональные и истинные утверждения.
Алсо логически более правильно использовать enum для связанных параметров (список состояний, например), а не объявлять через него любую целочисленную константу, попавшую в исходный код.
Не стоит вскрывать, дурачок.
Сап, пр, помоги нюфагу, есть файл с числами, считываю из него числа в массив и вывожу его во второй, все бы ничего, да только считывается только первая строка файла, как заставить цикл переходить и на вторую строку?
Ты считал k + 1 (0..k) элементов из файла, а пишешь k (0..k-1). Алсо, закрой file2.
Во-первых, никто не мешает тебе написать const register int = MY_DEFINE там, где это требуется. Макроопределения вообще удобнее тем, что их можно легко расшарить, а в случае с константными переменными - это уже либо static, либо extern. К слову, объявлять регистровые переменные в global scope - это как раз не самая популярная практика, и не все компиляторы это одобряют.
Во-вторых, если тебе нужно экономить на спичках, то не повод ли это отказаться от C и посмотреть в сторону ассемблера?
Почему там два лишних? Если считалось, допустим, 6 символов, то k = 5 (0..5). Их и выводим в цикле for (i = 0; i <= k; i++).
Действительно, это я тупой.
>Во-вторых, если тебе нужно экономить на спичках, то не повод ли это отказаться от C и посмотреть в сторону ассемблера?
Вот это-то я, блядь, и хотел сказать. Если так сильно жалко память, что готов пожертвовать даже скоупингом имён или писать undef, нахрен писать на C?
Сортировка данных, из файла считывать и сортировать, для этого и массивы
Сделал таблицу для квадратов и кубов числа но она съезжает в бок когда число становится больше. Как записать чтобы число выдавало справа налево?
http://pastebin.com/kvkkDLUs
printf возвращает число символов, которое он вывел. Делаешь так: отдельно печатаешь числа и отдельно печатаешь пробелы. Напечатал число - проверил число символом - добилдо нужного числа символов пробелами.
hello_ref DW -1
hello_len DW 11
hell_data DB "hello world", 0
В принципе возможно сделать без спецефических для компилятора хаков?
Тебе нужно хранить длину вместе со строкой?
struct
{
size_t dlinnnnnnna;
char pointer string[];
}
Вроде в твиттeре кто-то постил прикола ради давно еще, но это не точно, помогите плз найти
Благодарю.
>>944572
Для унификации же.
Похоже на параною с моей стороны, но всё ж успокойте меня:
Для ro строк использую структру {int rc; int len; const char data[];}, ну что бы её
в неизменяемую секцию ложило, для rw - {int rc; int len; char data[];}.
Тут ведь гарантирутся их эквивалентность? Компилятор ничего не соптимизирует?
Лол.
Короче, строковые литералы компилятор всегда суёт в RO-секцию и тип у них const char[<длина>], поэтому присваивать их можно только указателям на const char.
К структурам это не имеет никакого отношения.
>
>К структурам это не имеет никакого отношения.
Ну, кроме упомянутого в предыдущем предложении присваивания. Нормальный компилятор не даст присваивать указателю на char. Ну или по крайней мере прокукарекает warning про ISO C forbids blah-blah-blah...
Это уже стало нормой?
Книжки есть, но по MFC даже в ютубе оч мало информации
А ты думаешь, тут любят коллекционировать баги гцц? Могу тебе предложить какой-нибудь int main = 0xc3; но это явно не то.
Как бута штото плахое :^)
это даже не то что бы баг, скорее undefined behavior там был, мне кажется
Не MFC протухла, а все руководства и книги по ней
Хотя и MFC уже пахнет говном из привокзального сортира. Но тогда на чём мне пилить? Qt?
> Qt
да, ну или .net если ты аутист
> все руководства и книги по ней
mfc было тухлым изначально, даже пакистанские говноеды из мелкософта это признавали, так что книги актуальны до сих пор
мимо winapi->mfc->qt господин
>Qt
Там уже давно C++ не пахнет. Можно все на веб стаке или qml лабать, что большинство крупных контор (близзард например) и делают
>Там уже давно C++ не пахнет. Можно все на веб стаке или qml лабать
А можно и на плюсах тоже, юзать куэмэль не заставляют.
Только Qt-говно что на C++, что на QML одинаково тормозит, в отличие от MFC, в котором хоть и абсракции, но хотя бы ничего не лагает на пустом месте.
>mfc было тухлым изначально
аргументировать ты конечно не сможешь
как и все кукареки в интернетах
Так, может на WinAPI всё и делать?
>хоть и абсракции
хуякции, и вот ему тоже полбу >>944955
в mfc тебе придется жрать солянку из winapi и ооп
Дело в том, что я не крупная контора.
Солянка солянкой, зато всё автоматизировано
проверяй за щекой
скинул в личку, проверяй
>читал туториалы когда был ньюфагом
Проиграл. Сдаётся мне, ты просто идиот, учитывая что в стандартах практически нихуя не меняется.
Да. Но я уже понял, что сделал не так, и как тут с чем работать.
В ближайшем будущем попробую
Прата из шапки, потом стандарт.
тоже поначалу искал подвох, но потом понял, что всё-таки ответ на поверхности
Попердоль в чем-нибудь другом
Где можно посмотреть реализацию? В glibc нихуя не понятно.
Ответ тот же.
>>946180
>Где можно посмотреть реализацию?
Я бы погуглил вместо тебя, но не буду.
Знаю, что 1) Есть DMA. 2) есть специальные инструкции.
> Ответ тот же.
Лол, она может переместить даже когда я не требую больше памяти из кучи? Как так-то? ANSI C
>Лол, она может переместить даже когда я не требую больше памяти из кучи?
Да.
>>946321
->>>>> >>931827 (OP)
И хуй с ним
Я лично считаю c++ мем языком из-за его плохого дизайна.
В язык просто накидали рандомных фич для решения непонятно каких проблем.
Вместо дженериков эти шаблоны, которые "решают" две проблемы одновременно. Но они хуже джавовских/растовских дженериков и в метопрограммировании мягко говоря сосут
Создаешь C++ проект, добавляешь файлы с расширением .c, пишешь. Кукаретиков не слушай, они даже не пробовали.
>>946180
Да, memset забивает циклом память. В общем случае выбираются инструкции с операндами "пожирнее" (SSE c 128-битными, например), а адреса, не подходящие для этих инструкций (невыровненные начало и хвост буфера), заполняются с помощью инструкций с меньшим количеством операндов.
>>946335
> напомните, malloc по стандарту выдаёт выравнивание к double?
Выдает адрес с выравниванием, подходящим для любого нативного типа. Если именно double требует наибольшего выравнивания, то да.
По стандарту. Это сделано для того, чтобы программа могла уплотнять выделенные фрагменты памяти.
Не надо ничего проверять, просто индексировать надо оффсетами, а не указателями. ОБЫЧНО адрес выделенной области тебе неинтенесен.
Бля как выделить гигабайт памяти? Пробовал и через new и через malloc нихуя не понимаю, не могу выделить нихуя, я вобще хз как так.
> Не надо ничего проверять
А что ты делаешь, когда realloc() NULL возвраащает?
>>946457
А у тебя он есть? Попробуй mmap().
> Те смотрю в диспетчере 0 эффекта
Что ты в диспетчере смотришь? Я так понимаю, это винда, в винде десяток колонок на тему памяти. Алсо, настоящую память тебе дают по мере использования - попробуй забить свой гиг единичками (не нулями!).
Один вопрос WHAT THE FUCK
1) На стеке ты можешь выделить не больше нескольких мегабайт.
2) Целочисленные константы по умолчанию int, этот int переполняется при умножении. Добавь к любому числу в строчке с size суффикс ULL (unsigned long long).
Это копия, сохраненная 13 мая 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.