Это копия, сохраненная 12 мая 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Лабы идут на хуй.
"Как мне сделать Х на чистых крестах без библиотек" идут на хуй.
Все идут на хуй.
Предыдущий: >>448310
https://ololoepepe.me/board/pr
https://github.com/ololoepepe/ololord
Чейнджлог с прошлого раза (оптимизация):
+ Информация о файлах (картинках) теперь хранится в базе (да, раньше в файле хранилась, потому что изначально не предусмотрел и было лень переносить посты из старой базы в новую).
+ Ссылки на посты теперь хранятся в отдельной таблице, что существенно увеличивает скорость их добавления и особенно удаления (раньше при удалении приходилось читать и записывать каждый пост).
+ Добавил поле "userData" в таблицу "posts" - дополнительные данные для нестандартных досок. Раньше приходилось извращаться с запихиванием, например, в поле "subject", то есть жутчайший говнокод.
+ Проверка капчи и все операции с файлами (сохранение и создание превью) теперь происходят до начала транзакции БД, чтобы не вызывать длительной блокировки.
+ Удаление файлов происходит после завершения транзакции, что, как и в предыдущем пункте, снижает длительность блокировки, а также не приводит к преждевременному удалению файлов, если вдруг транзакция откатится.
+ Файлы превью при откате транзакции теперь также удаляются (раньше не удалялись).
Прочие мелочи:
+ Для файлов без расширения оно автоматически выбирается на основе MIME-типа и добавляется к имени.
+ Теперь отображается дата и время последнего редактирования поста. К черновикам не относится (пока пост в статусе черновика, его можно сколько угодно редактировать, эта шняга не появится). Сделано, по сути, для того, чтобы показывать, когда мочератор/админ злоупотребляет полномочиями, чтобы без повода все подряд не редактировал.
+ Забаненные IP, а также IP, запросы с которых не логгируются, теперь задаются в виде диапазона (192.168.0.1-192.168.0.255), а не wildcard'ом, как раньше.
+ Исправлено отображение трипкода (а то он даже при включенной галочке не отображался, может это и к лучшему было, лол).
И еще (хоть к движку это и не относится): отключил форму поиска, а то, говорят, у некоторых страница не отображалась, пока эта сраная форма не прогрузится (что странно, ведь у меня то отображалась).
https://ololoepepe.me/board/pr
https://github.com/ololoepepe/ololord
Чейнджлог с прошлого раза (оптимизация):
+ Информация о файлах (картинках) теперь хранится в базе (да, раньше в файле хранилась, потому что изначально не предусмотрел и было лень переносить посты из старой базы в новую).
+ Ссылки на посты теперь хранятся в отдельной таблице, что существенно увеличивает скорость их добавления и особенно удаления (раньше при удалении приходилось читать и записывать каждый пост).
+ Добавил поле "userData" в таблицу "posts" - дополнительные данные для нестандартных досок. Раньше приходилось извращаться с запихиванием, например, в поле "subject", то есть жутчайший говнокод.
+ Проверка капчи и все операции с файлами (сохранение и создание превью) теперь происходят до начала транзакции БД, чтобы не вызывать длительной блокировки.
+ Удаление файлов происходит после завершения транзакции, что, как и в предыдущем пункте, снижает длительность блокировки, а также не приводит к преждевременному удалению файлов, если вдруг транзакция откатится.
+ Файлы превью при откате транзакции теперь также удаляются (раньше не удалялись).
Прочие мелочи:
+ Для файлов без расширения оно автоматически выбирается на основе MIME-типа и добавляется к имени.
+ Теперь отображается дата и время последнего редактирования поста. К черновикам не относится (пока пост в статусе черновика, его можно сколько угодно редактировать, эта шняга не появится). Сделано, по сути, для того, чтобы показывать, когда мочератор/админ злоупотребляет полномочиями, чтобы без повода все подряд не редактировал.
+ Забаненные IP, а также IP, запросы с которых не логгируются, теперь задаются в виде диапазона (192.168.0.1-192.168.0.255), а не wildcard'ом, как раньше.
+ Исправлено отображение трипкода (а то он даже при включенной галочке не отображался, может это и к лучшему было, лол).
И еще (хоть к движку это и не относится): отключил форму поиска, а то, говорят, у некоторых страница не отображалась, пока эта сраная форма не прогрузится (что странно, ведь у меня то отображалась).
Что нужно изучить, чтобы начать работать программистом на плюсах?
Я так понимаю, изучить книжку "Лекции и упражнения", автор Прата, потом изучить STL, потом изучить фреймворк Qt. Правильный алгоритм действий?
В целом да, еще неплохо бы изучить предметную область. Ну и как правило Qt и STL вместе не используются. Еще boost посмотри. Все зависит от конкретной конторы и конкрртной задачи.
Пиздос там капча.
Определить високосный год или нет. Я хз, как это будет на с/с++. Погуглил стандартные функции работты со временем и вляпался в какие-то указатели из буста и прочих извращей.
Крч, идите нахуй, русафобы.
Я что такое подозревал, но хотел прост в одну строчку узнать кол-во дней в году, если 366, то високосный.
Спасибо.
bool leapyear(const int y)
{
if (y % 4 != 0) return false;
if (y % 100 != 0 || y % 400 == 0) return true;
return false;
}
Может, быдлокод, зато более читаемо однострочник.
или так (что одно и то же):
bool leapyear(const int y)
{
if (y % 4 != 0) return false;
return y % 100 != 0 || y % 400 == 0;
}
Хотя уже менее читаемо.
Охуительный тред.
http://ideone.com/lfA317
Почему 9, а не -7? Да, я специально спрашиваю именно про int % unsigned int.
Где там эта картинка с розовым фоном с подписями в духе "потому что мы любим обратную совместимость"?
Ну просто если рассуждать по аналогии:
int a, b;
double ddd;
//double d = a/b ddd; //a/b information loss
double d = ddd a/b; //OK
Всё приводится к даблу. Почему a % b не приводит к типу a?
Вместо @ умножение.
int a, b;
double ddd;
//double d = a/b @ ddd; //a/b information loss
double d = ddd @ a/b; //OK
http://www.learncpp.com/cpp-tutorial/44-type-conversion-and-casting/
короче ансигнед имеет более высокий приоритет
Структуру пробовал мемсетом инициировать в 0, выносил из локального скоупа, не помогает.
И что? Я референс читал, не вижу ошибок.
Вот кусок кода с мэйктаймом, всё до него выполняется нормально
https://ideone.com/AW67CO
stime работает, но что-то тут нечисто
теперь всё работает, оказывается мне виртуалбокс своё время пихал насильно, пришлось придушить
>Лекции и упражнения", автор Прата
В этой книги есть какие-нибудь интересные примеры? У меня просто дико жопу рвет сейчас. Я, вроде бы, знаю основы языка, но сука, не могу их нормально использовать в проектах.
Пилю проект. Взял boost. Просто охуеваю от непонятности некоторых частей. Половина кода копипастой, ибо поставил себе определенный дедлайн.
Дико печет, что, вроде бы, знаю, но на деле нихуя не знаю. Хули делать, я уже волосы их жопы выдергивать начинаю.
>Я, вроде бы, знаю основы языка, но сука, не могу их нормально использовать в проектах.
Потому что надо начинать с джавы. Там целый день сидишь, капчу двачуешь, а у тебя пяток классов написано на пустом месте.
Но я хочу быть охуенным. Java не так охуенно, как кресты.
> 2015
> лайки в /b
> до сих пор не починили [code]
Если ты под андроид пишешь что-то графически тяжелое.
а че за методички?
Например, чтоб дописывать чары в строку, заданную поинтером на чар.
Мало анальных извращений. Хочу самописный класс-контейнер "текст", который работает по принципу адресной арифметики и может дополняться на ходу, поэтому, естественно, просто адресная арифметика мне не подходит.
Тогда только прямая работа с виртуальной памятью, только это троллейбус из буханки. Проще сделать что-то вроде deque - выделять память крупными кусками, хранить их список в векторе, и поверх этого приделать индексацию.
Ну я бы хотел, чтобы использовать их было как можно проще, т.е. без всяких конверсий в вызове. Может там синтаксис какой есть. Но, так понимаю, без перегрузки такого сделать не получится, поэтому перегрузить каждую функцию и вызвать из нее оригинальную с to_string кажется уже не такой плохой идеей.
Либо to_string, либо перегрузка. Больше никак. Можно еще, конечно, сделать одну перегруженную функцию, void universal(std::string s, Action a); где enum Action { Print, MsgBox, Fatal, Assert }; и внутри вызывать to_string и нужную функцию, но это тупо. Типа такого:
if (!cool) universal(100500, Fatal);
else universal(9000.1, MsgBox);
Но это, повторюсь, тупо и костыльно.
#include <cstdint>
#include <cstdlib>
std::basic_ofstream<uint8_t> ost(filename, std::ios::binary);
Хочу записать в filename файл n штук байтов, состоящих из нулей. unsigned int n на этапе компиляции неизвестно. Как это сделать без создания массива
uint8_t@ n_zeros = (uint8_t@)std::calloc(n);
ost.write(n_zeros, n);
А сразу через ost.write() напрямую нули в файл писать? Или через какой-то другой метод?
Ну блядь, либо обоссыте, либо скажите, что многого хочу.
Напиши темплейтную функцию:
template<class T>
void log( const T& item ) {
print( to_string( item ) );
}
template<>
void log<std::string>( const std::string& item ) {
print( item );
}
>binary
Ты тупой совсем? of << 'a' это тоже самое, что char a='a'; of.write( &a, 1 );
>Стринг ещё какой-то, он-то тут при чём?
При том, что to_string<string> не определен
>Ничё не понял
Ты ведь в ПТУ учишься, я угадал?
Use google.
>When we move from character-oriented I/O to binary I/O, we give up our usual >> and << operators.
Стандарт лучше читай, а не Страуса
http://stackoverflow.com/questions/1278259/c-fstream-and-operators-with-binary-data
Скопипастил со старого издания, и не посмотрел, что стандарт поменялся. Был пару месяцев назад тред, где анон бугуртил с ошибок в его книгах.
как сделать выборочное закрытие процессов
при нажатии на 4 закрывается calc.exe, 5 - mspaint.exe и тд
>A handle to the job whose processes will be >terminated. The CreateJobObject or OpenJobObject >function returns this handle. This handle must have >the JOB_OBJECT_TERMINATE access right.
И что происходит?
>Русских людей обижают! Ну ничего, братушки, скоро мы вас ОСВОБОДИМ.
никто меня не обижает, скажу больше я свободно говорю на русском в Харькове и Мариуполе
просто документация должна быть на государственном языке
лекции тоже на русском
Да всё, закрыли тему. Пошутили и хватит. Должен же кто-то бампать, а то опять уплывёт к хуям на третью страницу.
Лучше расскажите про 15 Студию, например, в контексте поддержки стандарта. Постоянные выражения будут НАКАНЕЦТА. А что ещё?
Погуглил, но так ничего и не понял.
error LNK2019: unresolved external symbol...
Ругается только на winapi-шные функции. Проблема появилась после того как запихнул куски говна кода на нормальном С++ в проект CLR.
Подключи библиотеки необходимые. В справке каждой функции указана либа. В свойствах проекта линкера есть поле, куда заносишь имена этих .lib файлов. Если они валяются по нестандартным путям, прописываешь пути в соответствующем поле.
Почти что нихуя. Говно.
user32.lib подключи в linker->input->additional deps
По кочану. Шаблоны в крестах - не дженерики, как в жабе. Это нечто уровня макросов, если не вдаваться в подробности.
Используй QVariant или аналоги, ну или union, но с этим осторожнее.
>Но почему?
Потому что для компилятора это абсолютно разные классы.
>И как в таком случае быть?
Например, хранить в векторе указатели на экземпляры классов. Или использовать что-то вроде Boost.Variant.
Нет
Можешь использовать Type Erasure, хотя костыль получится. А что за задача?
http://habrahabr.ru/post/207294/
Только если умные
Решил обмазаться этим вашим QT, в котором есть все, даже небо, даже аллах. Подскажите годной литературы, а то я открыл qt'шные примеры и заблудился.
Двощу. Мой воображаемый дедлайн к 9 числу должен заделать Gui приложения. Пока не знаю с чего даже начать.
С доки по QObject
открой кутешные туториалы
чего ты там нахуярил то столько, блядь?
нужно ж два раута: создать пост и получить новые посты аяксом
html с тредом в большинстве вакаб сохраняется в файл и дальше уже статически раздается
итого:
- fastcgi либа (или можно охуеть и сделать просто cgi борду повесить демоном и общаться с ней как-нибудь). если кровь из носу хочется хостить самому (но зачем) - mongoose
- база из одной таблицы (пикчи хранить в файловой системе). даже если руками делать нуждно то btree и файлмаппинг в память (у нас же не банк, упадет и хуй с ним). ну или взять какой-нибудь leveldb, а лучше вообще sqlite
- 2 простых как палка раута + сколько влезет раутов для админки с какой угодно логикой
- (опционально) SSI или ручной сервинг для собственной капчи или csrf токена
- шаблоны, что одинакого рендерятся и на клиенте и на сервере (mustache подойдет, логики в бордовском шаблоне ноль). для подсветки синтаксиса проще на клиенте highlightjs или prism взять.
- 2 кило жс кода для подгрузки и расставления новых ссылок
короче, мне кажется, ты, браток, перемудрил
и я бы не назвал борду lightweight:
- судя по тому, что нулевая приходит 450мс ты рендеришь все заново каждый раз
- иконки приходят по одной, 60-70мс на каждую
>fastcgi либа
Нахуя? Чем тебе отдельное приложение не угодило? VPS и вперед, если охота платить бабки за сайт, которым никто не пользуется. Мне вот не охота, поэтому у меня и хостится.
>база из одной таблицы
Я посмотрю, как ты будешь заново отрендеривать ссылки на посты при их удалении с такой архитектурой. Фичу с хешами файлов и подавно так не реализовать.
>sqlite
И так. Нахуй тут что-то другое?
>2 простых как палка раута
Редактирование поста, удаление поста, получение новых постов, проверка хеша файла и так далее.
>SSI
Чет нихуя не понял, зачем мне это.
>mustache
Лишний скрипт - лишний вес. Увы. А так мне идея очень понравилась.
>проще на клиенте highlightjs или prism взять
Это сразу на хуй. Во-первых, см. предыдущий пункт, во-вторых это не задача клиента. Ты еще бы предложил вакабамарк на клиенте рендерить.
>2 кило жс кода для подгрузки и расставления новых ссылок
Присутствует. В два кило, правда, без дополнительных зависимостей и без минификации не сделать.
>приходит 450мс
Проблемы клаудфлары, я полагаю.
>рендеришь все заново каждый раз
Сама страница да, рендерится. Но каждый отдельный пост по большей части кеширован (не кешируется только то, что надо локализовать, дата/время, например, или названия кнопок).
>иконки приходят по одной, 60-70мс на каждую
Опять же, проблемы клаудфлары, скорее всего. Оно там у них в кеше, что якобы должно прибавлять скорости. Наверное отключу на хуй это говно. Так то статика у меня в памяти кешируется, не должно так долго отдаваться.
Как я и говорил, проблемы флары, чтоб у них понос случился. И отчасти твои проблемы тоже, судя по всему.
И картинки, фор тех джастис. Так что дело во фларе и в твоем р(о)утинге до него.
А тем временем:
+ Исправлено сообщение "Вам не надо вводить капчу...". Теперь после очередного поста обновляется.
+ Добавлена поддержка видео форматов .mp4 и .ogg (.ogv).
+ Реализована поддержка аудио (.mp3, .ogg, .wav).
+ Для всех поддерживаемых типов файлов добавлены иконки в поле выбора файла.
+ Загрузку файлов из треда теперь можно прерывать.
+ Количество постов без ввода капчи теперь сохраняется после перезапуска сервера.
+ Добавлена новая разметка (для тех кому не нравятся bbCode'ы). https://ololoepepe.me/board/pr/thread/15.html#165
+ Реализован свой поиск, без использования гугло-апи. Пикрелейтед.
Щито поделать, название нормальное придумать не могу, а говняное не хочу. Ну а без названия и домен не подобрать.
Конечно. Я вообще думал прикупить пикрелейтед, но чет в сомнениях, не наебалово ли, они ж недоступны для продажи были. Надо у других провайдеров еще посмотреть. Да и вообще, из доброй памяти не хочу трогать. Но все равно очень заманчиво.
cout<<12;
sleep(1000);
и
cout << 13'
sleep(1213);
как сделать возможным одновременное выполнение сего?
Мультитрединг гугли.
std::thread
void task1() {std::cout << "ya ebal"; sleep(9000);}
void task2() {std::cout << "tvoyu mamku"; sleep(100500);}
QtConcurrent::run(&task1);
QtConcurrent::run(&task2);
а я и не против :3
Ехал thread через thread,
Видит thread в thread thread.
Сунул thread thread в thread,
Thread за thread thread thread.
> Чем тебе отдельное приложение не угодило?
нахуя смешивать две ортогональные вещи?
захотел прямо в процессе сокет держать, ну так возьми mongoose, он из двух файлов состоит и простой как пробка
> VPS и вперед, если охота платить бабки за сайт, которым никто не пользуется. Мне вот не охота, поэтому у меня и хостится.
то есть ты не осилил поднять nginx с fastcgi модулем на своей убунте? серьезно?
> Я посмотрю, как ты будешь заново отрендеривать ссылки на посты при их удалении с такой архитектурой. Фичу с хешами файлов и подавно так не реализовать.
лолшто?
ты же все равно вытаскиваешь весь тред из базы. у тебя посты для всех айдишников в треде, в шаблоне и так подсвечивать ">>id", а посты из других тредов подтягиваются аяксом, т.к. редкость и нинужно
> Редактирование поста, удаление поста, получение новых постов, проверка хеша файла и так далее.
просто прикинь как бы ты это все написал на каких-нибудь руби в синатре, это был бы один файлик на 100-200 строк, 50% функциональности борды, а то и больше. на крестах можно придется писать больше, в любом случае, но не на порядки
> Лишний скрипт - лишний вес.
> отправляет на клиент не минимизированный html и js, а картинки 16х16 вообще одной
> mustache.min.js 8.835 kb
лол
> во-вторых это не задача клиента
охлол, хватит жить в 98ом, клиент рендерит ебать сколько всего сложного (посмотри на свои html шаблоны лол), может емулировать х86 на js и эта подсветка ему как два пальца
> Проблемы клаудфлары
> клаудфлары
> проблемы
лол, то есть это не ты контент медленно отдаешь, а специализированная система доставки контента, которая на этом к тому же деньги делает, виновата?
> не кешируется только то, что надо локализовать, дата/время, например, или названия кнопок
> локализация и темплейтинг на сервере
> 2015
> Так то статика у меня в памяти кешируется
тот же nginx сделал бы это куда лучше
ты, короче, придумал себе проблем, а теперь героически их решаешь
>>458253
> Как я и говорил, проблемы флары, чтоб у них понос случился. И отчасти твои проблемы тоже, судя по всему.
ну хуй знает
> Чем тебе отдельное приложение не угодило?
нахуя смешивать две ортогональные вещи?
захотел прямо в процессе сокет держать, ну так возьми mongoose, он из двух файлов состоит и простой как пробка
> VPS и вперед, если охота платить бабки за сайт, которым никто не пользуется. Мне вот не охота, поэтому у меня и хостится.
то есть ты не осилил поднять nginx с fastcgi модулем на своей убунте? серьезно?
> Я посмотрю, как ты будешь заново отрендеривать ссылки на посты при их удалении с такой архитектурой. Фичу с хешами файлов и подавно так не реализовать.
лолшто?
ты же все равно вытаскиваешь весь тред из базы. у тебя посты для всех айдишников в треде, в шаблоне и так подсвечивать ">>id", а посты из других тредов подтягиваются аяксом, т.к. редкость и нинужно
> Редактирование поста, удаление поста, получение новых постов, проверка хеша файла и так далее.
просто прикинь как бы ты это все написал на каких-нибудь руби в синатре, это был бы один файлик на 100-200 строк, 50% функциональности борды, а то и больше. на крестах можно придется писать больше, в любом случае, но не на порядки
> Лишний скрипт - лишний вес.
> отправляет на клиент не минимизированный html и js, а картинки 16х16 вообще одной
> mustache.min.js 8.835 kb
лол
> во-вторых это не задача клиента
охлол, хватит жить в 98ом, клиент рендерит ебать сколько всего сложного (посмотри на свои html шаблоны лол), может емулировать х86 на js и эта подсветка ему как два пальца
> Проблемы клаудфлары
> клаудфлары
> проблемы
лол, то есть это не ты контент медленно отдаешь, а специализированная система доставки контента, которая на этом к тому же деньги делает, виновата?
> не кешируется только то, что надо локализовать, дата/время, например, или названия кнопок
> локализация и темплейтинг на сервере
> 2015
> Так то статика у меня в памяти кешируется
тот же nginx сделал бы это куда лучше
ты, короче, придумал себе проблем, а теперь героически их решаешь
>>458253
> Как я и говорил, проблемы флары, чтоб у них понос случился. И отчасти твои проблемы тоже, судя по всему.
ну хуй знает
> захотел прямо в процессе сокет держать, ну так возьми mongoose, он из двух файлов состоит и простой как пробка
ты примерно так и сделал, тащемта, тут я не прав
>нахуя смешивать две ортогональные вещи?
Какие две вещи? Приложение получает запрос, обрабатывает его, отдает ответ. Что с чем смешано?
>не осилил
Осилил, но нахуя? Что мне это дает? Скорость? Упрощение логики? Какой именно?
>нинужно
Ясно. Засчитано. И нет, тред вытягивается не весь, ссылки между постами хранятся в отдельной таблице.
>был бы один файлик
Не был бы. Писал я на ваших скриптопарашах, когда кейс выходит за рамки хеллоуворлда, получается точно такой же объем кода.
>лол
>охлол
Теперь я знаю, из-за кого веб стал таким говном.
>лол, то есть это не ты контент медленно отдаешь, а специализированная система доставки контента, которая на этом к тому же деньги делает, виновата?
Лол, то есть это не ты в глаза долбишься и отрицаешь очевидные результаты со скринов, а я медленно что-то там отдаю?
>тот же nginx сделал бы это куда лучше
Как nginx относится к моему приложению вообще? Правильно, никак. Не надо смешивать ортогональные вещи (с).
>ты, короче, придумал себе проблем, а теперь героически их решаешь
Никаких проблем нет, все прекрасно работает.
>ну хуй знает
Придумай более другое объяснение скриншотам. Время чистого рендеринга/отдачи статики сам видишь. Никаких 400мс там и близко нет.
Я вот что скажу, у нас с тобой разные взгляды на то, как все должно быть устроено. Разная философия, что ли. Может, я в чем-то и не прав, а может и ты.
Пожалуй, поясню еще по поводу nginx. Не хочу раздристывать логику по всем уровням, потому как это каждый раз боль при переносе на новый хостинг. Надо все заново настраивать и т.д. Не думаю, что nginx умеет каким-то чудом быстрее обращаться к памяти. Так что пусть оно все будет в одном флаконе, так сказать, работоспособное как с nginx-ом, так и с другими приблудами, или вовсе без них.
Есть набор .obj файлов. Как сделать превью в виде картинки?
Парсинг, отображение в огл контексте уже реализован. Но нужна именно какой-то модуль, к-й позволит сделать пикчу, ничего не рисуя на экране.
Был ли у кого-то подобный опыт?
>опыт решения реальных задач
>на сосаче
Ты серьезно?
А вообще, только ручками, похоже. Гугл говорит, что готовых решений нет. Так что перегоняй байтики в нужный формат (что у тебя там, png, jpeg?) и, если надо, уменьшай размер.
Не понял твоей проблемы. Рисуй в текстуру, потом сохраняй ее как картинку.
да, допустим у меня есть две функции
class c1 {
MYOBJECT mo;
void ff();
}
void f1() {return ;}
и в классе MYOBJECT описана функция void f2() {return ;}
void c1::f1() {
QFuture<void> qF = QtConcurrent::run(f1) - комиплируется
QFuture<void> QF = QtConcurrent::run(this->mo.f2) - ошибка
return ;
}
В другом случае считается что в качестве первого аргумента она принимает указатель на объект класса.
в целом получилось, функция запускатеся отдельным потоком от мейна, основной виджет продолжает функционировать несомтря на Sleep(1); не получается запустить несколько потоков выполнения.
void mwindow::on_alg_dk_1_clicked()
{
QtConcurrent::run(&this->alg, &ALGORITHM::simple_rotation); //ALGORITHM - class, alg - object of ALGORITHM in class mwindow;
}
void mwindow::on_alg_dk_2_clicked()
{
QtConcurrent::run(&this->alg, &ALGORITHM::algorithm2);
}
///////////
void ALGORITHM::simple_rotation() {
bool1 = true;
while (bool1) {
wHandle.send_char(0x41);
QThread::sleep(2);
}
return;
}
void ALGORITHM::algorithm2() {
bool2 = true;
while (bool2) {
wHandle.send_char(0x42);
QThread::sleep(3);
}
return;
}
первая кнопка заупскает выполение 1й функции, но после нажатия следующей новый поток не работает
в целом получилось, функция запускатеся отдельным потоком от мейна, основной виджет продолжает функционировать несомтря на Sleep(1); не получается запустить несколько потоков выполнения.
void mwindow::on_alg_dk_1_clicked()
{
QtConcurrent::run(&this->alg, &ALGORITHM::simple_rotation); //ALGORITHM - class, alg - object of ALGORITHM in class mwindow;
}
void mwindow::on_alg_dk_2_clicked()
{
QtConcurrent::run(&this->alg, &ALGORITHM::algorithm2);
}
///////////
void ALGORITHM::simple_rotation() {
bool1 = true;
while (bool1) {
wHandle.send_char(0x41);
QThread::sleep(2);
}
return;
}
void ALGORITHM::algorithm2() {
bool2 = true;
while (bool2) {
wHandle.send_char(0x42);
QThread::sleep(3);
}
return;
}
первая кнопка заупскает выполение 1й функции, но после нажатия следующей новый поток не работает
Он и не должен. Смотри доки: http://doc.qt.io/qt-5/qtconcurrent.html#run
>Runs function in a separate thread. The thread is taken from the global QThreadPool. Note that function may not run immediately; function will only be run once a thread becomes available.
http://doc.qt.io/qt-4.8/qthreadpool.html#maxThreadCount-prop
>The default maxThreadCount is QThread::idealThreadCount().
Обычно это количество ядер.
Так что попробуй QThreadPool::globalInstance()->setMaxThreadCount(10);
QtCreator. Нахуй ваши вс и кодоблохи, студия тяжелая и неповоротливая, блохи слишком куцые и ничего не могут.
cпасибо, все работает, ты ахуенен
В говновузе по удаленке пилю редактор TeX на крестах. Можно считать что не работаю, уже полгода как не притрагивался к коду. Платят соответственно.
Как же реализовывали многопоточные приложения до этого? Что-то типа два потока становились в очередь, выполнялись, а потом сообщали, что выполнились?
Вот я, например, пидорил программку на сокетах - простой tcp чат. И одним потоком слушал, а другим отправлял сообщения. Как же это реализовали бы на процессорах первых поколений PentiumIV?
Олсо, знакомый рассказывал о том, что используя одну фичу - если переполнить буффер, то программа перескакивала на выполнение другой функции, которая даже не вызывалась.
void lol() {
cout << "How did we get here?"<<std::endl;
}
int main()
{
long a, b, z[10];
cin >> a >> b;
z[a] = b;
}
вводишь два определенных числа и программа "How did we get here?". Собственно похуй за переполнение, но товарищ отметил, что подобную фичу использует в некоторых проектов в качестве альтернативы многопоточности. В чем соль?
>>458877
Ну и то хорошо. Главное, чтобы на хлеб было чего намазать.
Лол. Надо было просто погуглить. Олсо, второй вопрос все-таки ещё остался.
A a = new A();
A a = new B();
Ебал я писать на этой борде код.
там тред ниже со скриптом
>Главное, чтобы на хлеб было чего намазать.
Для этого мамка есть. Ебал я свои деньги на еду тратить.
1) Зачем нужны weak_ptr.
2) Что такое mutex
3) Что такое deadlock
4) Что такое race condition
5) Что такое слот-сигнальная архитектура
6) Знаете ли вы Boost
7) Чем различаются разные cast'ы в C++
dynamic_cast, static, обычный.
8) что такое vtbl, когда она создаётся.
годно, спасибо.
1. как шаред птр только при захвате объекта не искрементирует рефкаунтер
2. одно из средств организации доступа к объекту в условиях N потоков
3. состояние взаимной блокировки
4. хз че-то с потоками вроде тоже?
5. когда на определенное действие генерируется сигнал и ему сопоставляются слоты (типа как в Qt)?
6. нет конкретики. filesystem, regex, matrix часто. ну и по мелочам (intrusive_ptr, noncopyable и тд)
Я не он, но:
1) Костыль.
2) Хуйня для совместной работы нескольких потоков с одним набором данных (переменной).
3) Лок нерекурсивного мьютекса из одного и того же потока, например.
4) Когда потоки одновременно пытаются работать с одним куском данных, и в каком порядке произойдет взаимодействие неизвестно (а может один поток начнет работать, когда второй еще не закончил и кровькишкираспидорасило).
5) Костыль для замены рефлексии, но довольно удобный.
6) Говно ебаное. Нахуй не нужен. Шутка.
7) Лень описывать, но короче статик самый строгий, динамик так и сяк, а ренинтерпрет - можно в ногу выстрелить.
8) Таблица виртуальных методов. Чтоб короче из приведенного к базовому классу объекта наследованного класса можно было вызывать виртуальный метод, а вызывался метод, определенный в наследованном классе. Создается если есть хоть одни виртуальный метод (вроде).
Нахуй я это пишу.
8. таблица вртутальных функций для класса, нужно наличие как минимум 1 виртуальной функции
7. вот в этот говне я плаваю сильно, с кастами слабо всегда было.
динамик каст ну для иерархий вируальных классов.
static cast и обычный - хз не знаю разницы, по-моему оба каста времени компиляции обычные, с проверками типов
const cast снимает волатайл и конст, хз не юзал ни разу в жизни
reinterpret cast типа без проверки типов каст, хз тоже не юзал ни разу
про касты если простым языком напишешь и конкретно где применяется конст и reinterpret было бы круто
Так-то верно, но от 1,4 МЫ ВАМ ПЕРЕЗВОНИМ
1) Не как устроен а зачем нужен, юзкейсы. На собеседованиях кстати почти всегда спрашивают о юзкейсах в каком-то понятии а не об абстрактном определении. Было ли у тебя такое на практике. Что именно приводило к ситуации.
Ответы сам нагуглишь, они легко гуглятся.
>>458952
>1) Костыль.
Вот такое на собеседовании тоже нельзя говорить, на крестах пишут старпёры по 40 лет, и тут какой-то сопляк в скайпе им будет пояснять что костыль а что нет. У них от этого сразу НЕПРИЯТНО становится.
>5) Костыль для замены рефлексии, но довольно удобный.
ШТО?
>6) Boost не нужен
Лол, boost это как всякие Spring и Hibernate для жабы, без него никуда.
>>458953
Если честно то там где я работал никто не юзал ничего кроме static_cast и били по голове если кто-то вообще пытался использовать RTTI. Вся работа по определению типа была сделана сквозь Visitor'ы (Паттерн такой, самый наркоманский на первый взгляд). Хотя по идее ведь даже сквозь Visitor мы используем RTTI неявно, когда вызываем внутри виртуальный метод обьекта. Так-что я кроме static_cast и dynamic_cast ничего и не помню.
А что не так? Хз как в ваших бустах это реализвано (и знать не хочу), а в Qt сигналы и слоты позволяют вызывать методы по имени, то есть ты можешь хоть в рантайме у юзера запросить строку с названием метода и вызвать его.
Не только это, конечно, но в основе именно оно лежит. Метакомпилятор добавляет в отдельный файл таблицу соответствия названий методов и самих методов (ну и сигнатур, само собой). В жабе все это при помощи рефлексии делается, ну, там, [code lang=cpp]object.call("methodName");[/code] или типа того, точно не помню, а в Qt [code lang=cpp]QMetaObject::invokeMethod(object, "methodName");[/code]
ладно спасибо, про weak ptr я только в теории тоже знаю, тк не использовал тоже ни разу, я ж вообще не с++ программист, а потоки и паттерны да, надо подтягивать обязательно, спасибо
>Что такое SFINAE? И нах он нужен?
лил, хз
>Что такое идеальная передача?
шта?
>Какие условия должны соблюдаться, чтобы тип был POD?
для меня это любой тип в с++ пришедший из С (не ООПшный карочи)
[spioler]унизил кароч)))[/spoiler]
>нельзя говорить
Мне поебать. Пусть берут мудака, не умеющего думать, зато умеющего лизать, их дело. Костыль есть костыль.
>ШТО?
См. >>458964
>без него никуда
И как же это я без него живу? Ни одного метода из буста не знаю на память, срсли, никогда не испытывал проблем, ведь есть Qt. Хотя, может в байтоебстве и нужен, я ж написал что шутка, но мне оно не интересно.
>Паттерны
Прости, слово-триггер, не удержался. Пикрелейтед.
Тёплое с мягким перепутал. Мок в кутах, конечно, позволяет получать метаинформацию об объектах, но вопрос был про архитектуру сигнал/слот. Вещи связанные, но ответ должен был быть в духе:
Мамка посылает сигнал, что приезжает тётя Люда, после чего у Бати срабатывает подключённый слот – одеть праздничные штопанные труханы.
Алсо,
>SFINAE
Костыль, опять же, но точнее плохой дизайн, но полезно.
>идеальная передача
Это не && ли в конструкторе случаем? Очередное байтоебство, может где-то и пригодится.
>POD
Ну вот нахуя это знать на память? Заняться что ли больше нечем? Тип без конструкторов, деструкторов и виртуальных методов. Не представляю, где это необходимо знать заранее.
Я описал как оно внутри работает. То что ты говоришь и так очевидно: кто бы мог подумать, что испускание сигнала вызывает слот! Вот это нежданчик.
1. Несколько переменных одинакового типа объявляются так: int a, b, @c (@ вместо звездочки). Вопрос: как это все взаимодействует с const? Можно ли делать int a, const b, @const c?
2. В чем разница между const char @c = "..." и const char c[] = "...".
3. Для чего нужно ключевое слово mutable.
Ну то есть я хочу сказать, вызывающий передает системе строку с именем сигнала, система смотрит, какие слоты (опять же, по именам) прикручены, находит их, вызывает. Если тип соединения соответствующий и/или получатель живет в другом потоке, то ставит в очередь этого потока, там свой цикл уже разбирается при очередном проходе. Но суть все равно в том, что оно основано на рефлексии, иначе получается как в бусте коряво и нинужно.
1.
>Можно ли делать int a, const b, @const c?
const b нельзя @const c можно
2. первое констатный указатель на строку в read-only памяти, второе массив на стэке
3. чтоб const методы могли менять эти переменные
спасибо за вопросы
А мы с вами, неаргументированный хуесос, даже связываться не будем.
>>458974
>1
Не еби никому мозги, так объявлять переменные - все равно что ходить с голой обосранной жопой по улице.
>2
Синтакисчески сахар вроде. Если правильно помню, в обоих случаях будет указатель на ридонли память (хотят тут от конпелятора и системы зависит).
>3
Чтоб переменную класса с этим модификатором можно было менять в const-методе. Как правило используется для мьютексов или каких-то внутренних счетчиков (последнее часто - плохой дизайн).
Хуй знает, но задающий рассчитывал именно на такой ответ.
ошибка же, лол
prog.cpp:5:9: error: expected unqualified-id before 'const'
int a, const aVotHui = 5;
>неаргументированный
Человеку, который не упомянул об RTTI при dynamic_cast, точно никогда не перезвонят.
>Разве есть разница?
Есть. В случае указателя на строку тут две сущности. Указатель и сама строка. Для указателя выделяется отдельное место в памяти, туда записывается адрес начала строки. Можно получить адрес этой указателя. В случае массива отдельного указателя не создается, при использовании данной переменной сразу подставляется адрес массива.
Строка есть и там и там, только в случае указателя есть еще и отдельная переменная с ее адресом. То есть можно сделать: char @c = "asdf"; char @@pc = @c; С массивом так не сделать.
Лол, я нисколько, я нищенка-студент оптик, который скоро пойдёт бомжевать на улицы.
Мы не на собеседовании. Ебал я тут распинаться перед даунами. Это во-первых. Во-вторых, мне поебать, что оно там задействует и как это что-то называется, мне важно как оно работает и какие нюансы при этом всем. Именно поэтому я пишу программы, а кукаретики пишут факториалы.
Ищу по С++ годную книжонку на рюсском в бумажном варианте. Какую посоветуете?
если для начинающего я бы Шилдта посоветовал
>мне важно как оно работает и какие нюансы при этом всем
Работает так, что static_cast делается при компиляции, а dynamic_cast - в рантайме, с помощью RTTI. А нюанс такой, что за пределами десктопа ни RTTI ни эксепшены часто недоступны, а без RTTI нет и дайнемик кастов.
Блджад, я разобрался с самим языком, знаю некоторые основы обработки сигналов, немного SQL с Qt, а в вакансиях всегда требуют ещё какую-нибудь хуйню, из-за чего дико ссыкую.
Я знаю, ты читай внимательно:
>Лень описывать, но короче...
Если все подробно описывать, на меленькую статью хватит. У нас же не собеседование.
>Я знаю
Вот из этого "но короче статик самый строгий, динамик так и сяк" ясно видно, что нет.
Да запарил ты, он и сам понимает знает он или нет, мы же тут не срез по знаниям устраиваем. Это его дело, хочет работать на С++ - узнает или знает, не хочет - и не нужно тогда. Может человек просто ради интереса решил ответить на вопросы.
Ок NVM, просто много совпадений.
Английский знаешь? Базовый уровень DSP есть? В магистратуру собираешься?
> Английский знаешь?
Читать литературу, спросить дорогу и заказать пиво знания хватает.
> DSP
Нету, советуешь обмазаться?
> В магистратуру собираешься?
Да, думаю преподавать какую-нибудь околопогромистскую хуйню.
>Нету, советуешь обмазаться?
да не, только если не собираешься с этим работать или ради интереса.
блин, наебал я тебя, я думал щас открытые вакансии для стажеров есть, а в Питере нету(
просто хотел сказать, что требования всегда завышены, так что не очкуй, открывай резюме на hh, сами звонить будут
Говорите книгу и страницу, с которой начать её, чтобы зашить эти дырки в знаниях, блядь1!!
Сам код (функция ff=(y-1)/(x+1) но до пизды, потому что должен уметь со всем решать):
double Y,eps,x=0,y=0,x1,y1,h,j=0;
int a,b,N=5,i=0;
eps=1e-6;
a=0;
b=20;
h=(b-a)/N;
i++;
x1=x+ih;
y1=y+hff(x,y);
y1=y+h(ff(x,y)+ff(x1,y1))/2;
do
{
N=N2;
h=(b-a)/N;
x1=x+ih;
Y=y+hff(x,y);
Y=y+h*(ff(x,y)+ff(x1,Y))/2;
j++;
}while(fabs(Y-y1)<eps);
В следующий раз, когда захочешь показать здесь кому-нибудь код, используй это:
http://ideone.com/
http://pastebin.com/
Или [code][/code] + скрипт
https://github.com/ololoepepe/MakabaCode
https://2ch.hk/pr/res/457262.html
самое время научиться использовать дебаггер))))
знаю основы явы и паскаля
Ну я циклы, массивы, указатели и прочее знаю, но вот как понеслось - weal_ptr, mutex - вообще какое-то говно, которое совсем чуть-чуть слышал.
ну там многое написали это не непосредственно стандарт С++ а связанные с работой программиста вещи, а что касается кастов, RTTI, умных указателей и так далее то это все можно найти в любой книге по С++. открой любую из нормальных книг и листай с начала до момента пока не перестанешь понимать, оттуда и читай.
Короче. У меня такой план. Я взял Парта и тупо выполняю все задачи, которые он задает в конце. Как только начинает валиться говно - читаю параграф, норм?
да
Читай Амерааля про STL, Майерса с эффективными книгами и обзором модерн цпп, ещё Александреску. Про многопоточность в плюсах написал Вилльямс хорошо.
Байтоёбом будешь.
> Амерааля
Внезапно осознал, что он устарел. Но у того же Майерса есть книга про эффективный STL.
Переходить на Хаскел.
Про типы уже пояснили.
>>457961
>Или использовать что-то вроде Boost.Variant.
Нахуя тащить буст? Variant лучше самому навелосипедить-накопипастить, особенно с таким неокейным пониманием.
лол, ану-с, потестим
[code]
class Variant
{
public:
\tVariant();
\tVariant(const Variant& t)
\t{
\t\tobject = (t.object);
\t}
\ttemplate <class T>
\tVariant(const T& t)
\t{
\t\ttypedef Type<T> assign_type;
\t\tobject = std::auto_ptr<assign_type>(new assign_type(t));
\t}
\ttemplate <class T>
\tVariant& operator = (const T& t)
\t{
\t\ttypedef Type<T> assign_type;
\t\tobject = std::shared_ptr<assign_type>(new assign_type(t));
\t\treturn this;
\t}
\ttemplate <class T>
\toperator T ()
\t{
\t\ttypedef Type<T> assign_type;
\t\tassign_type& Type = dynamic_cast<assign_type&>(object);
\t\treturn Type.get();
\t}
private:
\tclass Base
\t{
\tpublic:
\t\tvirtual ~Base();
\t};
\ttypedef std::shared_ptr<Base> base_ptr;
\ttemplate <class T>
\tclass Type : public Base
\t{
\tpublic:
\t\tType(T const& t)
\t\t\t: object(t)
\t\t{
\t\t}
\t\tT get() const
\t\t{
\t\t\treturn object;
\t\t}
\tprivate:
\t\tT object;
\t};
\tbase_ptr object;
};
[/code]
Про типы уже пояснили.
>>457961
>Или использовать что-то вроде Boost.Variant.
Нахуя тащить буст? Variant лучше самому навелосипедить-накопипастить, особенно с таким неокейным пониманием.
лол, ану-с, потестим
[code]
class Variant
{
public:
\tVariant();
\tVariant(const Variant& t)
\t{
\t\tobject = (t.object);
\t}
\ttemplate <class T>
\tVariant(const T& t)
\t{
\t\ttypedef Type<T> assign_type;
\t\tobject = std::auto_ptr<assign_type>(new assign_type(t));
\t}
\ttemplate <class T>
\tVariant& operator = (const T& t)
\t{
\t\ttypedef Type<T> assign_type;
\t\tobject = std::shared_ptr<assign_type>(new assign_type(t));
\t\treturn this;
\t}
\ttemplate <class T>
\toperator T ()
\t{
\t\ttypedef Type<T> assign_type;
\t\tassign_type& Type = dynamic_cast<assign_type&>(object);
\t\treturn Type.get();
\t}
private:
\tclass Base
\t{
\tpublic:
\t\tvirtual ~Base();
\t};
\ttypedef std::shared_ptr<Base> base_ptr;
\ttemplate <class T>
\tclass Type : public Base
\t{
\tpublic:
\t\tType(T const& t)
\t\t\t: object(t)
\t\t{
\t\t}
\t\tT get() const
\t\t{
\t\t\treturn object;
\t\t}
\tprivate:
\t\tT object;
\t};
\tbase_ptr object;
};
[/code]
Ебучая макака на каждом шагу ставит подножки. Обновите скрипт, исправил замену табуляции на \t, теперь заменяет все символы табуляции пробелами (количество пробелов высчитывается исходя из положения \t в строке).
Как БЫСТРЕЕ делать каждый проход цикла: memset 0, а потом выставлять единички:
for i = 0 ... i_max
for m = 7 ... 0
if (ololo) arr|i] |= 1 << m
или прямо по старым значениям выставлять и единички, и нули:
for i = 0 ... i_max
for m = 7 ... 0
if (ololo) arr|i] |= 1 << m
else arr|j] &= ~(1 << m);
P.S. Открывающую квадратную скобку заменил на | чтобы макаба квадратные скобки не схавала.
Да оно не продается судя по всему, это либо глюк у конкретного провайдера, либо наебалово. А я как наивный мудак слюни распустил. Вот тут пишет, что мол занят домен: https://www.nic.ru
Пробовать за такие бабки с шансом наебалова что-то жаба давит. inb4 копейки, но нет, жаба - она такая.
Ну смотри. Мемсет - лишняя операция над целой областью памяти. Ты все равно проходишься по всем элементам потом, так что нахуя вызывать дополнительно мемсет? А вообще сделай массив побольше да проверь, сколько будет выполняться каждый вариант.
С точки зрения количества операций безусловно ты прав. Но я же говорю о скорости.
Если скорость побитовых операций arr|i] |= 1 << m
arr|j] &= ~(1 << m)
равна или скажем 0.9 от скорости мемсета, то вопрос вообще снимается.
Просто проверь и не еби себе и остальным мозг.
Если хранить данные в хипе, то вместо твоего велосипеда проще сделать для классов общий интерфейс, а в векторе - шэрд пойнтеры. Если же надо данные хранить в векторе, то надо велосипедить что-то вроде:
template <class Iface, size_t Size>
class Storage {
char m_storage[Size];
public:
Iface *get() ...
http://pastebin.com/WEZPb1Xr
Затем что я умею внимательно читать:
>У меня имеется массив в памяти, который много раз в цикле заполняется битами.
Хотя, быть может, я не совсем удачно выразился.
Смысл в том, что он многократно целиком переписывается. Это понятно из контекста:
>или прямо по старым значениям выставлять и единички, и нули:
Зависит от ситуации. Лень описывать но тебе проще нагуглить что такое race conditions и deadlock'и. Куча примеров.
Если ты во всех потоках только читаешь данные, то вообще лочить необязательно. Но учти, что запись может происходить где-то внутри, если ты работаешь с высокоуровневым интерфейсом. Так что без блокировки можно обращаться к данным только тогда, когда ты абсолютно уверен в том, что делаешь.
Далее, в том же Qt, например, есть QReadWriteLock, который соответственно можно лочить на чтение, либо на запись. Причем на чтение могут лочить сколько угодно потоков одновременно, а на запись. разумеется, только один. Это так, для справки.
да, сегодня норм грузится, 1.5-2 секунды на нулевую
> Я вот что скажу, у нас с тобой разные взгляды на то, как все должно быть устроено.
ты свалил кучу разного функционала в один проект, хотя он просто разбивался на небольшие модули. и, о чудо, добрая половина этих модулей уже существует в виде библиотек
> Какие две вещи? Приложение получает запрос, обрабатывает его, отдает ответ. Что с чем смешано?
ты, видимо, никогда не пользовался веб-серверами дальше простейшего сервинга статики
веб-сервера реализуют за тебя дохуища логики и делают это обычно в разы быстрее нежели ты руками
а еще, несколько процессов не могут слушать вместе волшебные 80 и 443 порты
итак, основные поинты:
- сервер сервит не только твою борду
- если твоя борда упадет сервер ее перезапустит (можно, конечно, monit на процесс повесить)
- овер дохуя всего, чего ембед сервера не умеют (потому что нахуй они не нужны такие жирные). взгляни хотя бы на вики по lighthttpd: http auth, url rewrite (тебе, так то, не нужен), ssl/tls, статистика, ssi, подробные логи, gzip
встраиваемые веб-сервера нормально подходят для внутренних микросервисов и железок типа роутеров, встраивать вебсервер в обычный веб-сайт не оправдано ничем, ты просто выкидываешь многолетний опыт и накопленные возможности ради мифической скорости, кажущегося KISS/YAGNI/эназа_модная_аббревитура.
особенно, учитывая, что твой подход требует больше кода
> Теперь я знаю, из-за кого веб стал таким говном.
веб-стек всегда был говном. желание перенести с сервера на клиент большую часть того, что может делать клиент сам - абсолютно нормально и, более того, практиковалось всегда и везде. речь не идет о том, чтобы валидацию, например, убрать с сервера.
локализовывать на сервере нужно контент, чтобы поисковики нормально работали, а у тебя локализовывать нечего.
> Никаких проблем нет, все прекрасно работает.
ты количество кода для этого "прекрасно" видел?
и я не хочу никого обижать, но все это на уровне основной массы php3 из нулевых
посмотри на вещи следующим образом: борда - интерфейс к данным с некоторым шаблонизатором
задача твоего кода конвертировать данные, что прислал двачующий, в данные в формате базы и обратно. и только.
пик тотали рилейтед
ОТКУДА ТАМ, БЛЯДЬ, СТОЛЬКО КОДА?
да, сегодня норм грузится, 1.5-2 секунды на нулевую
> Я вот что скажу, у нас с тобой разные взгляды на то, как все должно быть устроено.
ты свалил кучу разного функционала в один проект, хотя он просто разбивался на небольшие модули. и, о чудо, добрая половина этих модулей уже существует в виде библиотек
> Какие две вещи? Приложение получает запрос, обрабатывает его, отдает ответ. Что с чем смешано?
ты, видимо, никогда не пользовался веб-серверами дальше простейшего сервинга статики
веб-сервера реализуют за тебя дохуища логики и делают это обычно в разы быстрее нежели ты руками
а еще, несколько процессов не могут слушать вместе волшебные 80 и 443 порты
итак, основные поинты:
- сервер сервит не только твою борду
- если твоя борда упадет сервер ее перезапустит (можно, конечно, monit на процесс повесить)
- овер дохуя всего, чего ембед сервера не умеют (потому что нахуй они не нужны такие жирные). взгляни хотя бы на вики по lighthttpd: http auth, url rewrite (тебе, так то, не нужен), ssl/tls, статистика, ssi, подробные логи, gzip
встраиваемые веб-сервера нормально подходят для внутренних микросервисов и железок типа роутеров, встраивать вебсервер в обычный веб-сайт не оправдано ничем, ты просто выкидываешь многолетний опыт и накопленные возможности ради мифической скорости, кажущегося KISS/YAGNI/эназа_модная_аббревитура.
особенно, учитывая, что твой подход требует больше кода
> Теперь я знаю, из-за кого веб стал таким говном.
веб-стек всегда был говном. желание перенести с сервера на клиент большую часть того, что может делать клиент сам - абсолютно нормально и, более того, практиковалось всегда и везде. речь не идет о том, чтобы валидацию, например, убрать с сервера.
локализовывать на сервере нужно контент, чтобы поисковики нормально работали, а у тебя локализовывать нечего.
> Никаких проблем нет, все прекрасно работает.
ты количество кода для этого "прекрасно" видел?
и я не хочу никого обижать, но все это на уровне основной массы php3 из нулевых
посмотри на вещи следующим образом: борда - интерфейс к данным с некоторым шаблонизатором
задача твоего кода конвертировать данные, что прислал двачующий, в данные в формате базы и обратно. и только.
пик тотали рилейтед
ОТКУДА ТАМ, БЛЯДЬ, СТОЛЬКО КОДА?
TForm1 Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject Sender)
{
int rec(int, int, int);
int nerec(int, int, int);
int key = StrToInt(Edit1->Text);
int first=0,last=9;
switch(RadioGroup1->ItemIndex){
case 0:
Edit2->Text=FloatToStrF(rec(first,last,key),ffFixed,8,0);
break;
case 1:
Edit3->Text=FloatToStrF(nerec(first,last,key),ffFixed,8,0);
break;
}
}
int a[10]={1,2,3,4,5,6,7,8,9,10}, p=a;
int nerec(int first, int last, int key)
{
while (first <= last) {
int mid = (first + last) / 2;
if (key > (p+mid))
first = mid + 1;
else if (key < (p+mid))
last = mid - 1;
else
return mid;
}
}
int rec(int first, int last, int key)
{
if (first <= last) {
int mid = (first + last) / 2;
if (key == (p+mid))
return mid;
else if (key < (p+mid))
return rec(first, mid-1, key);
else
return rec(mid+1, last, key);
}
}
TForm1 Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject Sender)
{
int rec(int, int, int);
int nerec(int, int, int);
int key = StrToInt(Edit1->Text);
int first=0,last=9;
switch(RadioGroup1->ItemIndex){
case 0:
Edit2->Text=FloatToStrF(rec(first,last,key),ffFixed,8,0);
break;
case 1:
Edit3->Text=FloatToStrF(nerec(first,last,key),ffFixed,8,0);
break;
}
}
int a[10]={1,2,3,4,5,6,7,8,9,10}, p=a;
int nerec(int first, int last, int key)
{
while (first <= last) {
int mid = (first + last) / 2;
if (key > (p+mid))
first = mid + 1;
else if (key < (p+mid))
last = mid - 1;
else
return mid;
}
}
int rec(int first, int last, int key)
{
if (first <= last) {
int mid = (first + last) / 2;
if (key == (p+mid))
return mid;
else if (key < (p+mid))
return rec(first, mid-1, key);
else
return rec(mid+1, last, key);
}
}
>да, сегодня норм грузится
Я же говорю, это ссаная флара. Отключил и все нормально. Я же не платил им, видимо для халявщиков скорости урезаются.
>разбивался на небольшие модули
Но зачем? Чтобы ебаться с их настройкой и состыковкой воедино?
>добрая половина этих модулей уже существует в виде библиотек
Например?
>веб-серверы
Ой все. https://ololoepepe.me/files/nginx.conf (Да, это не что-то супер-крутое, но я хочу сказать, что представляю, для чего нужны веб-серверы.)
>абсолютно нормально
Желание то нормально, но юзеру от этого не легче. Не слишком приятно с мобильного интернета открывать страницы, грузящие сотни килобайт JS-зависимостей. Каждый килобайт на счету. Это вы там в своих московиях зажрались, а у нас, замкадышей, все еще каменный век.
>количество кода
Почему тебе так НЕПРИЯТНО от этого? Я правда не понимаю. Не 100к строк же, всего около 20 вместе с шаблонами и скриптами, это очень мало по сравнению с нормальными проектами.
>но все это на уровне основной массы php3 из нулевых
Г-споди, да любой бэкенд на том же уровне. Все что нового придумано - клиент-сайд скриптоговно и красивые кнопочки. Сервера как обрабатывали запросы 10 лет назад, так и сейчас обрабатывают, что там нового то изобретать?
>задача твоего кода конвертировать данные, что прислал двачующий, в данные в формате базы и обратно.
Так я больше ничего и не делаю. Только конвертировать нужно разные данные, разными способами, так код и растет. Ну и бойлерплейт. Кресты в этом плане не далеко от жабы ушли по выразительности и лаконичности, щито поделать.
Для начала воспользуйся тегом [code] для вас же пидоров юзерскрипт писал или pastebin/ideone.
Браузер какой? Для лисы это делается через greasemonkey (расширение такое), для других не знаю, может аналоги есть (в хроме точно есть).
#include <iostream>
int main()
{
std::cout << "Hello world!" << std::endl;
return 0;
}
[/code]
Скриптоговно, сэр. Оно всегда очень медленно работает, особенно когда объем данных превышает пару строк.
Это мне уже говорили. Но как мне, например, объявить массив в той же форме баттонклик и затем передать его в функции рек и нерек? Или это вообще как-то иначе нужно сделать?
Ну ты пиши, пиши. Я себе чуть позже, как по-стабильнее будет, накачу.
Ты можешь просто обьявить массив как
int a[10]={1,2,3,4,5,6,7,8,9,10}
внутри своего Button1Click
В обьявлении функции добавь к примеру вот такой параметр int* a (Получаешь указатель на первый эл-т массива, он в С одновременно является и началом массива) и int size (размер массива чтоб знать сколько в нём эл-тов, ну в твоём случае будет 10 всегда, можешь и без этой переменной.
В этих функциях работаешь с ним как с обычным массивом.
Только ты должен понимать что в таком случае ты создаёшь массив на стэке каждый раз при вызове функции Button1Click и как только закрывается скобка } (Закончится эта функция) - можешь считать что этот массив в памяти уничтожен. Пользоваться ссылками или указателями на него нельзя.
Ох, спасибо огромное. Получилось.
Лел, я тебе там Pullrequest бросил с readme файлом. Ты там их смержи что ли как-нибудь.
Прошу помосчи
http://pastebin.com/GfwtpkeC
Надо будет дописать тогда. Это мой первый контрибьют, кстати. Надо теперь что-нибудь с кодом, но я пока мало знаю, лол.
мимо не-java-php-c#-пидор
На другой системный. Но не думаю что это скоро произойдёт, на С/С++ уже столько кода написано, что даже не представляю как его будут менять.
forth
> Каждый килобайт на счету.
> ходить на имиджборды, где на глагне сплошные картиночки
проиграл
отрендерил в <pre>, асинхронно прогрузил prism.js 9.6kb, применил
и все довольны
хотя, ладно, в целом, ничего плохого в gnu source hightlight на сервере не вижу
> location /board/ {
> proxy_pass http://192.168.0.2:8080/;
ну и нахуя, тебе полноценный встроенный http-сервер в приложение, если у тебя и так уже nginx есть?
получается же хттп-сервер => хттп-сервер => сама борда, дублируешь работу же
> Сервера как обрабатывали запросы 10 лет назад, так и сейчас обрабатывают, что там нового то изобретать?
php3 здесь как пример каши из шаблонов, логики и доступа к данным твои сырцы не смотрел почти, ничего сказать не могу
сейчас у всех на бекенде модульность, сервисы, микросервисы и вся ткакая ебала. все хотят иметь возможность взять свою борду, выкинуть 2к строчек прослойки хттп<==>сервис, написать прослойку смтп<==>сервис и двачевать через почтовый клиент
> Так я больше ничего и не делаю.
> всего около 20к
вот от этого пичот, это и есть единственная проблема, которую я вижу, на самом то деле
> Кресты в этом плане не далеко от жабы ушли по выразительности и лаконичности, щито поделать.
у тебя какие-то другие кресты и какая-то не та жаба
[code]
server.route("POST", "/post", [&](srv::request& r, svr::response& o) -> void {
coolchan::post post = imgboard.add_post(
r.arg<int>("thread_id"),
r.arg<std::string>("post_text"),
r.arg<std::string>("captcha")
// etc.
);
});
[/code]
> Каждый килобайт на счету.
> ходить на имиджборды, где на глагне сплошные картиночки
проиграл
отрендерил в <pre>, асинхронно прогрузил prism.js 9.6kb, применил
и все довольны
хотя, ладно, в целом, ничего плохого в gnu source hightlight на сервере не вижу
> location /board/ {
> proxy_pass http://192.168.0.2:8080/;
ну и нахуя, тебе полноценный встроенный http-сервер в приложение, если у тебя и так уже nginx есть?
получается же хттп-сервер => хттп-сервер => сама борда, дублируешь работу же
> Сервера как обрабатывали запросы 10 лет назад, так и сейчас обрабатывают, что там нового то изобретать?
php3 здесь как пример каши из шаблонов, логики и доступа к данным твои сырцы не смотрел почти, ничего сказать не могу
сейчас у всех на бекенде модульность, сервисы, микросервисы и вся ткакая ебала. все хотят иметь возможность взять свою борду, выкинуть 2к строчек прослойки хттп<==>сервис, написать прослойку смтп<==>сервис и двачевать через почтовый клиент
> Так я больше ничего и не делаю.
> всего около 20к
вот от этого пичот, это и есть единственная проблема, которую я вижу, на самом то деле
> Кресты в этом плане не далеко от жабы ушли по выразительности и лаконичности, щито поделать.
у тебя какие-то другие кресты и какая-то не та жаба
[code]
server.route("POST", "/post", [&](srv::request& r, svr::response& o) -> void {
coolchan::post post = imgboard.add_post(
r.arg<int>("thread_id"),
r.arg<std::string>("post_text"),
r.arg<std::string>("captcha")
// etc.
);
});
[/code]
Да ты издеваешься? Прямо на гланге большими буквами есть ссылка на https://github.com/ololoepepe/MakabaCode/
>Code::Blocks
А это что такое. Гуглить не буду, всё равно ничего не пойму. Расскажите про свои ощущения от пользования, что это, зачем и почему.
лучше чем dev-c++ и mingw, хоть и очень похож на последний- Интерфейс удачнее, ошибок меньше
Все хуйня это, не юзай иде в начале пути. Изучи какую-нибудь систему сборки и юзай её + модный редактор
забываю только что написанные функции хедера, при переключении в cpp файл
Даже небо, даже аллах!
Хоть сейчас появляется тенденция писать на всяких JS и прочем, но в основе этого говна всегда лежит C++. Никуда от этого не деться.
inb4: мантры долбоеба.
Бля, я про тебя уже и забыл, мне впадлу разбираться в этой куче кода, поэтому держи набросок на коленке. Проверил матлабом, вроде бы, работает:
http://pastebin.com/jDChREDM
[code="c++"]
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n = 100;
vector<int> all(n), d3(n), d5(n);
int i = 1;
generate(all.begin(), all.end(), [&i]{ return i++; });
copy_if(all.cbegin(), all.cend(), d3.begin(), [](int x) { return x % 3 == 0; });
copy_if(all.cbegin(), all.cend(), d5.begin(), [](int x) { return x % 5 == 0; });
for (int x : all) {
bool flag = true;
if (find(d3.cbegin(), d3.cend(), x) != d3.cend()) {
cout << "Fizz";
flag = false;
}
if (find(d5.cbegin(), d5.cend(), x) != d5.cend()) {
cout << "Buzz";
flag = false;
}
if (flag) cout << x;
cout << " ";
}
return 0;
}
[/code]
http://ideone.com/Hhz7jh
[code="c++"]
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n = 100;
vector<int> all(n), d3(n), d5(n);
int i = 1;
generate(all.begin(), all.end(), [&i]{ return i++; });
copy_if(all.cbegin(), all.cend(), d3.begin(), [](int x) { return x % 3 == 0; });
copy_if(all.cbegin(), all.cend(), d5.begin(), [](int x) { return x % 5 == 0; });
for (int x : all) {
bool flag = true;
if (find(d3.cbegin(), d3.cend(), x) != d3.cend()) {
cout << "Fizz";
flag = false;
}
if (find(d5.cbegin(), d5.cend(), x) != d5.cend()) {
cout << "Buzz";
flag = false;
}
if (flag) cout << x;
cout << " ";
}
return 0;
}
[/code]
http://ideone.com/Hhz7jh
[code lang="c++"]
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n = 100;
vector<int> all(n), d3(n), d5(n);
int i = 1;
generate(all.begin(), all.end(), [&i]{ return i++; });
copy_if(all.cbegin(), all.cend(), d3.begin(), [](int x) { return x % 3 == 0; });
copy_if(all.cbegin(), all.cend(), d5.begin(), [](int x) { return x % 5 == 0; });
for (int x : all) {
bool flag = true;
if (find(d3.cbegin(), d3.cend(), x) != d3.cend()) {
cout << "Fizz";
flag = false;
}
if (find(d5.cbegin(), d5.cend(), x) != d5.cend()) {
cout << "Buzz";
flag = false;
}
if (flag) cout << x;
cout << " ";
}
return 0;
}
[/code]
[code lang="c++"]
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n = 100;
vector<int> all(n), d3(n), d5(n);
int i = 1;
generate(all.begin(), all.end(), [&i]{ return i++; });
copy_if(all.cbegin(), all.cend(), d3.begin(), [](int x) { return x % 3 == 0; });
copy_if(all.cbegin(), all.cend(), d5.begin(), [](int x) { return x % 5 == 0; });
for (int x : all) {
bool flag = true;
if (find(d3.cbegin(), d3.cend(), x) != d3.cend()) {
cout << "Fizz";
flag = false;
}
if (find(d5.cbegin(), d5.cend(), x) != d5.cend()) {
cout << "Buzz";
flag = false;
}
if (flag) cout << x;
cout << " ";
}
return 0;
}
[/code]
Запили нумерацию строк в MakabaCode.
А если прикрутишь настройки и внедришь их в диалог настройки двачей, ваще охуенно будет.
////
Кто нибудь смог прикрутить к Opera 12?
Ты это кидай на github в раздел issues. Так куда будет удобней.
вроде работает, спасибо, но чем она отличается от моей кроме отсутствия проверки на точность?
В твоём коде происходит что-то странное с сеткой и её шагом, здесь же сетка фиксирована, как и предполагается в этом методе.
Пара советов:
1. Читай внимательнее свой код
2. Обзывай переменные как-нибудь внятно, а не a, b, h.
3. Операторы +-*/= бывает полезно разделять запятыми, так код бывает читать проще.
4. Объявляй и инициализируй переменные тогда, когда они действительно начинают использоваться, а не в самом начале.
Neeqaque. Или qaque, но очень через жопу. Стремление всё обобщить - это хорошо, но иногда без обработки edge cases не обойтись.
Хули их содержимое просто не менять местами?
[code]
class line{
...
}
class text{
\tstd::vector<line> entireText;
public:
\ttext(line);
}
text::text(line lineToAdd){
\tentireText.end(lineToAdd);
}
[/code]
Выдаёт ошибку, говорит, мол, нет перегрузки с такими аргуметами. И да, я что, разве могу прилепить в стд свой метод с шаблонами?
\t пару раз случайно приклеился.
Отбой, я аутист и читаю жопой описание стдлиба.
Нет, лол, нихуя не отбой.
[code]
class line{
...
}
class text{
std::vector<line> entireText;
public:
text(line);
}
text::text(line lineToAdd){
entireText.insert(entireText.end(), lineToAdd);
}
[/code]
Теперь, после выхода из конструктора с параметрами
вылезает рантайм эррор. ЧЯДНТ?
И снова отбой, лол.
>проиграл
Хоть запроигрывайся, а картинки вообще-то можно отключать. И весят превью 5-6 КБ, а всякое жуйкуери и другие приблуды в сумме до сотен доходят. Это штук 20 картинок - считай, вся нулевая.
>ну и нахуя
Потому что завтра мамка выкинет мой сервер в коридоре, а настройки nginx я с горя забуду, но борда продолжит спокойно себе работать на рабочем компе, потому что не зависит от этого. Про мамку шутка конечно, но, думаю, кейс понятен.
>модульность, сервисы, микросервисы и вся ткакая ебала
Баззворд на баззворде. У меня просто немного другая архитектура, другая декомпозиция. Модули так или иначе поддерживаются в виде плагинов: фабрика р(о)утов и фабрика досок. Просто не вижу смысла базовую функциональность типа отдачи статики в плагин выносить, поэтому она сразу в коде идет.
>код
Ну ничоссе. Я тоже могу написать
[code lang="cpp"]
dispatcher().assign("/create_post", &ThreadRoute::handlePostCreation, route, 1, 2);
[/code]
Даже короче получилось (так оно в коде и есть, тащем-то, только для общего случая разного количества аргументов). Только вот ни у меня, ни у тебя не описана в примере логика проверки капчи, валидации других параметров, обращения к БД, рендеринга страницы с ошибкой, наконец. Так что не надо тут.
должны быть констуктор копирования и оператор присваивание для line
няши, помогите пожалуйста решить задачку, ну или хотя бы подскажите алгоритм. В массиве А(N,M) расположить элементы каждой строки в порядке убывания, а сами строки расположить в порядке возрастания сумм их элементов. Указатели на строки.
Насколько помню, для этого нужен рекурсивный драйвер ядра. Придется применить ДДоС атаку на процессор.
В его ДНК.
Дело точно не в векторе, а что-то не так в описанных тобою классах. Дальше не читал.
о пап привет, так ты ж от спида сдох, после того как тебя какой-то тип в шоколадный долбил))))000
ну блин((, а можно как-нибудь по-другому?
Ясно, малыш, ясно. Пожалуйся мамочке, она попку кремом смажет, будет не так больно.
Нет, он годный кун. Запилил юзерскрипт, который чинит [code][/code] тэг. Я у него на Github нашел кучу Qt репозиториев. Довольно интересные программы, поэтому и интересуюсь непосредственно у него.
Ну бля, что ж ты намеков то не понимаешь, не надо из меня неймфага делать. Почта же есть, если уж сильно надо, ну.
Бланшет, Саммерфилд. Еще Шлее. У них учебники. Но мне не понравилось, например. Я делал так: брал задачу (на тот момент хотел запилить скачивание картинок с тредов, такой специфический менеджер закачек), пытался сделать, смотрел примеры, гуглил и т.д. Код получался ужасный, но со временем появлялся опыт и код становился лучше. На практике приобретаются знания и навыки, которые никакой учебник не даст.
И еще, очень хорошо будет взять какой-нибудь проект, скажем, в вузике (если ты студент), или даже просто знакомым что-то запилить. Похуй что бесплатно. Ответственность минимальная, но она есть, и это мотивирует, также как и то, что твое поделие кто-то использует, находит баги, реквестит фичи и все такое. Для карьерного роста пользы почти нет, для профессионального - очень даже.
Каррирую этого дабла композитора.
Да мне просто надо к четвергу запилить GUI. Вернее как. Мой воображаемый дедлайн и тз требуют запилить программку для вузика охуенно, но на деле надо показать довольно простую хуйню.
Надо сделать два окошечка - пикрелейдет.
Первый пик:
Основнок окно. Надо запилить несколько вкладочек, в которых отображать информацию. Достаточно будет тупо текст, на крайний случай таблицы. Туда вся информация должна выводиться.
Второй пик:
Заполнение матриц. Первые два квадрата - две матрицы(т.е. таблицы, которые можно заполнить). Неплохо было бы запилить ресайз.
Последняя колонка всякие конфиги и кнопочки. Тыкаешь кнопку start, и gui сбрасывают в соснольку данные, которая вычисляет и отсылает данные обратно в stdout.
Gui парсят ответ и вкидывают пользователю окошечко с полученным результатом.
>>459979
Весьма тонкий реквест "сделай мне лабу". Но хуй с тобой.
>несколько вкладочек
QTabWidget
>тупо текст
QPlainTextEdit
>таблицы
QTableWidget
>ресайз
Если ты о ресайзе элементов окна (виджетов), то QLayout и производные от него. Если о ресайзе таблицы, то QTableWidget::setRowCount, QTableWidget::setColumnCount (но, насколько я помню, там еще надо будет в пустые клетки запихать виджеты, лучше погугли).
>всякие конфиги
QFormLayout в помощь.
>кнопку start
Хорошее решение - QDialogButtonBox внизу, на который уже добавляются кнопки QDialogButtonBox::addButton.
>Не видел почты, извиняюсь.
Посмотри в любом README на гитхабе (ну кроме MakabaCode, там не указывал его).
Берешь указатель на строку, считаешь сумму, сравниваешь с суммой другой строки, если надо - меняешь местами.
int main()
{
qsrand(QDateTime::currentMSecsSinceEpoch());
int a = new int *[3];
for (int i = 0; i < 3; ++i) {
a = new int[4];
for (int j = 0; j < 4; ++j)
a[j] = qrand();
}
for (int i = 0; i < 3; ++i)
qDebug() << a[0] << a[1] << a[2] << a[3];
for (int i = 0; i < 2; ++i) {
int s1 = 0;
for (int j = 0; j < 4; ++j)
s1 += a[j];
int s2 = 0;
for (int j = 0; j < 4; ++j)
s2 += a[i + 1][j];
if (s2 < s1)
qSwap(a, a[i + 1]);
}
qDebug() << "===========";
for (int i = 0; i < 3; ++i)
qDebug() << a[0] << a[1] << a[2] << a[3];
return 0;
}
[/code]
int main()
{
qsrand(QDateTime::currentMSecsSinceEpoch());
int a = new int *[3];
for (int i = 0; i < 3; ++i) {
a = new int[4];
for (int j = 0; j < 4; ++j)
a[j] = qrand();
}
for (int i = 0; i < 3; ++i)
qDebug() << a[0] << a[1] << a[2] << a[3];
for (int i = 0; i < 2; ++i) {
int s1 = 0;
for (int j = 0; j < 4; ++j)
s1 += a[j];
int s2 = 0;
for (int j = 0; j < 4; ++j)
s2 += a[i + 1][j];
if (s2 < s1)
qSwap(a, a[i + 1]);
}
qDebug() << "===========";
for (int i = 0; i < 3; ++i)
qDebug() << a[0] << a[1] << a[2] << a[3];
return 0;
}
[/code]
Внутри QMainWindow есть QWidget (на кртинке справа), в нем находится QGridLayout (в котором все эти спинбоксы и пара кнопок). Как сделать так, чтобы он притягивался к верхней грани, а не к центру?
[code lang="cpp"]
QWidget w = new QWidget;
QVBoxLayout vlt = new QVBoxLayout(w);
QGridLayout *glt = new QGridLayout;
vlt->addLayout(glt);
vlt->addStretch();
[/code]
Спасибо, работает. Но почему такие костыли? Я думал все должно быть проще, типа alignment или gravity какой-нибудь. Или это я что-то не так делаю и подобный элемент надо пилить по-другому?
>Весьма тонкий реквест "сделай мне лабу". Но хуй с тобой.
Было бы неплохо, если бы у нас в вузе были бы лабы по программированию.
Было бы неплохо, если бы у нас в вузе объясняли Qt.
Было бы неплохо, если бы мы писали на крестах.
Олсо, звучит все дохуя сложно. Именно таблицы, особенно. Буду гуглить и доебываться в треде.
ну вот допустим посчитана сумма первой строки, куда её занести чтобы она осталась? нужно создавать ещё один массив?
Это в ваших говно-хтмлях костыли типа alignment'а, в результате чего в 2015 году нельзя нормально произвольный элемент горизонтально выровнять иначе чем с помощью deprecated-тега <center>. А у нас в Qt все именно так, как и должно быть.
да блин, я не понимаю этот код, объясни пожалуйста подробно как этот код работает))
>Было бы неплохо, если бы у нас в вузе были бы лабы по программированию.
У нас были, но на дельфи, уровня "накидай на формочку элементы".
>Было бы неплохо, если бы у нас в вузе объясняли Qt.
У нас не объясняли.
>Было бы неплохо, если бы мы писали на крестах.
Все писали на дельфи, я писал на крестах. Недавно на госах:
- Так, Бов, готов?
- Готов!
- Да ты, Бов, всегда готов, можно и не проверять.
Это я к чему: сам учиться не будешь, никакие вузы тебя не научат. Ну и похвастаться какой я у мамы молодец, че уж там.
Делаешь пандорический захват, лифтишь в монаду, потом строишь рекурсивную схему (здесь подойдёт зигохистоморфный препроморфизм) как монадический трансформер из категории эндофункторов, и метациклически вычисляешь результат. Любой второкурсник справится. А если делать на анафорических лямбдах — так задачка вообще на пять минут.
Ну вот у меня подобная ситуация на парах. Препод за умного считает, кек.
Но я не знаю html!
А gravity это из ведроида. Ведь это было бы более естественно, задаешь куда оно примагничивается, а не создаешь целый новый слой только для того, чтобы он выравнивал куда тебе надо. Да еще и такой непонятной функцией, как addStretch. Если бы я читал такой код, то захотел бы настучать программисту по башке за то, что названия функций не соответствуют тому, что они делают.
>ведроида
Сначала не хотел дальше читать, но потом прочитал, и понял, что не зря не хотел.
Изучи для начала доки, туториалы, потом уже высказывай мнение, ну. "Не как на ведроиде" - это скорее комплимент.
>Изучи какие охуенные мы делаем костыли вместо того, чтобы по-человечески выравнивать элементы.
Ну объясни мне, умник, каким образом addStretch() связана с выравниванием и как я об этом должен догадаться?
Читать документацию надо, и все будет понятно. addStretch добавляет элемент-спэйсер, это удобнее alignment'ов и gravity. Шел бы ты на свой андроид, раз не нравится.
Прост))
Не надо быть таким нервным. Если ты привык к чему-то это не значит, что это единственно верное и истинное решение.
>Если ты привык к чему-то это не значит, что это единственно верное и истинное решение.
>Ведь это было бы более естественно, задаешь куда оно примагничивается, а не создаешь целый новый слой только для того, чтобы он выравнивал куда тебе надо.
Понятно.
Я рад что тебе все понятно.
Ты, блять, ебанутый? Я просил пример языка, а не пример продукта.
Ты думаешь что я серьезно не знаю этих вещей?
Какой-нибудь новомодный D или Rust
Потому что мы тут всей доской заняты групповым изнасилованием всей твоей семьи.
Т.е. как преобразовать обычный вектор в двумерную матрицу. Олсо программа должна работать с квадратными матрицами, но надо бы проверочку запилить.
Сейчас я застрял на вопросе - как определить, можно ли вектор преобразовать в квадратную матрицу. Например, если std::vector.size() = 9, то надо построить матрицу 3х3, но если равно, например, 8, то нужно выдать сообщение об ошибке(?)
Делаешь пандорический захват, лифтишь в монаду, потом строишь рекурсивную схему (здесь подойдёт зигохистоморфный препроморфизм) как монадический трансформер из категории эндофункторов, и метациклически вычисляешь результат. Любой второкурсник справится. А если делать на анафорических лямбдах — так задачка вообще на пять минут.
няши, подскажите способов как можно обратиться к элементам динамического двумерного массива))
и скажите , можно ли обращаться к элементам такого массива таким образом: ((arr+i)+j)?
Также как и к элементам обычного, в крестах и сишке для обычных массивов a[j] - то же самое что и ((a+i)+j)
Лучше бы методы предложил, злодей.
Ладно, няша, палю годноту: тебе не нужен вектор векторов, ты можешь просто высчитывать индекс в изначальном векторе
типа v[ i * n + j ]
.push_back блеать. Иди читай документацию! www.cplusplus.com/reference/vector/vector/
няши, подскажите пожалуйста как исправить ошибку:3
и всё-таки, помоги пожалуйста, в конце-концов я только учусь))
очевидно, что у тебя слева указатель на инт, а справа инт
Почему я тогда не видел сисек в треде?
Какая разница? Просто съеби.
>Да это шлюха же.
Все, теперь я все понял. Я то думал, как же человек может быть таким тупым и отбитым. Но для шлюхи то это норма.
Я вообще боюсь скринов с++. Но даж мне очевидно, что ошибки тебе студия написала прямым текстом. И да. Перепиши. В таком говне и 10 скобочек можно проебать.
Тебе, плебей, сраный скрипт написали. Ну или хотя бы обертывай свой код в тэг.
> Баззворд на баззворде
а то
> Модули так или иначе поддерживаются в виде плагинов: фабрика р(о)утов и фабрика досок.
странная у тебя какая-то декомпозиция я бы сказал что ее нет, все пермешано и перепутано
есть же проверенная десятилетиями схема: дал(база, фс) <=> сервис("бизнес логика") <=> вью(хттп а твоем случае)
да еще и на каждый раздел по классу, ну что это за говно?
> dispatcher().assign("/create_post", &ThreadRoute::handlePostCreation, route, 1, 2);
и нихуя не понятно без контекста, что в handlePostCreation такого, что не поместится в 5-10 строк лямбды?
какого хуя тут делает какой-то тред? я хочу писать как в синатре, епт, чтобы все было просто и понятно, чтобы прочитать код мог даже человек с трудом понимающий кресты да и руби тоже
get '/b' { return "wakaba has you, " + params[:username] }
и одиннадцатые кресты это позволяют и им уже, на секундочку, 3.5 года
и никакие оправдания про еблю байт и скорость тут не подходят, ты QString'и конкатенируешь, там malloc вызывается чаще, чем в бэ рулетки крутят, ты в sql базу лезешь (хоть и маленькую и быструю), ты используешь ORM
> логика проверки капчи
> валидации других параметров
сервис проверит и кинет эксепшн. хотя проверять там кроме капчи нечего
> обращения к БД
а что там делать то, тем более с орм?
> рендеринга страницы с ошибкой
нинужно, верхний уровень поймает эксепшн на уровне раута и скажет, что хочет 500, остальное сделает, например, тот же nginx
я все еще не могу понять откуда там СТОЛЬКО кода, в том же sqlite небось раз в пять всего больше
любую твою функцию в 50-100 строк можно сделать размером в два-три-четыре раза меньше
половину классов и методов выкинуть нахуй
и вообще урезать всю борду (даже с ембедед хттп сервером и сервер-сайд подсветкой) до 5к. без ущерба функциональности и читаемости хуже ее здесь не сделать, ящитаю, я минут десять бродил по репе в попытках понять, что же от чего зависит и кем вызывается
> Баззворд на баззворде
а то
> Модули так или иначе поддерживаются в виде плагинов: фабрика р(о)утов и фабрика досок.
странная у тебя какая-то декомпозиция я бы сказал что ее нет, все пермешано и перепутано
есть же проверенная десятилетиями схема: дал(база, фс) <=> сервис("бизнес логика") <=> вью(хттп а твоем случае)
да еще и на каждый раздел по классу, ну что это за говно?
> dispatcher().assign("/create_post", &ThreadRoute::handlePostCreation, route, 1, 2);
и нихуя не понятно без контекста, что в handlePostCreation такого, что не поместится в 5-10 строк лямбды?
какого хуя тут делает какой-то тред? я хочу писать как в синатре, епт, чтобы все было просто и понятно, чтобы прочитать код мог даже человек с трудом понимающий кресты да и руби тоже
get '/b' { return "wakaba has you, " + params[:username] }
и одиннадцатые кресты это позволяют и им уже, на секундочку, 3.5 года
и никакие оправдания про еблю байт и скорость тут не подходят, ты QString'и конкатенируешь, там malloc вызывается чаще, чем в бэ рулетки крутят, ты в sql базу лезешь (хоть и маленькую и быструю), ты используешь ORM
> логика проверки капчи
> валидации других параметров
сервис проверит и кинет эксепшн. хотя проверять там кроме капчи нечего
> обращения к БД
а что там делать то, тем более с орм?
> рендеринга страницы с ошибкой
нинужно, верхний уровень поймает эксепшн на уровне раута и скажет, что хочет 500, остальное сделает, например, тот же nginx
я все еще не могу понять откуда там СТОЛЬКО кода, в том же sqlite небось раз в пять всего больше
любую твою функцию в 50-100 строк можно сделать размером в два-три-четыре раза меньше
половину классов и методов выкинуть нахуй
и вообще урезать всю борду (даже с ембедед хттп сервером и сервер-сайд подсветкой) до 5к. без ущерба функциональности и читаемости хуже ее здесь не сделать, ящитаю, я минут десять бродил по репе в попытках понять, что же от чего зависит и кем вызывается
Когда я наследуюсь от него, то получаю 4 link2019 на дефолтные конструкторы\операторы присваивания и на деструктор.
Что я делаю не так? обоссыте, но не выгоняйте
алсо, интерфейс и класс его реализуемый лежат в двух разных dllaх
Почему же этот вариант http://pastebin.com/aEjsKpMK из библиотеки SFML работает так, как ожидается?
stdout распидоралисо слегка
http://ideone.com/R04o96
1. не используй, блядь, *(arr + i) нотацию
2. не используй, блядь, динамические массивы динамических массивов, если точно не уверен, что надо
3. не используй, блядь, транслит
4. называй, блядь, переменные нормально
> чисто виртуальным деструктором
не должно быть такой хуйни, вообще
у всех родителей всегда опустим всякие ебнутые ситуации вызывается деструктор, а это значит, что он обязан быть даже в "интерфейсах"
оптимизатор его, кстати, все равно вырежет нахуй, так что можешь не беспокоиться
потому что он не чисто виртуальный, у него есть имплементация, пусть и пустая и никому не нужная
Знаю про эту хуйню, не знаю почему написал.
В общем проблема осталась
>>460249
Только что проверил - нету
никакой реализации
>>460238
Первая ссылка предлагает сделать мне Construct & Release методы - мне это не нужно
Ну так почему же вот тут все нормально и ожидаемо ? >>460237
алсо, вот щас вынес деструктор помеченный макросом экспорта в cpp файл и все заработало. Почему это произошло?
> Только что проверил - нету
> никакой реализации
в глаза ебешься?
> virtual ~Drawable() {}
> {}
Ну ты серьезно?
Ещё раз.
Есть json файл, который содержит кучу объектов, каждый из которых имеет два массива и одно число. Этот файл подается на вход программе и должен быть обработан.
1. Паринг json файла.
Входные данные я преобразовываю так: массивы => vector, int => int. Полученные вектора отправляю в списки. Вот так я храню их, своего рода очередь.
struct Queue
{
\tstd::list<std::vector<double> > matrixA; //список с первыми матрицами
\tstd::list<std::vector<double> > matrixB; //список со вторыми матрицами
\tstd::list<int> precision; //список чисел
\tunsigned int taskNumber=0; //количество задач всего.
}QueueObj;
Тут возникают сразу же проблемы. Если входных параметров очень много, то жрет дохуя памяти. Олсо только он начинает вычислять, то потребляемая память падает во много раз. Стоит ли просто читать файл частями? Или вовсе начать читать файл каждый раз, когда нужно выполнять следующую задачу?
2. Вот дальше самый пиздец. У меня есть класс, который вычисляет нужные мне значения. То есть есть класс MyClass, который принимает параметры на вход и предоставляет всякие интерфейсы для управления им.
В итоге я пишу что-то вроде
for (int i = Queue.taskNumber; i > 0; --i)
{
/iShit - итераторы списка.
MyClass newTask(iPrecision, buffer, iMatrixB);
newTask.run();
std::vector<double> out = newTask.result();
for (size_t i = 0; i < out.size(); ++i) std::cout << out << std::endl;
}
Я так понимаю, что глупо плодить объекты на каждую задачу? Или вполне нормально, если вычищать их вовремя?
3. Многопоточность. Какие варианты реализации возможны? Я, например, хотел бы сделать отдельный поток, который вычисляет всю парашу, а второй поток общается с первым и примерно сообщает о количестве выполненных операций.
Ещё раз.
Есть json файл, который содержит кучу объектов, каждый из которых имеет два массива и одно число. Этот файл подается на вход программе и должен быть обработан.
1. Паринг json файла.
Входные данные я преобразовываю так: массивы => vector, int => int. Полученные вектора отправляю в списки. Вот так я храню их, своего рода очередь.
struct Queue
{
\tstd::list<std::vector<double> > matrixA; //список с первыми матрицами
\tstd::list<std::vector<double> > matrixB; //список со вторыми матрицами
\tstd::list<int> precision; //список чисел
\tunsigned int taskNumber=0; //количество задач всего.
}QueueObj;
Тут возникают сразу же проблемы. Если входных параметров очень много, то жрет дохуя памяти. Олсо только он начинает вычислять, то потребляемая память падает во много раз. Стоит ли просто читать файл частями? Или вовсе начать читать файл каждый раз, когда нужно выполнять следующую задачу?
2. Вот дальше самый пиздец. У меня есть класс, который вычисляет нужные мне значения. То есть есть класс MyClass, который принимает параметры на вход и предоставляет всякие интерфейсы для управления им.
В итоге я пишу что-то вроде
for (int i = Queue.taskNumber; i > 0; --i)
{
/iShit - итераторы списка.
MyClass newTask(iPrecision, buffer, iMatrixB);
newTask.run();
std::vector<double> out = newTask.result();
for (size_t i = 0; i < out.size(); ++i) std::cout << out << std::endl;
}
Я так понимаю, что глупо плодить объекты на каждую задачу? Или вполне нормально, если вычищать их вовремя?
3. Многопоточность. Какие варианты реализации возможны? Я, например, хотел бы сделать отдельный поток, который вычисляет всю парашу, а второй поток общается с первым и примерно сообщает о количестве выполненных операций.
Блядь, проебался с разметкой. Прошу прощения.
Создаешь класс/структуру для представления объекта - в нем два вектора и число. В одном потоке открываешь файл и читаешь-создаешь по очереди объекты и ложишь их в очередь. Выбираешь какой-то граничный размер очереди, если в очереди находится больше объектов то приостанавливаешь поток на несколько миллисекунд, смотря сколько твои объекты нужно обрабатывать и какой размер очереди (это чтобы очередь не разрасталась до огромных размеров). В другом потоке вытаскиваешь объекты из очереди и обрабатываешь их. В зависимости от характера работы над объектами и системных ресурсов объекты можно вытаскивать и обрабатывать в несколько потоков - конкретное эффективное количество потоков завист от системы, больше не обязательно лучше. Алсо очередь это оперции enqueue и dequeue, то что ты там накалякал это массив. Если будешь делать многопоточность то нужна блокировка на доступ к очереди (это сильно замедлит работу, если объекты обрабатываются быстро) или нужна потокобезопасная неблокирующая очередь.
[code lang="cpp"]
class MyClass : public QRunnable
{
//...
void run() { /.../ }
};
MyClass worker;
QThreadPool::start(&worker);
[/code]
И не изобретай велосипед.
Бля, вот так, разумеется:
[code lang="cpp"]
MyClass *worker = new MyClass;
QThreadPool::start(worker);
[/code]
>"Как мне сделать Х на чистых крестах без библиотек" идут на хуй.
Не идут. Держите платиновые вопросы:
1) Как проверить существование директории КРОССПЛАТФОРМЕННО?
2) Как создать директорию КРОССПЛАТФОРМЕННО?
Т.е. никаких вин-апи и прочего. Нужно, чтобы под линуксом, бсд и виндой код работал. Чтобы вы понимали, что вопрос вполне разрешим, приведу пример КРОССПЛАТФОРМЕННОЙ проверки существования файла на C++11 в одну строчку:
bool file_exists(const std::string& filename)
{
return std::ifstream(filename).is_open();
}
>Не идут.
Идут.
>Как проверить существование директории КРОССПЛАТФОРМЕННО?
[code lang="cpp"]
QFileInfo("/path/to/dir").isDir();
[/code]
>Как создать директорию КРОССПЛАТФОРМЕННО?
[code lang="cpp"]
QDir::mkpath("/path/to/dir");
[/code]
>ложишь их в очередь.
Я короче погуглил и нашел std::queue. Пойдет в качестве альтернативы.
Олсо, как писать в очередь? Предположим, что у нас очередь 10 записей. Программа отработала с 5 объектами, очередь нужно пополнить. Как туда это записывать, чтобы все вычислялось правильно?
Теперь за потоки. Как не обосраться? Ведь два потока будут работать с одной очередью, а значит, что один может без проблем прочитать недописанные данные. Как этого избежать?
Блокировать очередь на время пополнения, потом блокировать её на время чтения?
http://stackoverflow.com/questions/12772227/multi-threaded-global-object-access
Кажется что-то выгуглил.
> Олсо, как писать в очередь?
Не совсем понятно что тебя смущает. Поток смотрит на размер очереди. Если она больше чем 20 (например) поток засыпает на 1 (например) миллисекунду, если меньше, читает из файла следующий объект и ложит его в очередь, потом все повторяется.
Так-с. С deque я вроде бы немного разобрался. Теперь как сделать все по уму?
Мне в голову пришла мысль написать класс Queue, что-то типа такого:
[code lang="cpp"]
template <typename T>
class Queue
{
private:
\tstd::deque<T> deque;
public:
\tvoid push(T const& value);
\tT pop();
};
[/code]
И, например, в функции main открывается первый поток, который создает объект типа Queue и начинает оттуда читать данные.
А в основном потоке мы просто храним ссылку на этот же объект, и читаем оттуда. Функция pop возвращает нужную нам структуру обратно и подчищает список. Ну и в этих функция реализован механизм блокировки потоков.
# define BOOST_MPL_PP_DEF_PARAMS_TAIL_0(i,p,v) BOOST_MPL_PP_FILTER_PARAMS_##i(p##1 v(),p##2 v(),p##3 v(),p##4 v(),p##5 v(),p##6 v(),p##7 v(),p##8 v(),p##9 v())
Ссылка на это же говно ебучее с подсветочкой синтаксиса
http://pastebin.com/LLPFXaxM
Это еще заебись, там есть макросы, которые и просто конкатенируют(!) текстовые преставления(!!!). И вокруг тимплейтов это наворачивают.
Это не язык программирования, это лексически-синтаксическая ХУИТА.
Блядь, у меня дико пылает. Просто неимоверная жопная боль от своей тупости.
Короче этот сраный mutex. Хули с ним делать-то??? Прочитал в документации, что он moveable, но не копируемый. Окей. Ебеся дальше.
Вот у меня есть класс Queue, который реализует всю эту блядскую очередь.
[code lang="cpp"]
template <typename T> class Queue{
private:
\tconst unsigned int MAX = 5;
\tstd::deque<T>\t\t\tnewQueue;
\tstd::mutex d_mutex;
\tstd::condition_variable d_condition;
public:
\tvoid push(T const& value)
\t{
\t\t{
\t\t\tstd::unique_lock<std::mutex> lock(this->d_mutex);
\t\t\tnewQueue.push_front(value);
\t\t}
\t\tthis->d_condition.notify_one();
\t}
\tT pop()
\t{
\t\tstd::unique_lock<std::mutex> lock(this->d_mutex);
\t\tthis->d_condition.wait(lock, [=]{ return !this->newQueue.empty(); });
\t\tT rc(std::move(this->newQueue.back()));
\t\tthis->newQueue.pop_back();
\t\treturn rc;
\t}
};
[/code]
Ну и ясное дело, что теперь нужно эту очередь заполнить. Пока что запилил отдельный thread, который этим дерьмом занимается, но тут же лютый обосрамс, блядь. Вот блядь очевидно, что нужно просто передать этот злоебучий объект по ссылке.
Заебашил функцию
[code lang="cpp"]
void buildQueue(Queue<MyStruct> &taskQueue)
{
\t;
}
//Пишу в main
int main()
{
Queue<MyStruct> tasks;
std::thread t1(buildQueue, tasks);
return 0;
}
[/code]
Все блядь, значение передается по блядской ссылке. Ничего не копируется. Но нет, кумпилятор кричит о том, что видит ошибку.
error C2280: 'std::mutex::mutex(const std::mutex &)' : attempting to reference a deleted function;
Че это за говно такое?
Но это ещё говно. Пытается ссылаться на удаленную функцию. Окей, нахуй thread. Пишу
[code lang="cpp"]
buildQueue(tasks);
[/code]
И что происходит? Программа без проблем компилируется, блядь! Что за говно! Почему мои руки настолько из жопы! Помогите решить, блядь.
Блядь, у меня дико пылает. Просто неимоверная жопная боль от своей тупости.
Короче этот сраный mutex. Хули с ним делать-то??? Прочитал в документации, что он moveable, но не копируемый. Окей. Ебеся дальше.
Вот у меня есть класс Queue, который реализует всю эту блядскую очередь.
[code lang="cpp"]
template <typename T> class Queue{
private:
\tconst unsigned int MAX = 5;
\tstd::deque<T>\t\t\tnewQueue;
\tstd::mutex d_mutex;
\tstd::condition_variable d_condition;
public:
\tvoid push(T const& value)
\t{
\t\t{
\t\t\tstd::unique_lock<std::mutex> lock(this->d_mutex);
\t\t\tnewQueue.push_front(value);
\t\t}
\t\tthis->d_condition.notify_one();
\t}
\tT pop()
\t{
\t\tstd::unique_lock<std::mutex> lock(this->d_mutex);
\t\tthis->d_condition.wait(lock, [=]{ return !this->newQueue.empty(); });
\t\tT rc(std::move(this->newQueue.back()));
\t\tthis->newQueue.pop_back();
\t\treturn rc;
\t}
};
[/code]
Ну и ясное дело, что теперь нужно эту очередь заполнить. Пока что запилил отдельный thread, который этим дерьмом занимается, но тут же лютый обосрамс, блядь. Вот блядь очевидно, что нужно просто передать этот злоебучий объект по ссылке.
Заебашил функцию
[code lang="cpp"]
void buildQueue(Queue<MyStruct> &taskQueue)
{
\t;
}
//Пишу в main
int main()
{
Queue<MyStruct> tasks;
std::thread t1(buildQueue, tasks);
return 0;
}
[/code]
Все блядь, значение передается по блядской ссылке. Ничего не копируется. Но нет, кумпилятор кричит о том, что видит ошибку.
error C2280: 'std::mutex::mutex(const std::mutex &)' : attempting to reference a deleted function;
Че это за говно такое?
Но это ещё говно. Пытается ссылаться на удаленную функцию. Окей, нахуй thread. Пишу
[code lang="cpp"]
buildQueue(tasks);
[/code]
И что происходит? Программа без проблем компилируется, блядь! Что за говно! Почему мои руки настолько из жопы! Помогите решить, блядь.
http://pastebin.com/sjUDQt8A
Никаких препроцессоных условных директив там нет, есличо!
>std::mutex::mutex(const std::mutex &)
Это похоже на конструктор копирования, тоесть твоя очередь таки копируется, попробуй std::ref
Почему? Я же привёл кроссплатформенный способ узнать, существует ли файл, средствами самого языка.
Разве твой костыль не наебнется на проверке существования файла который закрыт для записи?
Все говно аноны, я починил эту парашу, но это говенная реализация. Пока пердолился, нашел producer-consumer паттерн, но на крестах нет, только на C. Но реализовать дико хочется.
Мультитрединг это так охуенно. Сука! Но страданий дохуя.
Олсо, поясните за строчку:
[code lang="cpp"]
this->d_condition.wait(lock, [=]{ return !this->newQueue.empty(); });
[/code]
Что тут вообще происходит? Ну я знаю, что это ламда функция, которая возвращает указатель(?). А что дальше происходит?
Ещё охуительный вопрос.
Мой люкссофт создает 3 матрицы и 1 число, которое нужно поместить в документ .tex. Ясно дело, что там должны быть и другие данные. Типа заголовок, настройки файла и т.д.
Какие способы писать в файл есть? Сейчас я просто топорно пишу нужные мне строки в пустой файл.
>Ну я знаю, что это ламда функция, которая возвращает указатель(?).
Проиграл с тебя. Она возвращает true, если очередь не пуста, и false, если пуста.
Соответственно, если возвращается false (очередь пуста), то блокировки не происходит.
Что мне надо накатить? (Желательно, для винды)
MSVS Express и 100 gramm dlja dushi
[code lang="cpp"]
this->d_condition.wait(lock, [=]{ return !this->newQueue.empty(); });
[/code]
А что тогда в этой строке происходит?
Тред ждёт выполнение условия из лямбды, после чего лочится переданный std::unique_lock.
Еблан что ли? Доки читайhttp://www.cplusplus.com/reference/condition_variable/condition_variable/wait/
Если предикат вернет false, блокировки не произойдет. Нихуя оно не ждет.
Потому что буст - некрасивое говно. Но для данного случая вообще похуй откуда брать исходники, так что хоть из wxWidgets, если так нравится кушать какашки.
Не буду пинать труп Qt-треда, спрошу здесь:
Допустим, у меня есть QGrphicsScene, в которой лежит несколько айтемов, один из которых QGraphicsPixmapItem. Есть ли в Qt стандартные способы узнать в какой из пикселей этого пиксмапа я тыкнул мышкой, учитывая что этот айтем может менять масштаб (setScale()), а сцена лежит в QGraphicsView, который в свою очередь имеет скроллбары.
Можно, но ебано весьма. Сначала определяешь, по какому итему тыкнули, потом находишь его координаты во вьюхе с учетом всяких скроллбаров (вроде видимая часть называется вьюпорт, вот относительно него надо высчитывать), потом сравниваешь с точкой, куда ткнули. Естественно, учитываешь масштаб (алгоритм сам придумай, там несложно, но мне лениво).
Ок, спасибо. Я тут подумал, наверное лучше будет наследоваться от QGraphicsScene и перехватывать всякие QGraphicsSceneMouseEvent. В них вроде есть вся инфа (pos, scenePos, screenPos). Но это опять же куча гемора.
Используй QObject::eventFilter, нахуя от сцены то наследоваться. В любом случае тебе придется вычислять все мной выше перечисленное, способ перехвата события нажатия мыши с вычислением никак не связан.
[code lang="cpp"]
void push(T const& value)
{
{ //Нахуя эти скобочки?
//Выжидаем, когда mutex разлочится и залочить его самостоятельно.
std::unique_lock<std::mutex> lock(this->d_mutex);
//Залочили и пишем в очередь.
newQueue.push_front(value);
}
//Сообщаем ожидающему треду.
this->d_condition.notify_one();
}
T pop()
{
//Блочим mutex
std::unique_lock<std::mutex> lock(this->d_mutex);
//Передаем его в wait, который высвобождает mutex и приостанавливает поток, пока условие не будет выполнено.
this->d_condition.wait(lock, [=]{ return !this->newQueue.empty(); });
//копируем
T rc(std::move(this->newQueue.back()));
//чистим
this->newQueue.pop_back();
return rc;
}
[/code]
[code lang="cpp"]
void push(T const& value)
{
{ //Нахуя эти скобочки?
//Выжидаем, когда mutex разлочится и залочить его самостоятельно.
std::unique_lock<std::mutex> lock(this->d_mutex);
//Залочили и пишем в очередь.
newQueue.push_front(value);
}
//Сообщаем ожидающему треду.
this->d_condition.notify_one();
}
T pop()
{
//Блочим mutex
std::unique_lock<std::mutex> lock(this->d_mutex);
//Передаем его в wait, который высвобождает mutex и приостанавливает поток, пока условие не будет выполнено.
this->d_condition.wait(lock, [=]{ return !this->newQueue.empty(); });
//копируем
T rc(std::move(this->newQueue.back()));
//чистим
this->newQueue.pop_back();
return rc;
}
[/code]
>Нахуя эти скобочки?
Блок в скобках - скоуп. Когда выходим из скоупа, все что в нем объявлено на стеке - удаляется. То есть будет вызван деструктор переменной lock и она больше не будет доступна. btw, лок это нечто типа паттерна - объект, лочащий мьютекс и разлочивающий при разрушении. Удобно, когда неизвестно, где будет выход из скоупа. В данном случае - варварский костыль, здесь бы хватило и простого лок\анлок.
А про остальное написал описал нормально? Просто не до конца вгоняю в концепцию.
Олсо, нагуглил вот этот T rc(std::move..). Что это вообще за конструкция?
Там на место T идет моя структура, но что это вообще такое?
>Передаем его в wait
Ты лок передаешь туда, а не мьютекс. И еще, я тебе уже писал, но ты в глаза ебешься:
>Еблан что ли? Доки читай http://www.cplusplus.com/reference/condition_variable/condition_variable/wait/
>Если предикат вернет false, блокировки не произойдет. Нихуя оно не ждет.
>Нихуя оно не ждет. Предикат выполняется сразу при вызове wait, и в зависимости от него wait либо будет ждать, либо моментально разлочит мьютекс.
Далее.
>std::move
Гугли lvalue, rvalue. Если сложно, то забей пока на это байтоебское говно, оно в 99.99999% задач нахуй не всралось.
А вообще у тебя какой-то говнокод, но это с опытом приходит, ничего.
>Ты лок передаешь туда,
А что такое lock по своей сущности, лол?
Да я весь вечер охуваю. Сначала писал, вроде бы, нормально получалось. Лег спать. Открываю с утра - ЛЮТЫЙ ГОВНОКОД. Сегодня дописывал - плакал. Надо будет зарефакторить.
>А что такое lock по своей сущности, лол?
Ну пиздец, ты читаешь вообще ответы, нет?
>btw, лок это нечто типа паттерна - объект, лочащий мьютекс и разлочивающий при разрушении.
Обертка над мьютексом это. Если ты передашь его в wait, то сначала соответствующий мьютекс разблочит wait, а потом его попытается разблочить сам лок при выходе их скоупа, и твоя параша весело наебнется.
1) Таки я не понял,
>Разве твой костыль не наебнется на проверке существования файла который закрыт для записи?
Наебнётся мой костыль или нет? Не должен же: я проверяю, имеется ли возможность открыть файл на чтение. На мой взгляд, это равносильно проверке на его существование.
Можно ли туда писать или нет, меня не интересует. Меня интересует, существует файл или нет.
2) Хорошо, хочу спиздить исходники. Помоги дауну в этом. Вот имеется код.
>QFileInfo("/path/to/dir").isDir();
>QDir::mkpath("/path/to/dir");
Гуглим.
http://cep.xray.aps.anl.gov/software/qt4-x11-4.2.2-browser/d0/de9/qfileinfo_8cpp-source.html
isDir находится один раз
mkpath вообще ни разу
Что нужно вообще спизидить? Как спизженное будет выглядеть целиком? Помоги дауну.
>я проверяю, имеется ли возможность открыть файл на чтение. На мой взгляд, это равносильно проверке на его существование.
Не равносильно. Файл может существовать, но у тебя при этом может не быть прав на его чтение. Хотя вряд ли сперморебенок с таким сталкивался.
>Что нужно вообще спизидить? Как спизженное будет выглядеть целиком?
Неудивительно, что ты не нашел, там гора кода, много обращений к внутренним классам и тд. Так что походу не проктит. В гугле за первую минуту решения я тоже не нашел. Так что или кури доки по всем платформам и пиши велосипед, или пытайся гуглить с призрачной надеждой на успех, или кончай страдать хуйней и используй предназначенные для этого инструменты.
>Файл может существовать, но у тебя при этом может не быть прав на его чтение.
Согласен.
>или кончай страдать хуйней и используй предназначенные для этого инструменты
По ходу, это. А я так не хотел...
Мне всего-то что нужно, проверить существование файла и папки. Всё остальное у меня велосипед. Ради этого прикреплять мощную библиотеку...
Не могу нагуглить, как библиотеку в Visual Studio подключить. Самому копаться лень, вот и гуглю.
Обожаю, когда твой пердак улетает на орбиту. Это бесценно. Ты вообще единственный, кого я тут узнаю. Я просто тред бампаю.
Не хочу разрушать твою иллюзию, но мне просто доставляет поносить даунов, смешивать их с говном.
Ваш код — не вы. Помните, что вся суть проверки кода в том, чтобы найти ошибки, и они обязательно найдутся. Не воспринимайте как личное оскорбление, когда это случится.
Не важно, насколько вы прокачанный спец. Кто-нибудь всегда знает больше, и у него можно поучиться. Стоит только попросить. Ищите и принимайте то, что говорят другие, особенно когда кажется, что это вам не нужно.
Не переписывайте код без консультации. Есть тонкая грань между «поправить код» и «переписать код». Почувствуйте разницу и преследуйте изменения стиля в рамках штатной проверки кода, а не как одинокий рейнджер.
Относитесь к людям, которые знают меньше вас, с уважением, почтением и терпением. Люди, напрямую не связанные с IT, но которым часто приходится иметь дело с разработчиками, считают нас в лучшем случае зазнайками, а в худшем — нытиками. Не кормите стереотипы гневом и нетерпеливостью.
Единственное, что в мире постоянно — это перемены. Будьте готовы к переменам и принимайте их с улыбкой. Взгляните на изменения в требованиях, платформе или инструменте как на вызов, а не как на неудобство, которое надо побороть.
Единственный истинный авторитет дают знания, а не положение. Знание порождает авторитет, а авторитет порождает уважение. Хотите уважения в среде, где нет места эго — культивируйте знания.
Боритесь за то, во что верите, но непринужденно признавайте поражение. Поймите, что иногда ваши идеи будут отклонять. Даже если вы и правы, не надо мстить и говорить «А я предупреждал, что так будет». Никогда не превращайте отвергнутые идеи в мученический стон или боевой клич.
Не становитесь «тем кодером в углу». Не будьте человеком в темном кабинете, который выходит только за колой. Кодера в углу не видно, с ним сложно связаться, его сложно контролировать. У такого человека нет голоса в открытой, кооперативной среде. Включайтесь в беседы и будьте частью сообщества своего офиса.
Критикуйте код, а не людей. Будьте добры к людям, но не к коду. Насколько возможно, пишите позитивные комментарии, направленные на улучшение кода. Свяжите комментарии с принятым в команде стандартом кода, техзаданием, повышением производительности и т.д.
Ваш код — не вы. Помните, что вся суть проверки кода в том, чтобы найти ошибки, и они обязательно найдутся. Не воспринимайте как личное оскорбление, когда это случится.
Не важно, насколько вы прокачанный спец. Кто-нибудь всегда знает больше, и у него можно поучиться. Стоит только попросить. Ищите и принимайте то, что говорят другие, особенно когда кажется, что это вам не нужно.
Не переписывайте код без консультации. Есть тонкая грань между «поправить код» и «переписать код». Почувствуйте разницу и преследуйте изменения стиля в рамках штатной проверки кода, а не как одинокий рейнджер.
Относитесь к людям, которые знают меньше вас, с уважением, почтением и терпением. Люди, напрямую не связанные с IT, но которым часто приходится иметь дело с разработчиками, считают нас в лучшем случае зазнайками, а в худшем — нытиками. Не кормите стереотипы гневом и нетерпеливостью.
Единственное, что в мире постоянно — это перемены. Будьте готовы к переменам и принимайте их с улыбкой. Взгляните на изменения в требованиях, платформе или инструменте как на вызов, а не как на неудобство, которое надо побороть.
Единственный истинный авторитет дают знания, а не положение. Знание порождает авторитет, а авторитет порождает уважение. Хотите уважения в среде, где нет места эго — культивируйте знания.
Боритесь за то, во что верите, но непринужденно признавайте поражение. Поймите, что иногда ваши идеи будут отклонять. Даже если вы и правы, не надо мстить и говорить «А я предупреждал, что так будет». Никогда не превращайте отвергнутые идеи в мученический стон или боевой клич.
Не становитесь «тем кодером в углу». Не будьте человеком в темном кабинете, который выходит только за колой. Кодера в углу не видно, с ним сложно связаться, его сложно контролировать. У такого человека нет голоса в открытой, кооперативной среде. Включайтесь в беседы и будьте частью сообщества своего офиса.
Критикуйте код, а не людей. Будьте добры к людям, но не к коду. Насколько возможно, пишите позитивные комментарии, направленные на улучшение кода. Свяжите комментарии с принятым в команде стандартом кода, техзаданием, повышением производительности и т.д.
Ваш код - это вы. Помните, что вся суть проверки кода в том, чтобы найти ошибки, и они обязательно найдутся. Воспринимайте как собственную некомпетентность, когда это случится.
Не важно, насколько вы прокачанный спец по нытью на сосаче. Любой ваш одногруппник знает больше, но учить он вас не будет. Не стоит даже просить. Ищите и принимайте то, что пишут в гугле, особенно когда кажется, что проще спросить на сосаче.
Переписывайте код без консультации. Есть тонкая грань между "писать код" и "ныть на сосаче". Почувствуйте разницу и пойдите уже работать над проектом, а не засоряйте доску своими даунскими вопросами по синтаксису.
Относитесь к людям, который знают больше вас, с уважением, почтением и терпением. Люди, напрямую не связанные с IT, но которым часто приходится иметь дело с разработчиками, являются тупыми гуманитариями и могут сосать хуй, их мнение никого не интересует. Кормите их говном и сажей.
Единственное, что в мире постоянно - это ежедневный прирост числа дегенератов. Будьте готовы к наплыву дегенератов и принимайте их с сажей. Взгляните на деградацию доски, вопросы по синтаксису и "как взломать вконтакте" как на вызов, а не как на неудобство, которое надо побороть.
Единственный истинный авторитет дает опыт написания программ, а не кукареканье о кластерах метапарадигм. Написание программ порождает уверенность в своих силах, а уверенность порождает спокойствие. Спокойствие в среде, где полно мамкиных тралей - залог здоровья вашей жопы.
Боритесь за чистоту доски, но непринужденно признавайте поражение от тупости вашего оппонента. Поймите, иногда дауненок просто не способен понять написанное и пытается перевести беседу в тралинг. Даже если вы и не правы, все равно обоссыте ущербного - для профилактики. Никогда не прекращайте окроплять уриной ротешники неофитов.
Не становитесь "тем кодером в углу". Вы уже давно им стали. Не будьте человеком в темном кабинете, который выходит только за колой (ведь можно заказать колу прямо в кабинет). Кодера в углу не видно, с ним сложно связываться, его сложно контролировать. А нам только этого и надо. У такого человека нет голоса в открытой петушиной среде, но все равно чуть что все бегут к нему. Игнорируйте социоблядей и ссыте на них.
Критикуйте и код, и людей. Будьте добры к людям, но не к дегенератам. Насколько возможно, пишите комментарии, отправляющие дауненка в гугл. Свяжите комментарии с принятым на доске стандартом унижать долбоебов, ебать их мамаш, сестер и т.д.
Ваш код - это вы. Помните, что вся суть проверки кода в том, чтобы найти ошибки, и они обязательно найдутся. Воспринимайте как собственную некомпетентность, когда это случится.
Не важно, насколько вы прокачанный спец по нытью на сосаче. Любой ваш одногруппник знает больше, но учить он вас не будет. Не стоит даже просить. Ищите и принимайте то, что пишут в гугле, особенно когда кажется, что проще спросить на сосаче.
Переписывайте код без консультации. Есть тонкая грань между "писать код" и "ныть на сосаче". Почувствуйте разницу и пойдите уже работать над проектом, а не засоряйте доску своими даунскими вопросами по синтаксису.
Относитесь к людям, который знают больше вас, с уважением, почтением и терпением. Люди, напрямую не связанные с IT, но которым часто приходится иметь дело с разработчиками, являются тупыми гуманитариями и могут сосать хуй, их мнение никого не интересует. Кормите их говном и сажей.
Единственное, что в мире постоянно - это ежедневный прирост числа дегенератов. Будьте готовы к наплыву дегенератов и принимайте их с сажей. Взгляните на деградацию доски, вопросы по синтаксису и "как взломать вконтакте" как на вызов, а не как на неудобство, которое надо побороть.
Единственный истинный авторитет дает опыт написания программ, а не кукареканье о кластерах метапарадигм. Написание программ порождает уверенность в своих силах, а уверенность порождает спокойствие. Спокойствие в среде, где полно мамкиных тралей - залог здоровья вашей жопы.
Боритесь за чистоту доски, но непринужденно признавайте поражение от тупости вашего оппонента. Поймите, иногда дауненок просто не способен понять написанное и пытается перевести беседу в тралинг. Даже если вы и не правы, все равно обоссыте ущербного - для профилактики. Никогда не прекращайте окроплять уриной ротешники неофитов.
Не становитесь "тем кодером в углу". Вы уже давно им стали. Не будьте человеком в темном кабинете, который выходит только за колой (ведь можно заказать колу прямо в кабинет). Кодера в углу не видно, с ним сложно связываться, его сложно контролировать. А нам только этого и надо. У такого человека нет голоса в открытой петушиной среде, но все равно чуть что все бегут к нему. Игнорируйте социоблядей и ссыте на них.
Критикуйте и код, и людей. Будьте добры к людям, но не к дегенератам. Насколько возможно, пишите комментарии, отправляющие дауненка в гугл. Свяжите комментарии с принятым на доске стандартом унижать долбоебов, ебать их мамаш, сестер и т.д.
Однако разработка этой программы надоела. Стоит ли доводить проект до конца (новых знаний там прибавится более чем дохуя), либо браться за что-нибудь другое?
Тут два стула. Либо ты бросаешь это говно и начинаешь что-то более полезное, либо доводишь до конца, несмотря на то что это бесполезный калич. В первом случае ты не тратишь время на ковыряние в говне, но привыкаешь забрасывать проекты, во втором - учишься доводить работу до конца, но занимаешься неинтересным и нинужным делом, что тоже хуево. Если же программа нужная и интересная, просто тебе лень - то тут без вариантов: только доводить до конца, иначе так и будешь факториалы всю жизнь писать.
Ну программа нахуй никому не всралась даже мне, однако как я уже выше много технических деталей смогу из неё вытащить. Я сейчас поаутизировал и пришел к выводу, что нужно продолжать пилить её и использовать в качестве полигона для тестов всяких новых фич.
Олсо, поясните за чистку памяти. inb4: используй smart_ptr; Я как-то не особо понимаю, когда надо вычищать память, а когда нет. Есть какой-нибудь гайд?
Ну я обычно стараюсь доделать хотя бы какой-то запланированный минимум, сильно задрачивать говно не стоит.
Память надо освобождать, когда она выделена в куче (heap), то есть при помощи new (malloc на рассматриваю, ибо байтоебское ненужное говно). Когда ты больше не используешь выделенную память (скажем, класс, который выполнял какую-то операцию, отработал), то надо ее освободить, то бишь вызвать delete. Умные указатели сильно упрощают задачу, но в сложных проектах там тоже могут возникать всякие нюансы, типа перекрестный ссылок (тут используют костыль под названием weak pointer). А вот что пишут на СО http://stackoverflow.com/questions/76796/memory-management-in-c Но по мне, так эта ебля с RAII - еще большие костыли, выразительность падает ниже уровня жабы (хотя казалось бы, как такое возможно).
При чем тут -фоб или не -фоб? Зачем использовать буст с его уродливыми названиями и мешаниной нэймспейсов, если есть красивый и приятный Qt? Зачем ебаться с байтами, когда на дворе 2015 год, и даже самый обоссанный китайский телефон на порядок мощнее моего первого компьютера, тянувшего 3д игры на максималках в свое время? Это все просто нинужно в большинстве случаев. Но остается еще "меньшинство случаев", я прекрасно понимаю, что там это все может потребоваться. Но никак не в лаба_2.
Ну и где это применяется на практике? В паре особо требовательных к производительности библиотек да в ядрах каких-нибудь, и все.
> кудкудах кампюктиры мощьные можна говнокодить
Добавьте это тоже в ОП пост с пометкой "нахуй".
Поправочка: ничего не делающий и получающий за это какие-никакие, а копейки. Хотя скоро диплом, и отмазки больше не прокатят, но может что еще придумаю.
Начнешь нормально работать, поймешь, что самописные контейнеры - не такая уж и редкость.
>>461910 – заставил задуматься. Почитал всякие доки и понял, что дико обосрался в одном месте.
>>461916 – Я сейчас пишу в академических целях. У меня дико печет от того, что я не понимаю, как некоторые вещи работают, поэтому стараюсь писать настолько низко, насколько это понимаю. Но в тоже время чтобы это было интересно.
Задача: На вход подается матрица, матрица, и число. На выходе должен быть сгенерирован файл в формате pdf с матрица, матрица, список, число.
Вопросов, конечно, ещё дохуя, но я самые такие базовые спрошу, которые не дают мне покоя. В частности прошу уделить дохуя внимания памяти, ибо я не все понимаю и чую, что где-то насрано. Также не надо писать "пиши на Qt", "smart_ptr" и тому подобное. Пока я хочу поебаться на некотором low-level, чтобы понять что к чему. Потом перепишу, а может быть и заброшу. Хуй знает.
Олсо, почему C такой популярный, а C++ не очень? Останусь ли я без работы, если буду ебаться только с плюсовыми фичами?
1.\tМоя программа течет, блядь. Она сжирает около 200 мб на 175 задач. Или это было на 100 000 задач, не помню. Что дохуя и меня дико раздражает. Каждая задача описывается 4 свойствами:
[code lang="cpp"]
std::vector<double> //чаще всего не больше 20 элементов
std::vector<double>; //чаще всего 4 элемента.
std::list<std::vector<double> > storedIterations; //обычно от 15 до 30 векторов по 3-4 элемента.
unsigned int precision; //редко больше 15;
[/code]
Естественно уж больно дохуя памяти выделается и программа работасет TO SLOW!!
Следовательно, есть ли смысл запилить шаблон для структуры? Задачи чаще всего приходят в формате int, реже в float. Double ещё ни разу не было. Вычисления же должны происходить довольно точно. Но редко в задаче устанавливаются слишком большая точность.
2.\tЗадачи приходят из JSON парсера, который создает объект и тупо его перебирает, извлекая нужные значения в цикле. Отсюда и главный вопрос – как засунуть объект в очередь?
Сейчас у меня это довольно ебануто реализовано.
[code lang="cpp"]
for (size_t i = 0; i < tasks.size(); ++i)
{
\tTaskMeta TaskMetaObj;
\t
\tjson& task = tasks;
\tTaskMetaObj.matrixA = task["matrixA"].as<std::vector<double> >();
\tTaskMetaObj.matrixB = task["matrixB"].as<std::vector<double>>();
\tTaskMetaObj.precision = task["precision"].as<unsigned int>();
\t
\ttaskQueue.push(TaskMetaObj);
\t
}
[/code]
В частности я не понимаю поведение в строчке TaskMeta TaskMetaObj. Ведь таким образом менеджмент памяти будет автоматически производиться, и как только очередь вытащит этот элемент и выполнит удаление, то этот объект будет разрушен?
[code lang="cpp"]
T rc(std::move(this->newQueue.back()));
this->newQueue.pop_back();
return rc;
[/code]
Или нужно создавать этот объект через new и самому вычищать его? Суть в том, что по факту надо протащить этот объект через всю программу, модифицировав его только в одном поле.
Программа использует только два первых вектора и число для вычислений, а в список уже заносит полученные данные, которые печатаются. В результате программа тащит через себя вот это все говно. Я не уверен, что это эффективно.
Ещё есть задумка, чтобы писать в очередь сразу по нескольку объектов. То есть парсер вытаскивает данные из файла, считаем, например, до 10 объектов и кидаем их в очередь, а потом пробуем ещё раз. Если в момент чтения к очереди обращались, то мы опять забиваем на неё и читаем что-нибудь ещё, и пробуем обратиться ещё раз.
3.\tКак организовать класс с вычислениями? Сейчас у меня есть класс, который принимает ссылочку на структуру Class object(const Task& obj); В конструкторе распихивает данные по своим свойствам и производит манипуляции. Возможности сделать члены класса статическими нет, так как между собой функции обменивают большим количеством промежуточных данных.
Что-то вроде
[code lang="cpp"]
TaksMeta task;
Calc taskCalc;
Loop{
task = Queue.Pop() //забираем из очереди
taskCalc (task)//вычисляем
Queue2.pop(taskCalc.result());
]
[/code]
Как в таком случае быть с памятью? Удалять ли каждый раз объект taskCalc? Или он тут раз за разом перезаписывается?
4.\tЗапись в файл. У меня сейчас крайне тупой алгоритм:
a)\tСоздать новый файл.
b)\tЗаписать в него заголовок LaTeX файла.
c)\tВ цикле брать из очереди все обсчитанные задачи.
d)\tДописывать их крайне топорно в файл
e)\tЕсли очередь закончилась, то завершить файл и передать файл на компиляцию.
А я хочу запилить класс, который будет годной оберткой для LaTeX.
file.usepackage->table //сгенерирует \usepackage{table}\n
file.add(“bmatrix”)->vector(std::vector<double>); //\begin{bmatrix} 1&2&3\end{bmatirx}
Это будет куда лучше? В частности документ будет на порядок чище, однако теперь про работу с этим файлом. Я пишу в него заголовок и начинаю дергать объекты из очереди на запись. Документ должен быть сформирован уже сразу “заголовок”+”тело”+”конец”, или можно просто запилить заголовок, дописывать в тело, а потом уже дописать конец файла.
И ещё. Предположим, что задача у нас очень большая, обсчет занял много времени, а очередь с ответами пустует. Стоит ли закрывать в таком случае файл?
1.\tОткрыл файл ->Дописал решение->закрыл файл-> … -> дописал конец файл
2.\tОткрыл файл->Дописал решение->дописал решение->дописал решение->..->дописал конец файла->закрыл файл.
>>461910 – заставил задуматься. Почитал всякие доки и понял, что дико обосрался в одном месте.
>>461916 – Я сейчас пишу в академических целях. У меня дико печет от того, что я не понимаю, как некоторые вещи работают, поэтому стараюсь писать настолько низко, насколько это понимаю. Но в тоже время чтобы это было интересно.
Задача: На вход подается матрица, матрица, и число. На выходе должен быть сгенерирован файл в формате pdf с матрица, матрица, список, число.
Вопросов, конечно, ещё дохуя, но я самые такие базовые спрошу, которые не дают мне покоя. В частности прошу уделить дохуя внимания памяти, ибо я не все понимаю и чую, что где-то насрано. Также не надо писать "пиши на Qt", "smart_ptr" и тому подобное. Пока я хочу поебаться на некотором low-level, чтобы понять что к чему. Потом перепишу, а может быть и заброшу. Хуй знает.
Олсо, почему C такой популярный, а C++ не очень? Останусь ли я без работы, если буду ебаться только с плюсовыми фичами?
1.\tМоя программа течет, блядь. Она сжирает около 200 мб на 175 задач. Или это было на 100 000 задач, не помню. Что дохуя и меня дико раздражает. Каждая задача описывается 4 свойствами:
[code lang="cpp"]
std::vector<double> //чаще всего не больше 20 элементов
std::vector<double>; //чаще всего 4 элемента.
std::list<std::vector<double> > storedIterations; //обычно от 15 до 30 векторов по 3-4 элемента.
unsigned int precision; //редко больше 15;
[/code]
Естественно уж больно дохуя памяти выделается и программа работасет TO SLOW!!
Следовательно, есть ли смысл запилить шаблон для структуры? Задачи чаще всего приходят в формате int, реже в float. Double ещё ни разу не было. Вычисления же должны происходить довольно точно. Но редко в задаче устанавливаются слишком большая точность.
2.\tЗадачи приходят из JSON парсера, который создает объект и тупо его перебирает, извлекая нужные значения в цикле. Отсюда и главный вопрос – как засунуть объект в очередь?
Сейчас у меня это довольно ебануто реализовано.
[code lang="cpp"]
for (size_t i = 0; i < tasks.size(); ++i)
{
\tTaskMeta TaskMetaObj;
\t
\tjson& task = tasks;
\tTaskMetaObj.matrixA = task["matrixA"].as<std::vector<double> >();
\tTaskMetaObj.matrixB = task["matrixB"].as<std::vector<double>>();
\tTaskMetaObj.precision = task["precision"].as<unsigned int>();
\t
\ttaskQueue.push(TaskMetaObj);
\t
}
[/code]
В частности я не понимаю поведение в строчке TaskMeta TaskMetaObj. Ведь таким образом менеджмент памяти будет автоматически производиться, и как только очередь вытащит этот элемент и выполнит удаление, то этот объект будет разрушен?
[code lang="cpp"]
T rc(std::move(this->newQueue.back()));
this->newQueue.pop_back();
return rc;
[/code]
Или нужно создавать этот объект через new и самому вычищать его? Суть в том, что по факту надо протащить этот объект через всю программу, модифицировав его только в одном поле.
Программа использует только два первых вектора и число для вычислений, а в список уже заносит полученные данные, которые печатаются. В результате программа тащит через себя вот это все говно. Я не уверен, что это эффективно.
Ещё есть задумка, чтобы писать в очередь сразу по нескольку объектов. То есть парсер вытаскивает данные из файла, считаем, например, до 10 объектов и кидаем их в очередь, а потом пробуем ещё раз. Если в момент чтения к очереди обращались, то мы опять забиваем на неё и читаем что-нибудь ещё, и пробуем обратиться ещё раз.
3.\tКак организовать класс с вычислениями? Сейчас у меня есть класс, который принимает ссылочку на структуру Class object(const Task& obj); В конструкторе распихивает данные по своим свойствам и производит манипуляции. Возможности сделать члены класса статическими нет, так как между собой функции обменивают большим количеством промежуточных данных.
Что-то вроде
[code lang="cpp"]
TaksMeta task;
Calc taskCalc;
Loop{
task = Queue.Pop() //забираем из очереди
taskCalc (task)//вычисляем
Queue2.pop(taskCalc.result());
]
[/code]
Как в таком случае быть с памятью? Удалять ли каждый раз объект taskCalc? Или он тут раз за разом перезаписывается?
4.\tЗапись в файл. У меня сейчас крайне тупой алгоритм:
a)\tСоздать новый файл.
b)\tЗаписать в него заголовок LaTeX файла.
c)\tВ цикле брать из очереди все обсчитанные задачи.
d)\tДописывать их крайне топорно в файл
e)\tЕсли очередь закончилась, то завершить файл и передать файл на компиляцию.
А я хочу запилить класс, который будет годной оберткой для LaTeX.
file.usepackage->table //сгенерирует \usepackage{table}\n
file.add(“bmatrix”)->vector(std::vector<double>); //\begin{bmatrix} 1&2&3\end{bmatirx}
Это будет куда лучше? В частности документ будет на порядок чище, однако теперь про работу с этим файлом. Я пишу в него заголовок и начинаю дергать объекты из очереди на запись. Документ должен быть сформирован уже сразу “заголовок”+”тело”+”конец”, или можно просто запилить заголовок, дописывать в тело, а потом уже дописать конец файла.
И ещё. Предположим, что задача у нас очень большая, обсчет занял много времени, а очередь с ответами пустует. Стоит ли закрывать в таком случае файл?
1.\tОткрыл файл ->Дописал решение->закрыл файл-> … -> дописал конец файл
2.\tОткрыл файл->Дописал решение->дописал решение->дописал решение->..->дописал конец файла->закрыл файл.
Все может быть, я ж сужу на основании того, что знаю сейчас. Хотя вряд ли мне понравится работать байтоебом (не как что-то плохое, чисто субъективно).
>Хотя вряд ли мне понравится работать байтоебом
Кодинг на С++ - это почти всегда байтоебство. Иди в джаву или сишарп.
>Останусь ли я без работы, если буду ебаться только с плюсовыми фичами?
>Останусь ли я без работы, если буду ебаться только с плюсовыми фичами?
Суди сам http://hh.ru/search/vacancy?text=%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82+c%2B%2B
>течет
>сжирает
Это тащем-то две большие разницы. Течет это когда у тебя память не освобождается и указатель на нее проебывается.
У тебя объект создается на стеке, затем, при помещении в вектор, он копируется (там место под него выделяется динамически, то есть new/malloc, но вектор за этим сам следит). При удалении элемента из вектора/удалении самого вектора объект(ы) удаляются. То есть все ОК.
>Ещё есть задумка, чтобы писать в очередь сразу по нескольку объектов.
Нахуя?
>Удалять ли каждый раз объект taskCalc? Или он тут раз за разом перезаписывается?
Объект создается на стеке, память сама очищается при выходе из скоупа. Ничего удалять не надо (более того, если попробуешь руками удалить, будет сегфолт).
>Это будет куда лучше?
Без понятия. Что ты хочешь этим достичь? Вывод в файл буферизован, так что быстрее не будет.
>Стоит ли закрывать в таком случае файл?
Не стоит по двум причинам: 1. Нахуя? 2. Открытие файла требует времени, при закрытии файла все еще не записанные данные записываются, что тоже требует времени, даже если там всего 1 байт остался.
Алсо, что касается скорости, везде, где идет большое количество добавлений элементов в вектор, замени его на лист. А лучше вообще навсегда забудь про вектор, почти всегда лист будет быстрее (вектор быстрее только когда ты заранее знаешь количество элементов и создаешь вектор нужного размера).
И еще, выражай мысли лаконичнее, это пиздец все это читать.
Нихуя. С кьютом никакого байтоебства почти, ну кроме памяти. Хотя память это скорее такой челлендж, лол, а с умными указателями даже и челленджа нет.
Жабу успел поюзать, когда еще нормально начинал работать, больше не хочу. Язык хороший, но фреймворки с этой аннотационно-XMLной дрисней заставляют блевать перманентно. Шарп - нет, ибо привязка к сперме. Корявые поделки для пинуса, в которых на каждом миллиметре подводные камни нинужны, а официально еще когда портируют, когда отладят. Ну нахуй. Немало языков я попробовал, но только кресты понравились.
Сажа прилипла.
лол, странно, что они этого не описали.
ну список поддерживаемых форматов можно получить через supportedImageFormats(), а вот типы компрессоров хз, попробуй посмотри в исходниках, функция write вызывает
if (d->handler->supportsOption(QImageIOHandler::CompressionRatio))
d->handler->setOption(QImageIOHandler::CompressionRatio, d->compression);
так что лезь в qimageiohandler.cpp
Поидее, раз ты используешь определенный формат, то должен знать, какие уровни сжатия он поддерживает. Qt тут ни при чем. Хотя, конечно, если бы они это написали, были бы еще охуеннее.
Не, ну там же высокоуровневая обертка над ним (соответствующий плагин) и этот setCompression принимает в себя какой-то индекс. Как я, даже зная все поддерживаемые методы сжатия, могу определить какой индекс чему соответствует? В общем, хваленая документация Qt дала тут слабину.
Ты тупой? Допустим, формат жпег поддерживает 100 разных степеней сжатия, по количеству процентов. А формат йоба поддерживает три варианта сжатия: 0, 1, 2 (без сжатия, среднее сжатие, охуенное сжатие). Это от кьюта никак не зависит, а зависит только от самого формата.
Нет, это ты, видимо тупой. Qt реализует плагины для записи/чтения этих файлов, конвертируя степени сжатия в свои какие-то индексы. Где документация по этим стандартным плагинам? Да нету ее нихуя!
Поясню еще: не зависит потому, что кьют, внезапно, использует 3rd party библиотеки для работы с форматами изображений. Для каждого формата имеется спецификация, в которой указано, какие могут быть варианты сжатия. Библиотеки, разумеется, следуют этим спецификациям. Кьют - всего лишь обертка в данном случае. Если сказано в спеках, что фаормат такой-то поддерживает столько-то степеней сжатия, то число в этих пределах и указывай.
Да я тебя, блять и спрашиваю, КАК он конвертирует эти форматы сжатия в свои индексы? КАК он это обертывает? КАКОЙ мне нужно поставить индек чтобы для PNG получить RLE сжатие? В спеке PNG не написано как там какой-то Qt его использует. В 3rd party библиотеках не знают под каким номером Qt поставит то или иное сжатие.Че ты мне загоняешь прописные истины? Где мне найти таблицу соответствия (file format:encoding alg)/Qt index?
>байтоебства
>пригодилось бы на работе
Выбери одно. А если сурьезно, то загугли очередь, только чтоб там описание алгоритма было, без кода. Почитай, вникни, реализуй.
Ты меня спрашиваешь? Хочешь очередь - делай очередь. Хочешь производитель-потребитель - делай его. Но в последнем случае довольно сложно реализовать какой-то общий, универсальный контейнер или алгоритм, обычно такие вещи реализует каждый под свои нужды.
Так все же, почему это нигде не отражено в документации Qt?
Все-таки они основаны на этих библиотеках и было бы правильно описать на чем основывается параметр для каждого конкретного СТАНДАРТНОГО случая.
Впрочем, можешь не пытаться, пикрелейтед. Хинт: такой опции в кьютовом пнг вообще нет. Ну, я тоже могу обосраться, не без этого.
Видимо, не успели, забыли, посчитали что нинужно. С таким то объемом документации не удивительно.
Вопрос номер два? Какого хуя такие вакансии вообще существуют?
http://career.ru/vacancy/13214717?query=C%2B%2B
>Приглашаются студенты 4-5 курсов, выпускники, начинающие специалисты ТЕХНИЧЕСКИХ ВУЗОВ для прохождения стажировки с возможностью дальнейшего трудоустройства
> ТЕХНИЧЕСКИХ ВУЗОВ
Пок-пок, образование не важно
Перевожу с копроративного на человеческий
> студенты / начинающие специалисты
готов работать за копеечку
> 4-5 курсов, выпускники
но въебывать будь добр на полную катушку
> ТЕХНИЧЕСКИХ ВУЗОВ
О Госпади да всем насрать. Главное чтобы количество твоих знаний бесполезной поебени из IT области пересеченное со знаниями бесполезной поебени того кто будет проводить допрос превышало некий критический порог.
это знание студии, знание стандарта 2003, знание 50% стандарта 11, знание стл, основные контейнеры, сложность операций, зачем каджый контейнер, знание исключений, знание неопределнного поведения, знание плюсового ооп, хотя бы до уровня виртуального наследования, понимать зачем нужны виртуальные деструкторы и вкак вообще работает рантаймовый даункаст (виртуальные методы)
понимание многопоточки, и основных примитивов синхронизации. атомики, мьютексы, критические секции, и их гуарды
в связи с гуардом понимать что такое раии
плюс стандартные паттерны обсервер, мвц, стратегия, понимать порядок иницилиазации, понимать как работает выделение памяти, большой плюс, если знаешь что-то о шаблонах, большой плюс если знаешь примерно как это работает на уровне ассемблера всё, не плюс, а просто необходимо знать все типы кастов
статик динамик реинтерпрет конст и си-стайл каст, знать когда и как их использовать, вот пожалуй и всё, что надо знать джуниору
на самом деле не очень много
и быть готовым что собеседующий обязтельно спросить свою любиму задачу не потеме, типа есть кабель из москвы в австралию с таким-то каналом, за сколько пройдет пакет в мегабайт, и там не проебаться со скоростью света, или быть готовым ответить на то, сколько комбинаций выпадает на шестигранных кубиках с повторениями и без
вот в таком духе
а по техническим соотв быть готовым к виртуальным деструкторам, почему нельзя использовать ауто_птр, и сотни других
лол, припекло чет. какого хуя они о себе думают вообще.
Ну так-то дохуя. Но я уже знакомые слова тут вижу и примерно понимаю для чего тут и что надо.
ну да, дохуя, но на самом деле 90% этого есть в любой хорошей книге по с++.
а так, если будешь все это понимать уверенней же в себе сам будешь.
и еще я бы к списку добавил Qt, boost, Win Api хотя бы на уровне "подключал, запускал пару функций".
Это из требований к чистым плюсовикам.
Ну вот из Boost юзал тут недавно. Да и QT. Да и на WinApiшных сокетах чатик писал.
Да в общем-то там нигде, кроме TIFF, сжатие и не поддерживается. Ну что за говно.
Qt все-таки не про работу с изображениями. Поддерживает базовые возможности и норм. Читает то нормально, и ладно.
Проверь как работает operator< с твоими строками, вообще он должен лексографически сравнивать и все должно быть ок, но больше что-то нихуя не приходит в голову. Попробуй версию sort с тремя параметрами.
На стаковерфлов разжевали, оказывается при создании вектора через stream-ы всё распидорашивало. http://pastebin.com/MPMRk4vV заменил на это. В C++ всё через жопу, блядь.
Есть у меня например N векторов, и N пар (Ai, Bi). Есть еще функция, принимающая X, и вычисляющая некоторое значение используя оператор[] на этом X.
Вопрос: Как получить какой то обьект, который бы связал все значения N векторов в один X, так чтобы он "состоял из"
V1[A1], V1[A1+1],...,V1[V1], V2[A2], V2[A2+1], ..., V2[B2], ... Vn[An], Vn[An+1],...,Vn[Bn]
Без копирования, естественно.
Пускай официальный -sage-Qt-ОП-хуй пилит.
Просто ты не используешь нормальные библиотеки типа Qt или хотя бы boost, где вся эта еблся с байтами красиво обернута и работает как надо.
Сломал мозг, читая это математическое говно. Давай на примере с числами.
Новый итт-трендель: https://2ch.hk/pr/res/462718.html
Новый итт-трендель: https://2ch.hk/pr/res/462718.html
Новый итт-трендель: https://2ch.hk/pr/res/462718.html
Новый итт-трендель: https://2ch.hk/pr/res/462718.html
Новый итт-трендель: https://2ch.hk/pr/res/462718.html
Новый итт-трендель: https://2ch.hk/pr/res/462718.html
Новый итт-трендель: https://2ch.hk/pr/res/462718.html
Новый итт-трендель: https://2ch.hk/pr/res/462718.html
Это копия, сохраненная 12 мая 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.