Вопросу по синтаксису идут на хуй. Лабы идут на хуй. "Как мне сделать Х на чистых крестах без библиотек" идут на хуй. Все идут на хуй. Хейтер сосет члены на пару со своей мамашей.
>>511321 Да. Статический член создается один раз для всего класса, а не каждый раз новый для нового объекта класса. Нужно, например, для реализации синглтонов, ну и вообще когда что-то встречается один раз на всю программу.
>>511332 Ты можешь создать массив и записать в него любые байты, например, те, из которых состоит функция. Но легально ее исполнить не получится придется делать reinterpret_cast к указателю на функцию, и по стандарту поведение будет неопределенным, например, может сработать защита от выполнения данных.
>>511337 А если в С++ пишу статическую функцию-член класса она как в сегмент данных попадает?
Всё правильно написал? В динамическую попадают ТОЛЬКО new delete? [code lang="cpp"] #include<bits/stdc++.h> using namespace std; const int Maxn=100020; //статическая int l[Maxn],d[Maxn]; //статическая vector<int>G[Maxn]; //статическая int n,ans; //статическая int sum[Maxn],cnt[202]; //статическая int main() { scanf("%d",&n); int all=0; //стековая for(int i=1;i<=n;i++)scanf("%d",l+i); // i в какой памяти? for(int i=1;i<=n;i++)scanf("%d",d+i),all+=d,G[l].push_back(d),sum[l]+=d; int tot=0,maxx=max_element(l+1,l+n+1); //стековая for(int i=1;i<=maxx;i++) { if(!G.size())continue; int t=0,q=G.size()-1; //стековая for(int j=200;j>=1&&q;j--) { if(q>cnt[j]){q-=cnt[j];t+=jcnt[j];} else{t+=jq;break;} } for(int v:G)cnt[v]++; ans=max(ans,sum+t); } printf("%d\n",all-ans); } [code]
>>511337 А если в С++ пишу статическую функцию-член класса она как в сегмент данных попадает?
Всё правильно написал? В динамическую попадают ТОЛЬКО new delete? [code lang="cpp"] #include<bits/stdc++.h> using namespace std; const int Maxn=100020; //статическая int l[Maxn],d[Maxn]; //статическая vector<int>G[Maxn]; //статическая int n,ans; //статическая int sum[Maxn],cnt[202]; //статическая int main() { scanf("%d",&n); int all=0; //стековая for(int i=1;i<=n;i++)scanf("%d",l+i); // i в какой памяти? for(int i=1;i<=n;i++)scanf("%d",d+i),all+=d,G[l].push_back(d),sum[l]+=d; int tot=0,maxx=max_element(l+1,l+n+1); //стековая for(int i=1;i<=maxx;i++) { if(!G.size())continue; int t=0,q=G.size()-1; //стековая for(int j=200;j>=1&&q;j--) { if(q>cnt[j]){q-=cnt[j];t+=jcnt[j];} else{t+=j*q;break;} } for(int v:G)cnt[v]++; ans=max(ans,sum+t); } printf("%d\n",all-ans); } [/code]
>>511341 Статический метод попадает туда же, куда и обычные методы - в сегмент команд. Суть в том, что методы не копируются для каждого объекта класса. В смысле размещения все функции "статические", потому что все функции, которые вызываются хотя бы один раз, записываются в память и не дублируются. static-методы отличаются только тем, что они не принимают неявно первым параметром указатель на объект, и поэтому их можно вызывать не только от имени объекта как mamka.ebat (), но и вообще при отсутствии объектов класса, от имени всего класса: TvoyaMamka::ebat ().
Написал правильно, i это такая же локальная переменная, ее разместят на стеке.
Анон, вопрос не совсем по С++, но где его еще задать, если не здесь. Если я последовательно, начиная с начала, пишу в файл (в файловой системе NTFS) блоки равные размеру кластера, скажем 2 килобайта, могу ли я быть уверенным, что записав 2Кб данных, будет записан ровно один кластер (я не выйду за его пределы)? И хранит ли нтфс в кластерах какую-либо служебную информацию?
>>511500 Спасибо, ты мне безумно помог! Раз ты так хорошо разбираешься в вопросе, то может ты мне ответишь: как писать блоки так, чтобы они не выходили за пределы кластера?
>>511523 operator>> же. >>511525 Если ты работаешь со стандартной библиотекой, то ты не можешь гибко на это влиять, т.к. считается, что этим занимается ОС, и она наиболее быстро будет их записывать, исходя из ее знаний об оборудовании. Если тебе нужно самому, то, вероятно, придется отказаться от стандартных интерфейсов для работы с файлами и самому работать с ФС на низком уровне. Потому что для обычной записи вообще не гарантируется, что что-либо пишется на диск на самом деле, ты можешь управлять сбросом буфера, но очень толсто, одной командой "сбросить все", и сделаешь только хуже с большой вероятностью. Оно может, например, кэшироваться в памяти, и не сбрасываться на диск вплоть до конца работы приложения. А чтобы работать именно с диском, тебе понадобится отдельная библиотека, наподобие boost::filesystem.
Поясните, я вчера начал изучать ваши кресты, а всё гугланул уже. Хотел спросить - у меня русский язык выводился как крякозябры, решилось всё setlocale(LC_ALL, "Russian"); в мейне. Не думал что тут такие же кодо-проблемы уровня пхп.
>>511554 Тут вопрос не в библиотеке, и не в том, когда данные записываются, я могу вообще использовать WinAPI, вопрос в том: доступен ли пользовательским данным весь объем кластера на диске, или в нем содержится еще какая-то служебная информация? Это вопрос о структуре NTFS. Я пытался найти инфу, но там в основном о структуре тома, если ты знаешь где можно почитать, то скинь.
>>511626 Есть официальный репозиторий с программами. Не надо вирусов бояться. Можно легко панель задач настроить. Ярлыки вверху, открытые приложения внизу. Несколько рабочих столов. Куча легко настраиваемых плагинов. Многое можно сделать всего одной командой в консоли.
>>511599 Нет, для служебной информации просто резервируются отдельные кластеры. В принадлежащих файлу все только по существу, нет указателей на следующий кластер или чего-то подобного. Только данные.
поцаны, я совсем зеленый и смотрю вот у вас список литературы для нубов, да. Я, допустим, начал с "Страуструп Б. - Программирование. Принципы и практика использования C++". Почему его нет в рекомендованных, я сильно ошибся с выбором первой книги или это дело вкуса, объясните немного, не пинайте.
Поясните, вроде гуглил - пишут чтобы найти арифметический корень в спп надо использвать pow, но я пишу: pow(n, 1/2), где n =, например 9. А оно мне отвечает на любое число 1.
>>511945 >>511945 У них большая разница в скорости. Те кто fscanf писал сделали за 60 мс, а те что fstream за 150 мс. При чём алгоритм был примерно одинаковый.
%Только что сам замерил программы с пика вышло 320 и 360 мс и fstream быстрее. Что можно вместо .c_str() делать и можно сразу оба варианта использовать?%%
А как сейчас относятся к исходникам, где нет разделения на .h/.cpp? Ну т.е. если код всего класса пишется сразу в один файл, без выноса тел функций в .cpp - сильно говнокодом считается или всем похуй?
Неужели до сих пор вручную все кодят заголовки, и потом, когда решают добавить функцию в класс, рыскают по двум файлам?
>>511955 Два файла делают тогда, когда распространяют библиотеку без исходного кода, в остальных случаях это не принципиально. Стандартная библиотека написана без разделения.
>>511968 Ты совсем упоротый? Открой какой-нибудь list.h там будут описаны и классы и функции, если ты найдешь в стандартной библиотеке list.cpp то сообщи.
>>512001 Нет, tmp это таки будет rvalue reference, сам объект 90 будет жить, пока живут ссылки на него. Другое дело, что в метод его нельзя передать, если параметр объявлен как &&, а если параметр & или по значению, то можно. Я, если честно, не совсем понял, почему так происходит, вся эта тема с rvalue оказалась глубже, чем я думал. Но абсолютно точно tmp не будет непосредственно интом в твоем случае.
поцаны, обоснуйте за assert(); Насколько мне известно, то он помогает отлаживать программы. Но у меня возник вопрос, он умеет выводить сообщения об ошибке только в консоль или же нет. Да и ваще нужен ли он? Или нахуй не сдался, если не собираешься крупного пилить ничего.
>>512035 >сам объект 90 будет жить, пока живут ссылки на него но я же не могу уничтожить эту ссылку, его время жизни такое же как и у инта в этой функции.
>в метод его нельзя передать, если параметр объявлен как &&, а если параметр & или по значению, то можно и инт точно также
> вся эта тема с rvalue оказалась глубже, чем я думал Да это просто какой-то пиздец! А потом они удивляются, почему, блядь, все на яву переходят.
Я нуб, прочитал книгу Шилдта Базовый курс C++ (из шапки). Перед прочтением думал, что знаю плюсы, надо разве что библиотеки вроде буста и qt4 выучить. Оказалось, что вообще не знаю нихуя.
Придумайте для меня задание (проект какой-нибудь), чтобы у меня был стимул изучить актуальные библиотеки. А то скучно самому высосанные из пальца задачки решать.
>>512101 Напиши два драйвера для мышки: первый может передвигать указатель только в право-влево, а второй - вверх-вниз, один устанавливаешь на одну мышку, второй на вторую. Таким образом тебе чтобы навести курсор в нужное место нужно будет работать обеими руками, причем в разных плоскостях. Не благодари.
А как сделать, чтобы экземпляры класса могли взаимодействовать друг с другом? Чтобы один экземпляр через свой метод мог вызывать методы другого экземпляра. Или чтобы один экземпляр через свой метод мог менять свойства другого экземпляра.
>>512167 >>512174 Передавай второй экземпляр в качестве аргумента и вызывай себе. Это ничем принципиально от передачи чисел и строк не отличается, то есть это правда как в носу ковыряться
>>512085 >но я же не могу уничтожить эту ссылку, его время жизни такое же как и у инта в этой функции Ну, лол, так и есть. Кресты это тебе не утиный язык. Если tmp выглядит как инт и применяется как инт, то это еще не значит, что он будет инт.
>>512075 Тем, что при использовании нескольких библиотек даже в небольшой программе могут перекрываться имена, в зависимости от того, какой using nsmespace сделали раньше. И такую ошибку хуй найдешь потом. Лучше написать using std::TvoyaMamka для сущностей, которые используешь, тогда, по крайней мере, ты сможешь точно знать, откуда взято имя.
Решил для себя выучить c++, потому что я любитель таких оладий. Учу по бумажной версии "Объектно-ориентированное программирование в C++ " и дико охуеваю от количества опечаток, как понимаю такая херня только в русской версии. Но появился один интересный код, цитата [code] #include <iostream> #include <cstring> using namespace std; //////////////////// int main() { char str1[] = "Malen'coi yolochke holodno zimoi."; const int MAX = 80; char str2 [MAX];
for ( int j = 0; j <= strlen(str1); j++) str2[j] = str1[j]; str2[j] = '\0';
cout << str2 << endl;
return 0;
} [/code]
Компилятор g++.exe дико охуевает от происходящего и плюется ошибками. В частности строка "str2[j] = '\0';" бред сивой кобылы, ибо переменная j не работает вне области видимости цикла for. Так же "for ( int j = 0; j <= strlen(str1); j++)" по той причине что strlen(str1) возвращает unsigned значение, а компилятор не хочет сравнивать signed и unsigned.
Я ебанул вот так: [code] #include <iostream> #include <cstring> using namespace std; //////////////////// int main() { char str1[] = "Malen'coi yolochke holodno zimoi."; const int MAX = 80; char str2 [MAX];
for (unsigned int i = 0; i <= strlen(str1); i++) { if (i < strlen(str1)){ str2 = str1; } else{ str2 = '\0'; } }
cout << str2 << endl;
return 0;
} [/code] И два вопроса. Норм я сделал? Может я не понял дохуя хитрый ход автора в его примере?
>>512260 Насчет счетчика, такой код как в книге будет вроде работать с майкрософтовским компилятором. Так как ты сделал вообще не вариант, или обяви переменну счетчика перед циклом, или сохрани длину строки strlen(str1) в отдельную переменную size (например) и в цикле будет условие i < size, после цикла str2[size] = '\0'; Насчет сравнения беззнаковых с знаковыми - у тебя наверное жесткие настройки компилятора, он должен такое компилировать, просто что это UB. Ну и так как ты сделал это правильно, UB желательно не допускать, особо хитрожопые компиляторы могут вообще такой цикл выкинуть с таким сравнением как в книге.
>>512376 >Два файла делают тогда, когда распространяют библиотеку без исходного кода ну правильно, стандартная библиотека распространяется с исходным кодом, и там один файл >описаны я не очень удачно выразился
>>512391 Если не смущает операционная система виндоуз то Visual Studio. Альтернативные варианты Code::Blocks и Qt Creator - это из тех что проще всего навернуть. Совсем небольшие куски кода можно в ideone тестить.
>>512543 А что ты новичку посоветуешь? Vim? Emacs? Студия потому-что скачал и программируешь, даже формошлепствовать можно. Кобдблокс - скачал правильную версию (с компилятором) и программируешь. Размер не сильно важен. Наберет опыта - выберет инструмент под свои цели.
Кстати, вчера VS13 community поставил. На крестах третий год уже ни строки не писал. Захотелось посмотреть, что изменилось.
Нихуя не изменилось. Разработка под C++ как была, так и осталась адскими муками. Начиная с самого малого. Вот надо мне заюзать класс из сторонней библы. Как я в других языках/IDE это делаю? Project properties > sources > add dir. Всё. Что я должен сделать в VS? То же самое плюс указать каждую папку библы в additional directories и вручную включать через include хуй знает какой хедер, чтоб этот класс появился - и так в каждый файл с кодом. И пока не просидишь в гугле и не найдешь название хедера, в intellisense этот класс даже не появится. Т.е. приходится реально зубрить внутреннее устройство фреймворков, вместо того чтобы нажать ctrl+space, ввести часть названия класса на интуитивном уровне (Sprite, i.e.), и насладиться автодополнением в полном виде.
Может, я таки не разобрался, и есть плагины/опции студии, позволяющие избегать этого геморроя и автоматизирующие процесс?
>>512559 А когда в "других IDE" ты указываешь путь, а по нему, допустим, несколько версий либы для разных сборок, ты что будешь делать-то, ммм? В VS подключение в джва действия: добавляешь папку с либой в additional headers и добавляешь пусть к самому .lib. Действий на 10 секунд, зато гибкости больше на порядок. Можно регулировать debug/release версии либы и вот это все.
>>512559 В библиотеке есть TvoyaMamka.h и TvoyaBabka.h. В обоих есть классы Korzinochka с разными интерфейсами. Ты пишешь Korz без подключения хедера, что по-твоему происходит?
>>512565 >путь, а по нему, допустим, несколько версий либы для разных сборок Даже больше скажу. Обычно у меня это несколько натив расширений для андроида, iOs, библиотеки для PC, либы для веба. 4 сборки. Никаких проблем, все обрабатывается и подключается автоматически.
>добавляешь папку с либой в additional headers и добавляешь пусть к самому .lib. Действий на 10 секунд Хех. А про прописывание ручками include в каждом файле (а их сотни)? Далеко ходить не надо - пока не пропишешь include <string>, у тебя нет доступа к классу std::string. Тогда как в том же не самом лучшем эклипсе import-ы прописываются автоматически и в intellisense показываются все (вообще все) классы. Вот я и интересуюсь - мб можно так же в VS сделать? Похоже, нет.
>>512568 Высвечитыается список: Korzinochka - TvoyaMamka Korzinochka - TvoyaBabka Выбираешь один из них (enter или вниз, enter) - эклипс сам добавляет соответствующий хедер.
>>512600 >Выбираешь один из них (enter или вниз, enter) - эклипс сам добавляет соответствующий хедер Хм. Надо будет тогда глянуть. А что там насчет отладки, можно смотреть/менять переменные? Многопоточная отладка есть?
>>512607 Какая передача функции, лол? Для нормальной работы с передачей первоклассных функторов не нужно перезаписывать код, они же энивей реализуются через указатели. А товарищ спрашивал про что-то из разряда самомодификации, исполнения стека и вот этого всего. Подобное байтоебство вообще относительно легально только в виде голого асма, никто и никогда не предоставляет таких средств жи. Тем не менее, после некоторых плясок на крестах можно такое провернуть, а вот в джаве/питоне/функциональной параше ты соснешь с такими задачами абсолютно точно.
>>512602 С многопоточностью не работал (игры и простые аппы пилил). Отладка норм, все смотрится и изменяется на лету, но вроде отмотки назад (intellitrace?) нет. Но это для java/as3. С крестами там, похоже, жопа еще больше, чем в VS, я час проебался с хелло вордом, но так его и не запустил. Каждые 5 минут ошибки, и на эти ошибки куча топиков в гугле, т.е. это типа так и надо. Все через жопу.
Еще мне жутко не хватает рефакторинга. В эклипсовых IDE выделяешь класс, жмешь хоткей (ctrl+shift+r), вводишь новое название - все переименовывается само - и классы и конструкторы, и файлы, и хедеры. Но уж это я надеюсь в плагинах VS найду.
>>512613 Нене, рефакторинг уже завезли в VS2015, по ощущениям охуенно. Там вообще много добавили, например, графики занятой памяти и загрузки ядер. Анимированные, блядь, графики, в реалтайме, я аж теку. Только предрелизная версия не до конца вылизана, но релиз уже скоро.
>>512611 >статические члены класса выделяются при старте в сегменте данных >статические функции могут быть статическими членами класса >значит статические функции-члены класса тоже хранятся в сегменте данных? >НЕТ!! в сегменте данных хранятся только МАССИВЫ!!!! Сделай функцию МАССИВОМ!!!
>>512645 А теперь мне дураку расскажите. Например обыные переменные и указатели хранятся на стеке. А массивы типо int m[5] хранятся где? А функции как хранятся? Указатель в стеке, тело в куче?
>>512650 Потому что в современных системах не используется сегментная организация памяти. Используется страничная, когда каждому процессу присваиваются определенные страницы виртуальной памяти, которая не равна по размеру аппаратной. Процесс видит только виртуальную память, причем только свои страницы, а при обращении по адресу процессорное ядро аппаратно просматривает таблицу страниц и преобразует виртуальный адрес в настоящий. Страницы тоже делятся на страницы с "данными" и "командами". Но никто не мешает дополнительно подкачать сколько угодно виртуальных страниц можно адресовать до 2^64 байт, ну ты понел, которые хранятся на диске, пока не используются. Поэтому все ограничения на размер идут не от реальных размеров сегментов, а от того, что ОС не хочет выделять процессу моар. А т.к. считается, что куче и стеку нужно разное количество памяти, то и ограничения разные.
>>512656 Ну вот смотри. Ты написал программу, откомпилировал, она преобразовалась в машинный код. Когда ты запускаешь ее, загрузчик ОС берет весь код из файла и копирует в область памяти с кодом. В файле отдельно описаны статические переменные, для них загрузчик зарезервирует место в области данных. А вот все остальные переменные не требуют никаких отдельных действий загрузчика с памятью. Какое-нибудь {int a;} преобразуется в PUSH/DEC BP в самом коде, где она используется. Поэтому они и называются автоматическими, в том смысле, что они автоматически создаются самим кодом на стеке, без участия загрузчика. Массивы в этом плане ничем не отличаются.
>>512675 Ну, я после Машечкина все кристально понял, например. Правда, когда он анально карает за пропуски лекций, а зимой хардкорный экзамен, это немного другое, чем читать книгу.
>>512683 Я же скромняша. Не уверен был, что кому-то это нужно будет потом. Если хотите, буду схоронять, конечно. Алсо, вообще пилите пожелания/предложения/литературу для шапки/что угодно. В новом треде тогда добавлю по реквестам.
>>511579 В винде большие проблемы из-за codepage 866 в консоли. Надо или сохранять файл в 866, или подменять cout на что-то с конвертом, или менять шрифт в свойствах cmd.exe через alt-пробел. А в линуксах проблем не помню.
>>512687 >литературу для шапки Может Бьерне Страуструп "Программирование. Принципы и практика использования C++" в раздел для новичков? >пожелания Переконвертить все книги из ОП-поста в пдф, выложить прямую ссылку на файл чтобы можно было просмотреть в браузере и сократить ссылку с помощью гугла. Возможно для тебя одного это будет сложно поэтому я разберусь как это сделать и помогу.
А теперь о том, как собственно увеличить скорость <fstream> . Дело в том, что потоки ввода/вывода в C++ имеют кроссплатформенную реализацию, и эта реализация может с разной скоростью работать на разных операционных системах / компиляторах. Как работают потоки (since C++11): им даётся имя файла std::string и они конструируют объект типа std::fstream (например std::fstream , это уже ты решаешь), который имеет... та-дамм! Буфер для чтения и/или записи.
>>512796 Размер буфера и специфика работы с ним определяются спецификой операционной системы и колдовскими настройками компилятора, т.е. выходит за рамки кроссплатформенности в каждом конкретном случае, вследствие чего реализация скрыта внутри. Т.е. если, например, писать некий char array в файл, то выполняется двойная работа: сначала он пишется в буферный char array, потом буферный char array пишется в файл. Всё это снижает скорость в некоторых случаях более чем в 2 раза, зато гарантированно работает на любой платформе / операционной системе. Но буфер можно отключить (при помощи публичного метода), если ты уверен, что разобьёшь свой массив на подмассивы размера строго меньше либо равного размеру буфера в твоей ОС.
>If setbuf(0,0) is called on a stream before any I/O has occurred on that stream, the stream becomes unbuffered. >... Note that some compilers (eg. gcc) see opening a file as an I/O operation on the stream, so pubsetbuf should be called before opening the file (as above).
>>512704 На самом деле у меня вся литература и дохуя по крестам, не вошедшего в шапку уже есть в pdf/djvu, только заливать я не знал куда, поэтому искал по новой на книгообменниках. Вообще, годная идея же, надо тогда найти, где размещать будем это все, чтобы прямая ссылка не привязывалась к ойпи.
>>512847 Пробовал на dropbox, но там качать неудобно. Пробовал на какой-то вечный файлообменик, но там скорость маленькая. В контакт получилось удобнее всего. Так https://vk.com/doc10903696_406254436 или https://goo.gl/43uPI1 но только пдф надо. Если боишься что кто-то про твою страницу узнает могу сам всё залить. Только выложи пдэфы которые есть чтобы самому не конвертировать.
>>512915 >Как в этом случае выводить int, string или double?
Выводить куда, в файл? Там же русским по белому написано:
>for (std::size_t i = 0; i < n; ++i) >{ > fill_array(any_type_array, i); > ofs.write(reinterpret_cast<const char>(any_type_array), array_size); //std::streamsize array_size >}
Если у тебя единственное int number записать надо, то, если не ошибаюсь, >ofs.write(reinterpret_cast<const char>(&number), static_cast<std::streamsize>(sizeof(int)));
Но с С++11 можно использовать перегруженные операторы >> << и для бинарного I/O, поэтому >std::ofstream ofs; //only writing >ofs.rdbuf()->pubsetbuf(0, 0); //both zeros to disable buffer >ofs.open(filename, std::ios::binary); //std::string filename >ofs << number; //int number
>>512944 Вот мои схороненные. Нюфажеские я не схоронял, но они в шапке уже по прямым ссылкам, так что можно взять оттуда для конвертации в pdf. http://my-files.ru/9n9v2o
>>512947 1. Там повторяются старые и новые издания. Ничего страшного если залью только новые? Если надо будет потом старые добавлю. На пике выделил те что можно не заливать. 2. Джоссатис больше чем пол гига весит. Попробуй у себя поискать пдф поменьше, а я ещё раз в инете гляну. Если не найдём оставим то что теперь в шапке. 3. Записал годы выпуска английской версии. В интернет при поиске показывает год выхода русской версии. Может для удобства поиска их через / написать? Или это излишне?
>>512968 http://tonsky.livejournal.com/221767.html вот этого почитай Алсо на пикрилейтеде моя схема. Подсвечены только идентификаторы, комментарии и текст в кавычках. Вообще не понимаю, почему по дефолту всегда и везде подсвечивается всякое говно вроде int или using, блять, в этом же вообще смысла нет.
>>512976 > Он тоже подсвечивается Ещё светлее его сделай. > цвет идентификаторов и текста в кавычках похож Ярко голубой и фиолетовый. Ты либо толстишь так, либо и впрямь поезавший.
>>512979 > У тебя всего 3 цвета на чёрном фоне Ты статью читал вообще? > Мог бы цвет в кавычках красным сделать для контраста Я не понимаю, он недостаточно контрастный для тебя? Сливается с фоном или что? Ты уже сетчатку себе спалил к хуям свой цветовой схемой, ничего не видишь.
Почему нет, если явно текст в файл не пишешь? Бинарный режим не нужен, если у тебя возможна ситуация, когда один чар может быть записан более чем одним байтом. Я не настаиваю (не эксперт), просто интересуюсь, какие возможны варианты.
>>512946 >Что я не так делаю? Применяешь мой совет по быстрой записи больших массивов (но не больших, чем может записать ОС) к записи микроскопических данных.
Кто виноват? Не ты, а я, что дал глупый совет >>512936 записывать единичные int, double и небольшого размера std::string -- не подумал.
Почему этот совет подходит только для массивов среднего размера? Объясняю на пальцах: отключение буфера приводит к тому, что на каждый чих <fstream> обращается к жёсткому диску как только ему ОС предоставляет такую возможность физически. Если к жёсткому диску обращаться 100 000 раз ради нескольких байт, можно и жёсткий диск попортить при частом использовании твоей программы. Работать в любом случае будет медленно.
Что делать? Установить размер буфера равным (или делящимся нацело, если есть подозрения, что ОС не сожрёт записать такой объём за один раз) количеству итераций по записи значения * на его sizeof .
Попробую переписать твой пример (напоминаю, что согласно стандарту char имеет вместимость 1 байт, что не факт что верно для bool, но это уже offtop):
>#include <fstream> >#include <cstdio> //std::size_t >#include <string> > >int main () >{ > const std::size_t n = 100000; > char ofs_buffer[n]; > std::ofstream ofs; > ofs.rdbuf()->pubsetbuf(ofs_buffer, n); > std::string str = "123456789012345678901234567890"; > for (std::size_t i = 0; i < n; ++i) ofs << str; > return 0; >}
Подразумевая, что сто килобайт сможет записать на диск любая ОС, и мы не сломаем твой жёсткий диск. Вот сейчас ты будешь иметь sizeof str обращений к жёсткому диску (в данном случае 30, если смотреть на мой код).
Вот теперь давай измерения времени сюда с и без строчки >ofs.rdbuf()->pubsetbuf(ofs_buffer, n);
>>512982 В примере на котором тестировал в первый раз было не 30, а 1000 символов в строке. Теперь результат от 30 до 40 мс. Это слишком мало чтобы сравнивать. Не слишком опасно сделать размер строки 1000 символов?
>>512985 >Почему размер буффера не резмер строки, а количество обращение? Ещё раз: ты хочешь 100 000 раз обращатсья к диску? Скорость запись на диск во много раз медленнее, чем работа с оперативной памятью.
>>512986 Лучше увеличь n в 100 раз. Всё равно задаётся константой в начале кода, а размер строки сделай символов 10-30, как удобно тебе. Жду 2 скриншота кода с и без выставления буфера результаты измерений в мс.
>>512988 Кажется понял. Вместо того чтобы выводить строку в файл он пишет его в буфер. А когда буфер в оперативной памяти заполниться он его выводит в файл. Тоесть чтобы к диску меньше раз обращаться надо увеличить буфер так чтобы в него влезло больше строк. А если размер строк очень большой, то буффер надо убрать и он сразу огромную строку выведет в файл не занося повторно в память. Всё правильно понял? >>512993 Он дэфолтный. В настройках другой схемы нет. Самому пердолить желания нет. Может потом из интета скачаю красивую цветовую схему.
>>512967 1. Там самые новые, которые я нашел. Т.е., допустим, если про шаблоны 96 года, то новых изданий не было, либо я долбился в глаза и не нашел их. В таком случае буду очень признателен, если ты покажешь, где есть что-то новее моих. 2. Это ты его сконвертировал, и он таким большим стал? В djvu же всего 50 МБ. Можно файнридером его распознать, ну или оставить djvu, мне кажется, новизна издания важнее удобства/размера. 3. Да можно вообще не писать, лол. Если там будут самые новые, анон откроет файл, и в нем уже указаны все подробности, на странице, где типографская инфа.
>>513000 Вдогонку: ну я же вот открыл исходную djvu, там прямо на первой странице написано про 2003 год. Ты бы тогда брал эти даты из самих файлов, а не из интернетов, изданий-то много разных, некоторым уже по двадцать лет.
>>513004 Еще вдогонку: я таки долблюсь в глаза и перепутал соседние файлы. У тебя все правильно, но таки ссылки на новые издания для выделенных реквестирую.
>>512989 >Спасибо. Получилось. С оптимизацией за 310мс. Без оптимизации 410 мс. Я ожидал большего. Впрочем, какая ОС, какой компилятор? Скажи, а я поделюсь своими наблюдениями про "без буфера массивы среднего размера".
Небольшое дополнение: при отключённом буфере нужно не прошляпить момент, когда в общем-то любая ОС сможет записать твой массив за один раз. 4 мегабайта, полагаю, любая современная ОС может записать за 1 раз. Ну и не забывай про всяческие sizeof, чтобы не прострелить себе ногу, ведь стандарт строго регламентирует только sizeof(char) == 1.
>1. Там самые новые, которые я нашел. Т.е., допустим, если про шаблоны 96 года, то новых изданий не было, либо я долбился в глаза и не нашел их. В таком случае буду очень признателен, если ты покажешь, где есть что-то новее моих. А нет таких же книг, но поновее и другого автора?
>2. Это ты его сконвертировал, и он таким большим стал? В djvu же всего 50 МБ. Можно файнридером его распознать, ну или оставить djvu, мне кажется, новизна издания важнее удобства/размера. Тоже в инете ничего не нашёл. Заливать не буду, а возьму ссылку из шапки.
>3. Да можно вообще не писать, лол. Если там будут самые новые, анон откроет файл, и в нем уже указаны все подробности, на странице, где типографская инфа. Так проще неверно ориентироваться в файлах. Ладно это оставлю как есть.
>>513004 Брал данные не с первой странице, а английское издание как на первом пике.
>>513008 На втором пике не они? Те же книги на ту же тему, от тех же авторов, но поновее.
>>513011 >Я ожидал большего. Раньше >>511954 обычный fstream без оптимизации 320 выдавал, а fprintf 360. Во всех случаях выводил 100 МБ. Теперь только больше раз выводил меньшую строку.
>какая ОС, какой компилятор? GCC с линуксом. screenfetch почему-то не работает.
>>513065 >А нет таких же книг, но поновее и другого автора? Ну, Мейерс это своеобразный гуру, в других книжках обычно более примитивные рекомендации даются. А тут что-то на уровне собрания статей из блога, как делать лучше всего. Энивей, подобные вещи не сильно устаревают, там же нет жесткой привязки к синтаксису, так что сойдет и 2000 год, думаю. Она больше не перевыпускалась, к сожалению, но у него вышла новая книга Effective Modern C++ я ее тоже залил в архив, правда она до сентября только на ангельском будет. >На втором пике не они? Те же книги на ту же тему, от тех же авторов, но поновее. Нет, другие. У Саттера и Мейерса они именно дополняют первые, рассказано то, что не вошло в предыдущие. Джоссатис и Вандевурд это тоже другая, но вот она таки немного устарела уже, шаблоны сильно обновили в новом стандарте. Можно ее не включать, думаю.
>>513075 Заливать то что на пике? Теперь не могу, но сегодня начну. Завтра закончу. И одним постом отчитаюсь. Если ссылки через гугл сокращу лучше будет? Они же вечно работают?
>>513068 >Раньше >>511954 обычный fstream без оптимизации 320 выдавал, а fprintf 360. Во всех случаях выводил 100 МБ. Теперь только больше раз выводил меньшую строку.
Вот теперь я вообще ничего не понял. Ты мне вот этот код >>512989 , его же с закомменченными 8 и 10 строкой, и сишную запись в файл. Хотелось бы увидеть три цифорки с миллисекундами.
>GCC с линуксом А, ну ожидаемо, что ручной оптимизацией ты выиграл (410-310)/310 = 32%, это не так плохо. В винде-то всё ещё деревяннее.
Это я к тому, что в винде при записи средних и больших массивов при отключённом буфере делается всё с мало-мальски приличной скоростью, т.е. практически запись в файл перестаёт быть бутылочным горлышком. С дефолтным конструктором при записи больших и средних массивов скорость записи падает... пожалуй, в десятки раз.
>>513082 >>513176 >с закомменченными 8 и 10 строкой Забыл 8 закоментить. Теперь он 400 мс работает.
> и сишную запись в файл Нет. Эти измерения делал раньше.
Провёл все измерения снова и получилось: 1. Без оптимизация пик400 мс 2. Оптимизация буфером310 мс 3. Вывод в стиле С с помощью .c_srt()430 мс 4. Вывод в стиле С с помощью С-строки410 мс
>>513184 Ну, в ходе твоих измерений выяснили, что fstream твёрдо быстрее си, хоть с оптимизациями, хоть без. У тебя же вроде была претензия изначально, что fstream медленнее работает, если я правильно понял?
>У них большая разница в скорости. Те кто fscanf писал сделали за 60 мс, а те что fstream за 150 мс. При чём алгоритм был примерно одинаковый.
>>513196 Да. Сам не понял. Начальные измерения с чужих задач на кодфорсе. И те кто писали в стиле С делали быстрее. На кодфорсе надо делать вывод в стандартный поток, а он сам его в файл перенаправляет. Но при очной олимпиаде вывод надо делать в файл самому и комп будет на винде. К этому я и хотел подготовиться. Есть что почитать на эту тему оптимизация fstream с помощью регулирования размер буфера в интернете?
Прогану нужно написать на чистом си прогу используя либу libpcaps, которая анализирует паекты согласно заданому требованию, например порт, айпи, мак. Нужно выводить в файл список всех маков пакетов, количество пакетов связаных с заданым маком. Список всех айпи пакетов, количество тисипи и юдипи. Прога под никсы, с байндингом бод eth0. Подскажите, с чего нечать. А то я только пол годна на плюсах, а в си полный ноль.
Репостну вопрос из ньюфаг тренда, вдруг здешний анон знает:
"Кто-нибудь использует code::blocks?
Не могу понять как заставить окно Wathces появляться автоматически во время дебага. Т.е начинаю отладку и нужно каждый раз лезть debug->debuging windows -> wathces.
И еще не могу изменять в вотчах элементы массива, пик. Как тут программировать вобще. Хотел эту иде как замену Студии. "
>>513201 >И те кто писали в стиле С делали быстрее. На кодфорсе надо делать вывод в стандартный поток, а он сам его в файл перенаправляет. не вижу смысла обсуждать чёрный ящик.
>Но при очной олимпиаде вывод надо делать в файл самому и комп будет на винде. К этому я и хотел подготовиться. Измерения ты провёл, решай сам.
>Есть что почитать на эту тему оптимизация fstream с помощью регулирования размер буфера в интернете? Лучше почитай на тему винды, какой у неё максимальный и/или оптимальный по скорости буфер записи на жёсткий диск. Дальше сам знаешь что делать.
>>513347 Единственное что, если у тебя много свободного времени, разберись, как в сишечке отключается буфер / выставляется буфер и его размер. Там ведь абсолютно та же кухня (только, очевидно, без ООП), что и в iostream. Что будет быстрее, ну мне было бы очень интересно знать, просто времени и сил не так много.
Т.е. можешь провести дополнительные измерения с оптимизацией fprintf или что там в си, я не знаю. Если сделаешь -- можешь сюда написать, я читаю C++ треды (все остальные треды не читаю).
>>513216 Еще выше был кун, который просил впилить книгу Страуструпа для нюфагов, ее бы неплохо добавить к тем трем. Но у меня ее нет, нагуглил только какое-то говно в .chm.
>>513350 Нашёл setvbuf и setbuf, но пока не понял их отличия. Также нашёл в описании это предложение. > Буфер записывается на физическое устройство каждый раз, когда встречается символ новой строки Заменил в строке вывода последний символ на \n, но результат почти без изменений. Также узнал что по умолчанию размер буфера для вводы/вывода в стиле С у меня 8192.
>>513407 Лучшие результаты C и C++ одинаковые -- 310 мс. Тебе необходим замер на большие количества данных (например, чтобы писалось минуты), может там разница будет.
Если, конечно, ты уверен, что I/O будет самым узким бутылочным горлышком в твоей олимпиаде.
>>513416 Ещё раз проясню: возможное повреждение HDD у тебя могло быть на этом этапе (цитирую тебя):
>512985 >Можно ещё раз. Почему размер буффера не резмер строки, а количество обращение?
Если же будешь писать крупными кусками (буфер намного больше, чем переменные. которые ты пишешь), ничего не станется. Фильмы ты не боишься на свой компьютер копировать?
>Если буду выводить в /dev/null результаты можно сравнивать? Тебе нужно ставить физический эксперимент с записью на жёсткий диск. Ну ты понял.
>>513424 Ну вот, видимо, экспериментально и подобрались к ограничению твоей сейчасшней ОС на максимальный буфер записи жёсткого диска.
Тогда делаешь так, как я говорил раньше: n оставляешь таким, чтоб не было segmentation fault, делаешь буфер, и вводишь дополнительную переменную m = n * 100; например, чтобы получить в 100 раз более долгий эксперимент по времени.
>for (... i < m; ...)
И так для фпринтфа и для фстрима.
P.S. Вангую отличие результатов не более чем на 5%.
>>513432 Да. Это я не ту программу протестировал. >>513428 Очень странно запускаю с 8382052 и всё работает примерно 10 сек. Второй раз запускаю и ошибка. Ничего страшного если n будет 8000000?
Теперь нужно чтобы количество циклов было больше размера буфера? Может в 10 раз будет достаточно, а то 1000 сек. Я не прожду.
>>513436 >Очень странно запускаю с 8382052 и всё работает примерно 10 сек. Второй раз запускаю и ошибка. Ничего страшного если n будет 8000000?
Ну сделай вдвое меньше, я не знаю, 4000000. Это 4 мегабайта (4194304), как я и предлагал в самом начале:
>513011 >4 мегабайта, полагаю, любая современная ОС может записать за 1 раз
>Теперь нужно чтобы количество циклов было больше размера буфера? Очевидно. Нам же неплохо бы посмотреть это на чуть более длительной записи.
>Может в 10 раз будет достаточно, а то 1000 сек. Я не прожду. Ну сделай в 10 раз, почему уже такие тупые вопросы спрашиваешь? Вроде как на олимпиаду собираешься.
По-моему мнению, если расхождение будет на два-три процента в скорости, уже неважно чем пользоваться. Я люблю плюсы, поэтому в любой программе всегда у меня
>#include <iostream> >#include <fstream>
А если есть #include <iostream> , то в целях скорости я уже никогда не использую сишный I/O, и поэтому всегда пишу в самом начале int main() { >std::ios::sync_with_stdio(false); ... }
вот об этом стоит помнить. А то люди проигрывали олимпиады из-за медленных std::cin / std::cout
>>513449 >От того что много раз меленькие объёмы данных записывать? Ну да, по-моему предположению, из-за частых циклов записи (да и чтения тоже) просто уменьшается его время жизни. Но лучше пускай знатоки железа выскажутся.
>Проверил быстрые fstream средняя скорость 1 мин. 18 сек. >Забыл добавить что 8 гигов буфером в 8 магабайт строку из 100 символов 80000000 раз выводил.
>>513467 Со string удобнее работать проще. Думаю теперь проведу ещё пару тестов с другими типами. Где искать советы по оптимизации программы без изменения её алгоритма?
>>513468 >Со string удобнее работать проще. Думаю теперь проведу ещё пару тестов с другими типами.
Можешь влететь по производительности, если не будешь делать с reinterpret_cast<const char> и низкоуровневой функцией записи ofs.write(arr, arr_streamsize);
подробно я описал тут: >512797 >512803 (быстрее этого уже не будет ничего):
Параллельно учишь английский, потому что база статей на русском там весьма неполна (почти все машинный перевод) и, кроме того, частенько на http:://www.cplusplus.com , хоть это и не официальный сайт, бывают более адекватные, полные и более ясные для понимания примеры.
НЕ ЗАБЫВАЙ ПЕРЕКЛЮЧАТЬСЯ НА ВКЛАДКУ C++11 , по умолчанию не она
Но моим примеры более понятные для понимания. Что такое reinterpret_cast <const char*>? Это указание компилятору, чтобы он думал, что там массив типа char, так ещё и указание конст чтоб не менять его. Обманываем компилятор и правильно делаем, ради скорости.
>>513486 >А как включить? И как проверить или включён? См. приложенный пик.
>1. long 95 мегабайт 1 250 мс. fstream 2. float 55 мегабайт 9 780 мс. fstream >3. long 95 мегабайт 1 650 мс. fprintf 4. float 46 мегабайт 4 230 мс. fprintf Ну, собственно, о чём я и предполагал >>513471 ещё до твоих измерений: при работе НЕ с чарами fstream ожидаемо проигрывает.
Поэтому нужно использовать непосредственно низкоуровневую функцию std::ostream::write() с враньём компилятору при помощи reinterpret_cast<const char *>, что мы пишем чары, а на деле пишем какой-то другой массив или даём ссылку на переменную.
>>513497 >См. приложенный пик. А, ты пр ту ссылку. Думал что ты про компилятор.>>513497 >что мы пишем чары, а на деле пишем какой-то другой массив или даём ссылку на переменную. Если там будет к примеру 2 байта unsigned short(12), а мы скажем что там чар. То он вместо "12" выведет 2 байта преобразовав их в чар. Тоесть char(0) и char(12). Разве нет? Не в интернет статья по этой теме?
>>513499 >Думал что ты про компилятор. Компилятор у тебя просто последней версии должен быть, тогда всё в порядке с C++11.
Так, последние два сообщения я уже не уверен, устал. >>513497>>513498 (вот эти)
По поводу ансигнед шорт. Если тебе нужно записать её n раз, тогда будет так (@ везде замени на *):
>#include <fstream> >#include <cstdio> //std::size_t > >int main () >{ > const std::size_t n = 100000, n_size = n @ sizeof(unsigned short); > char ofs_buffer[n_size]; > std::ofstream ofs; > ofs.rdbuf()->pubsetbuf(ofs_buffer, n_size); > unsigned short twelve = 12; > std::streamsize var_streamsize = static_cast<std::streamsize>(sizeof(unsigned short)); > > for (std::size_t i = 0; i < n; ++i) > ofs.write(reinterpret_cast<const char@>(&twelve), var_streamsize); > > return 0; >}
Т.е. в буфер она запишется n раз, а на жёсткий диск всё вместе запишется 1 раз. Обрати внимание, что в реинтерпрет_каст я скармливаю &twelve, т.е. ссылку (грубо -- адрес переменной, т.е. подаю её как массив якобы чаров длиной 2 элемента чара).
>>513514 Почему не используешь скрипт для [CODE]? И всё же я не понимаю. Ведь переменные разных типов хранятся в память по разному. Откуда он знает как их переводить в другой тип? И ещё. Программа с примера в файл записывает байты, а не символы.
>>513517 Скрипт не использую, потому что смотри соседний тред про Столярова Андрея Викторовича у меня помирающий компьютер, ещё не хватало навешивать всяческие плагины на браузер. Я вообще сторонник веб 1.0.
>Откуда он знает как их переводить в другой тип? Он их не переводит в другой тип, он подряд расположенные байты в памяти воспринимает как другой тип. Реинтерпрет_каст на этапе выполнения кода ~почти всегда является бесплатной операцией.
Константу я навесил чтобы подчеркнуть read-only характер действия в отношении памяти.
>>513522 >Что такое streamsize? Я кому ссылку на вики дал?
>>513527 >Он их не переводит в другой тип, он подряд расположенные байты в памяти воспринимает как другой тип. Реинтерпрет_каст на этапе выполнения кода ~почти всегда является бесплатной операцией. Значит он полезен только при выводе string? Ведь другие типы совсем не так представляются в памяти как массив char. Значит другие типы никак не ускорить?
>Я кому ссылку на вики дал? Там по предложения про это. По чему отдельный тип? Почему не int?
>>513529 >Ведь другие типы совсем не так представляются в памяти Другие типы в оперативной памяти лежат в количестве sizeof(T) байт, а представляет их себе уже компилятор с помощью дополнительной информации о типе. Когда ты говоришь компилятору реинтерпретировать их, он забивает на информацию об их типе и реинтерпретирует их так, как ты скажешь. Главное, чтобы размер T и размер реинтерпретируемого совпадали, иначе КРОВЬ КИШКИ ГОВНО ПО СТЕНАМ.
>Значит другие типы никак не ускорить? Я >>513514 тебе n раз unsigned short записал, вообще-то. Ты издеваешься или что?
>По чему отдельный тип? Почему не int? int это самый быстрый целочисленный тип на твоей платформе. Обычно 32 бита (долго объяснять, это фишка x86-64), ранее 16 бит.
std::size_t и std::streamsize это максимальные по разрядности типы (соответственно unsigned и signed) на твоей платформе. Т.е. 64 бита на 64-разрядном процессоре (кроссплатформенные определения типов).
Вне зависимости от разрядности процессора именно эти типы используют для индексации и разметки памяти (std::size_t) и для *stream библиотек (std::streamsize).
>>513533 Выводом куда именно? Если в файлы, то по легенде, M$ Word их так прямо в файлы и бросал. ulong rc = write (файл, смещение, структура, sizeof (тип));
>>513534 > тебе n раз unsigned short записал Я не не предупредил думал что это и так понятно нужно не в бинарном виде или как эта правильно называется, а в виде символов. Так чтобы можно было открыть блокното7м и увидеть "12". Тоесть чтобы это сделать нужно знать как тип храниться в памяти и самом преобразовывать его к char?
1) исправь >ofs.open(filename, std::ios::binary); //std::string filename на >ofs.open(filename); //std::string filename чтобы НЕ открывало в бинарном режиме;
2) не забывай о разделителе -- char delimiter -- ты же должен разделять данные пробелом, например;
3) размер буфера не нужно подгадывать чтоб был кратным количеству записей, если неизвестно, что данные одинаковые;
4) используй << в цикле for
P.S. Будет медленно в любом случае по сравнению с бинарным, но доверь >преобразовывать его к char стандартной библиотеке, она сделает это лучше тебя.
>>513547 ну и да, надеюсь ты понимаешь, что размер буфера всё равно должен быть достаточно большим, чтобы выгружать записи на жёсткий диск реже, но бОльшими порциями
Ньюфаг вкатывается к крестогосподам. Есть два реквеста: 1) Посоветуйте годную литературу по Qt. Или исключительно Qt Documentation курить? 2) В одном из прошлых тредов анон выкладывал со своими пояснениями список литературы и каналы на ютубе, там ещё помечал их типа LEVEL 1, LEVEL 3 и т.д. Может схоронил кто-нибудь?
Анон, я инженер-механик, меня заебало нищебродствовать, хочу программировать. В свободное время читаю документацию по с++, а также Лафоре - уже полкниги прошел, охуенная, я все с первого раза въебал. Как для дебилов объясняет. Вопрос - стоит писать и проверять на Ideon, или все-таки установить IDE? Какой? Я где-то видел рекомендовали CodeBlocks, но к нему еще компиляторы нужны, ХЗ.
Антоны, привет. Я, конечно, понимаю, что лабы идут нахуй, но здесь вопрос, скорее, в другом. Есть годный пак заданий для С++? Буду благодарен, если ткнёте носом.
>>514611 Нет, у меня получше сосача будет. Только для мобилок дизигн просасывает. А так почти все функции куклы есть искаропки (спеллы в том числе), кроме совсем бессмысленных (ну типа там пробел после > вставлять при цитировании). Еще это говно без учета скорости передачи (на локалхосте тестил) держит до 70к постов без картинок в час, или до 30к с картинками, или до 20к тредов. Есть минималистичный режим, где не используются скрипты, но многие функции работают (такие как добавление файла к посту или редактирование поста (который отмечен как черновик и пока что другим посетителям не виден)). Тег code, опять же, поддерживается без костылей. Ссылки на посты с других досок. Есть и уникальные фичи (сомнительной полезности, но все же). Все описывать лениво. В общем, без лишней скромности, движок збс получился, мне нраица. Народу только нет, потому как агрессивно спамить-пиарить совесть не позволяет (и лень тоже).
>>515250 Попробуй, сделай. wxWidgets -весьма неплохая штука, лично для меня вполне удобная. Однако, делать что-либо на Милашке, как мне кажется, быстрее и проще.
Анон, направь меня на путь истинный! Я хочу обмазаться сетевым программированием, и у меня возникла пара вопросов:
1. Какие есть библиотеки, и стоит-ли их использовать? Я посмотрел на программирование уровня сокетов и не нашел там чего-то очень сложного, а библиотека типа boost.asio, на первый взгляд показалась мне более запутанной.
2. В чем смысл использования асинхронных сокетов в винде, если я могу запустить синхронный в отдельном потоке?
>>515399 >Какие есть библиотеки, и стоит-ли их использовать? Разные, некоторые - да, некоторые - нет. Я только boost::asio использовал >первый взгляд показалась мне более запутанной. Ну, есть немного, но мне норм. > В чем смысл использования асинхронных сокетов в винде, если я могу запустить синхронный в отдельном потоке? В том что асинхронные не требуют целый поток на одного клиента.
>>515418 А в чем преимущество asio, кроме мультиплатформенности? Я посмотрел, интерфейс сокетов в винде и никсах похожий, написать к ним универсальное междумордие можно довольно быстро.
Ананасы, вот у меня вопрос такой. Иногда где-то в примерах натыкаюсь на такие вещи, а именно делают шаблонные структуры, но без каких-либо функций или переменных в них. Ну то есть просто пустая структура. Ещё замечал, что это делается для метапрограммирования. Можно какой-то краткий пример для объяснения?
>>515424 >А в чем преимущество asio, кроме мультиплатформенности? Готовая, хорошая либа использующяя идеоматический с++.
>>515424 >Я посмотрел, интерфейс сокетов в винде и никсах похожий, написать к ним универсальное междумордие можно довольно быстро. Ну так напиши, жалко что-ли.
Что делают С++ программисты на работе? Смотрю hh.ru и там много QT разработчиков программ и игр. И не очень много программистов по iOS/Android. Много кстати на линукс. Неужели они так востребованы? Какая мне светит работа после того как кресты выучу?
Пилю тайловую систему к игрушке. Подразумевается, что в ней будет скриптовое описание всех новых тайлов, чтобы можно было без проблем добавить новый, не перекомпиляя. Для этого я сделал абстрактный класс Tile, от которого будут наследоваться все остальные.
Сейчас я пилю генератор ландшафта, и у меня возникла проблема с тем, как он будет понимать, какой именно тайл ему сгенерить. Например, можно в каждом тайле сделать запись с его типом. Но нужно сгенерить не просто тайл, а экземпляр субкласса Tile.
Как вообще реализуют подобные вещи? Тот же Майнкрафт как-то это делает...
>>515658 Фабрика же. У фабрики статический метод который принимает параметром тип нужного тайла (название тайла, или номер), создает и возвращает его. При добавлении нового тайла тебе нужно будет скомпилить класс этого тайла и фабрику. Соответвенно пересобрать все с новыми файлами. Поэтому не совсем понятно что именно ты имеешь ввиду под "не перекомпиляя". Если тебе нужно добавление новых типов тайлов вообще без перекомпиляции, только путем изменения каких=то конфигов/скриптов то твоя архитектура не подойдет. Под тайл нужен один класс, наследование не подойдет.
>>515667 Есть. Система черновиков. Ставишь галку при отправке, пост на доске видишь только ты. Можно редактировать сколько угодно, пока не снимешь галку. После этого редактировать нельзя.
>>515679 Введи любой пароль вверху, по нему сервак идентифицирует. Без пароля невозможно будет узнать, кому можно показать пост, а кому нет. В базе не хранится, только в куках. >>515680 Да.
>>515703 Это был риторический вопрос, наверное. Можно ли работать с интернетом из-под консоли? Что за библиотеки подключать, и что почитать про этому поводу?
>>515722 Ну допустим, я хочу сделать элементарно запрос на вывод времени. Как это сделать вообще? Нужно обращаться к серверу, запрашивать данные. Как это все делается?
>>515760 Если тебе не нравится так, то лови идею. Кончолько быстро чекает время с сервера, сверяет его с системным. Если неправильно - исправляет. Так лучше?
А как скачать XML файлик с сервака и пропарсить его, найти определенный тег, из него прочитать текст, это будет логин. По этому логину найти этого пользователя и открыть его страничку. Это всё на QT
>>515769 Просто я уже говорил, что в шиндавс есть встроенная утилита синхронизации с сервером (несколько на выбор). Суть та же, но это надо заходить, искать, выбирать сервер. Проще же было бы просто запустить консольную приложку, которая просто даст тебе на выбор сервер, и настроит твое время на +4 по Гринвичу.
Переформулирую свой вопрос. Есть основной движок на плюсах, в котором есть типовые объекты (например, Tile). У каждого из них есть типовые функции, для тайла -- инициализация, апдейт (шаг его жизни, грубо говоря), реакция на наступание на него и т.д.
Хочется сделать возможность писать новые тайлы на каком-то незакрытом языке, но при этом не просто задавать параметры, а переписывать эти типовые функции. Нужно это для того, чтобы основной движок просто генерил эвенты и дергал функции, а что конкретно произойдет -- узнавал из открытых для редактирования файлов.
Собственно, вопрос: насколько это вообще реально и как это можно реализовать?
>>515781 Прикручивают интерпретаор какого-то скриптового языка, часто это lua, так как есть небольшие библиотеки. Наверное для питона есть, хотя хуй знает. Потом через этот интерпретатор вызывают код на скриптах. У Qt есть свой скриптовый язык, правда не знаю можно на нем сдедать такое.
>>515791 А можешь для того же Lua, например, найти ссылку, где описывается такое вот создание наследников скриптами и их интеграция? Я только по настройке скриптами смог маны найти.
В Кьюте есть метапрограммирование, которое в это потенциально может, но как же не хочется с ним возиться.
>>515790 Имхо, проще все-таки писать целиком на Кьюте, потому что не придется мешать два разных стиля программирования. Но я сам с графониумом именно по Кьюту знаком.
>>515795 Никаких наследников. Нельзя добавить новый класс без перекомпиляции. У тебя один класс тайла. Для каждого вида тайла создаешь свой файл скриптов, там функции/переменные с одинаковыми именами, разными реализациями. В конструкторе тайла передаешь имя нужного файла с скриптами., в зависимости от типа тайла. Когда нужно что-то сделать класс дергает функции из своего файла.
>>512370 Долбаеб, реализацию шаблонных классов нельзя вынести в отдельный .СРР файл по правилам языка C++. Пиздец, как же смешно было читать твои комментарии.
>>515795 Попробуй порыться здесь https://eliasdaler.wordpress.com/ Ильюша там делает то что ты хочешь, неуверен конечно там там написано именно то что тебе нужно, при беглом осмотре там только lua скрипты, может в туториалах он там нормально поясняет.
>>515818>>515828 Потому что в первой строке у тебя double, который при присвоении приводится к float. То есть твой код на самом деле эквивалентен этому: float a = (float) (12345); float b = 12345F; В такой виде разницы нет. Но вот добавим умножение к числу на границе точности float: http://ideone.com/4hHqqe
Здравствуйте, у меня возникла не понятная ошибка с которой я не могу справиться и не могу понять откуда она возникла.
visual studio 2015
1>dexmath.h(465): error C2280: '_4matrix::_4matrix(const _4matrix &)': attempting to reference a deleted function 1>dexmath.h(484): note: compiler has generated '_4matrix::_4matrix' here
>>515828 Здесь никакой разницы нет, потому что ты явно указываешь, что переменная a относится к типу float. Разница возникает в тех случаях, когда компилятор может об этом не догадаться.
Фигня в том, что float это примерное представление числа с некоторой точностью. И из-за этого могут возникать неприятные косяки. Например, 1234567891.1F - 1234567890.0F = 0, а не 0.1F.
Есть такая хуйня. Хочу чтоб вводил текст, он добавлялся к ссылке и делая реквест к этой ссылке, он выводил мне всё что придет в текст браузер. Оно компилируется, но когда нажимаю кнопку реквеста, то пишет:
"QObject::connect: No such signal QNetworkAccessManager::finished(reply) in ..\ATrey\mainwindow.cpp:104 QObject::connect: (receiver name: 'MainWindow')". Помогите, пожалуйста.
>>515677 >Должно быть время последнего редактирования, да? Естественно. Ведь все остальные увидят в момент последнего редактирования. А что я там в формочке писал, вообще неважно, мог ведь и не отправить.
>>516146 TheprogramminglanguageCLecturesandexercises6thEditionPrata Я вот это читал. Там и резюме в конце каждой главы и вопросы контрольные + задачки для решения.
>>516443 >A value different from zero (i.e., true) if indeed c is a lowercase alphabetic letter. Zero (i.e., false) otherwise.
Бля, действительно, в задании: A library function, islower(), takes a single character (a letter) as an argument and returns a nonzero integer if the letter is lowercase, or zero if it is uppercase.
Анон, есть задача: поток x запускает другие потоки, не более N, соответственно когда один из этих потоков завершен, он может запустить новый и т.д. Можно сделать примерно так:
void f(atomic_int cnt) { cnt--; }
А здесь код выполняющийся в потоке x:
int max_thread(4); atomic_int cnt(0); while (true) { if (cnt.load()<max_thread) { ++cnt; thread t(f,&cnt); t.detach(); } this_thread::sleep_for(chrono::seconds(1)); //промежуток для примера }
Но меня здесь напрягает цикл и sleep_for, собственно вопрос: можно-ли это сделать более эффективно?
>>516691 rand() это детерминированый алгоритм который получает на вход число (seed - скрыто в дебрях стандартной библиотеки) и возвращает другое число, напервый взгляд никак не связаное. В качестве seed исползуется чило возвращенное rand() последний раз. А так как при запуске программы вызывов rand() еще небыло, там записано какое-то число по умолчанию, всегда одинаковое. Используя srand() можно вписать другой seed и получить другую последовательность псевдослучайных чисел.
Оп вкатывается в тред после трехдневного отсутствия. Я тут вроде как в командировке, пекарни нет, и поэтому активно участвовать в дискуссиях не смогу еще где-то неделю. Но с шапкой разберусь, в новом треде все будет. Такие дела.
Плюсаны, а можно переместить курсор в консоли стандартными средствами iostream? Знаю, что можно использовать winapi, но как-то мне не нравится такой вариант: к примеру, на линухе же не получится использовать winapi.
>>517013 Нет. Набор стандартных способов заимоействия с консолью очень ограничен, так как считается что консоль это устройство типа телетайп с очень ограниченым функционалом. Если в твоей системе в качестве консоли используется устройство с более широким функционалом - тебе нужно уже дергать драйвера этого устройства. А конкретно в операционной системе виндоуз консоль вообще гавно. Если тебе нужно переносимое решение, одним из вариантов может быть использование библиотек, например ncurses.
Двачаны, помогите нубасу. Как написать программу решающую анаграммы (например spot - stop, file - life)? Мне пока ещё очень тяжело работать со строками на крестах, так что я не очень понимаю алгоритм. Как я думаю, сначала нужно попросить пользователя ввести слово, потом ему нужно посчитать количество букв в слове и создать многомерный массив или что-то типа того. В общем введя слово "faggot" нужно, чтобы программа перебирала словарь в поиске слов где есть одна a, одна f, две g, одна o и одна t. Как это делать - душой не ебу. Неужели нужно создать цикл под каждую букву алфавита? Дальше поиск по словарю и вывод слов совпадающих с введённым, но не являющиеся собственно введённым. То есть если в словаре есть слово stop, и пользователь введёт stop оно не выводило stop как решение анаграммы. В общем почти ничего не понимаю, подскажите. Можно ли сделать проще? А то как-то много циклов выйдет.
>>517081 Каждый раз делать перебор - будет слишком большая алгоритмическая сложность. Тебе нужен индекс. Заводишь индекс multi_map<string, string>. Далее для каждого слова в словаре английских слов: 1. Сортируешь символы по алфавиту. stop => opst. Например, конвертируешь string в vector<char> и вызываешь std::sort. 2. Запихиваешь в multi_map по ключу opst это слово.
Таким образом ты получишь структуру данных {opst=>[stop, spot], efil => [file, life]}. Дальше поиск анаграмм тривиальный - сортируешь твое слово, лезешь в индекс, получаешь все анаграммы.
>>517081 Тебе нужно сгенерировать все перестановки твоих букв. Проще всего рекурсивно берешь первую букву, генеришь все перестановки оставшихся букв, к этим перестановкам добавляешь взятую перую букву в начало. Потом тоже самое для второй и т.д. Слово stop просто пропускаешь, там в зависимости от алгоритма оно может напрмиер генерироватся всегда первым.
>>517093 Ну так если человек введет spot, то нужно выдать stop, а stop не выдавать. Прикол не в том, чтобы stop не показывать, а в том, чтобы пользователю не предлагалось слово, которое он ввёл в качестве решения для анаграммы. Наверное просто строки strcmp'ом сравню. >>517083 Спс. Понял что лох и многого не знаю. Буду долго писать, а вроде такая простая хрень.
Почему только одна книга Страуструпа в шапке? Для нюфань Programming Principles and Practice Using C++ - rutracker.org Для беглого осмотра основ A Tour of C++ - rutracker.org "For mastery" The C++ Programming Language(4-е издание) - rutracker.org
Уже третий день пишу рандомный генератор пещер. Остановился на половине, заметив, что код какой-то не крестовый. То есть он работает, хоть и, пока что, хуево, но чувствую, что так писать на крестах нельзя. Так что пока не поздно, прошу помочь и указать на ошибки структуирования программы и на плохой стиль.
Анон, а подскажи какой-нибудь хороший способ разработки и тестирования ПО доступный для одиночных прогеров. И если знаешь, что можно почитать об этом на великом и могучем.
>>517780 Ты че, охуел? Динамическая типизация - это так здорово! Часами отлаживать код, устранять ошибки, которые могли бы быть замечены на этапе компиляции - что может быть прекраснее? Тупым крестоблядям не понять, ведь они не тратят впустую время на устранение граблей, которые им услужливо подставляет собственный язык. Да, жабаскрипт, я на тебя намекаю.
>>517822 Ну это я загнул немного. На самом деле C++ без QT довольно мало применим. А зачем нужен чистый си в наше время? Микроконтроллеры небось микроконтроллишь?
>>517900 >C++ без QT довольно мало применим Вот уж где загнул так загнул. Даже если забыть про килотонны тырпрайзного легаси времен, когда куте еще не было. И да, я не люблю QT, но таки на самом деле гораздо чаще вижу проекты без него.
Сап. Очередной студентоид просит совета. Курсовая - система учета в аптеке. База данных, связи между объектами, окошки и прочая лабуда, ничего интересного. Нужно написать на С++. Но есть один нюанс. Универ не совсем... айтишный и запускать надо будет все это дело на университетской Visual Studio (надеюсь, старше 2013). Никаких бустов, Qt и прочего. Максимум .net. Но есть одна проблема. Я красноглазый пердолик и вообще предпочитаю скрипты. Есть два стула: 1) Максимально изъебнуться и любой ценой сделать кроссплатформенное приложение. Статически скомпановать его с qt, рисовать на opengl, что угодно, но заставить приложение работать в прыщах. 2) Расслабить пукан и позволить дотнету войти в меня. Написать непортируемое приложение конкретно под Windows, максимально задействовать виндовые компоненты и библиотеки. И попытаться запустить на Mono, конечно.
Наверное оба варианта для меня одинаково интересны. Что посоветуете? Не буду письку сосать
>>517969 Учитывая, что системы учета в аптеке на С++ никто в здравом уме не пишет (красноглазые пользуют Java), то пиши на дуднете - отличий с C# будет минимум, а так ты хоть будешь знать, как это делается.
Реквестирую сайт в интернете где есть задачи разных уровней сложности. Можно решив задачу отправить её туда чтобы он прогнал по тестам. И чтобы были авторские решение с описание алгоритма решения и обязательно описанием кода.
>>517985 Да много что он делает. Менеджмент линий, абонентов, геолокации, всякие сервисы типа запроса баланса (точнее он предоставляет интерфейс для реализации подобных сервисов), доставка смс, пакетных данных и прочие радости твоей жизни.
>>517997 Основа была запилена в далеком 1980 году, с тех пор никому не хотелось переделывать огромные портянки кода. Производительность там тоже в приоритете, каждый % деградации сопровождается сильным недовольством заказчика.
Какой толпы, страданьем побежденной?"
И Вождь в ответ: "То рвутся пуканы
Крестоблядей, что прожили, не зная
Pure functions, что Всевышним нам даны.
И с ними школьников дурная стая,
Чья лаба к сроку не была сдана,
Кто тонет в легаси, от жизни отставая.
Их свергла Java, не терпя пятна,
И пропасть asm'а их не принимает,
Иначе возгордилась бы вина".
Литература:
Для нюфань:
Три классических учебника для начинающих. Все примерно одинаковой годноты, читать имеет смысл только какой-нибудь один, который больше приглянется.
Герберт Шилдт - C++. Базовый курс - http://padabum.com/x.php?id=15127
Роберт Лафоре - Объектно-ориентированное программирование в C++ - http://padabum.net/x.php?id=16885
Стивен Прата - Язык программирования C++ - http://bukin.su/share/%D0%9A%D0%BD%D0%B8%D0%B3%D0%B8/cpp/Prata_C++.pdf
Учимся не писать говнокод:
Книги про основные подводные камни для тех, кто осилил предыдущий пункт. Следует пролистать все.
Скотт Мейерс - Эффективное использование C++ - http://www.e-reading.club/book.php?book=1002058
Скотт Мейерс - Наиболее эффективное использование C++ - http://www.proklondike.com/var/file/C/Scott_Meyers_-_More_Effective_CPP(RUS).rar
Герб Саттер и Андрей Александреску - Стандарты программирования на языке C++ - http://coollib.com/b/176648
Тонкости языка (для гурманов):
Ад и хардкор.
Бьерн Страуструп - Язык программирования C++ - http://www.proklondike.com/var/file/straustrup-yazyk-c-speciazdanie.zip
Андрей Александреску - Современное проектирование на C++ - http://www.proklondike.com/var/file/C/Andrei_Alexandrescu_-_Sovremennoe_Proectirovanier_CPP.rar
Герб Саттер - Решение сложных задач на C++ - http://www.studfiles.ru/dir/cat32/subj1104/file8061.html
Стандарт языка (на ангельском) - http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
Отдельные аспекты:
Читать по необходимости.
Энтони Уильямс - Параллельное программирование на C++ в действии - http://www.proklondike.com/var/file/Paralelnie_programirovanie.zip
Николаи Джоссатис - C++. Стандартная библиотека - http://my-files.ru/Download/cdm4zk%20Джосаттис%20Н.М.%20-%20Стандартная%20библиотека%20C%20.%20Справочное%20руководство%20-%202014.djvu
Ссылки:
Годный блог, в котором все просто и понятно тян не нужны кококок борщ - http://alenacpp.blogspot.ru/
Краткие описания библиотечных функций и контейнеров - http://ru.cppreference.com/w/
Блог Герба Саттера (на ангельском) - http://herbsutter.com/
Блог Скотта Мейерса (на ангельском) - http://scottmeyers.blogspot.ru/
Памятка:
Вопросу по синтаксису идут на хуй.
Лабы идут на хуй.
"Как мне сделать Х на чистых крестах без библиотек" идут на хуй.
Все идут на хуй.
Хейтер сосет члены на пару со своей мамашей.
Тег [code] работает через жабаскрипт-костыль: https://github.com/ololoepepe/MakabaCode
Предыдущий: