Вы видите копию треда, сохраненную 22 августа 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Какой толпы, страданьем побежденной?"
И Вождь в ответ: "То рвутся пуканы
Крестоблядей, что прожили, не зная
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
Предыдущий: >>503274
>Николаи Джоссатис - C++. Стандартная библиотека - http://my-files.ru/Download/cdm4zk%20Джосаттис%20Н.М.%20-%20Стандартная%20библиотека%20C%20.%20Справочное%20руководство%20-%202014.djvu
Что-то не то.
http://my-files.ru/cdm4zk
http://my-files.ru/Download/cdm4zk/%d0%94%d0%b6%d0%be%d1%81%d0%b0%d1%82%d1%82%d0%b8%d1%81%20%d0%9d.%d0%9c.%20-%20%d0%a1%d1%82%d0%b0%d0%bd%d0%b4%d0%b0%d1%80%d1%82%d0%bd%d0%b0%d1%8f%20%d0%b1%d0%b8%d0%b1%d0%bb%d0%b8%d0%be%d1%82%d0%b5%d0%ba%d0%b0%20C%20%20.%20%d0%a1%d0%bf%d1%80%d0%b0%d0%b2%d0%be%d1%87%d0%bd%d0%be%d0%b5%20%d1%80%d1%83%d0%ba%d0%be%d0%b2%d0%be%d0%b4%d1%81%d1%82%d0%b2%d0%be%20-%202014.djvu
Вот это я обосрался. В следующий раз исправлюсь, мамой клинус.
Аноны, а действительно С много быстрее С++? Я как-то пробовал тестить, но разницы не заметил.
Если на C++ писать в стиле C, то нет. Но никто так не делает.
Ты имеешь в ввиду в биосе отключить? И что, сильно проигрывает?
Глобальные переменные и статические члены класса выделяются при старте в сегменте данных сразу, не на стеке.
Да. Статический член создается один раз для всего класса, а не каждый раз новый для нового объекта класса. Нужно, например, для реализации синглтонов, ну и вообще когда что-то встречается один раз на всю программу.
Ты можешь создать массив и записать в него любые байты, например, те, из которых состоит функция. Но легально ее исполнить не получится придется делать reinterpret_cast к указателю на функцию, и по стандарту поведение будет неопределенным, например, может сработать защита от выполнения данных.
А если в С++ пишу статическую функцию-член класса она как в сегмент данных попадает?
Всё правильно написал? В динамическую попадают ТОЛЬКО 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]
кодрандом*
А если в С++ пишу статическую функцию-член класса она как в сегмент данных попадает?
Всё правильно написал? В динамическую попадают ТОЛЬКО 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]
кодрандом*
А если в С++ пишу статическую функцию-член класса она как в сегмент данных попадает?
Всё правильно написал? В динамическую попадают ТОЛЬКО 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]
А если в С++ пишу статическую функцию-член класса она как в сегмент данных попадает?
Всё правильно написал? В динамическую попадают ТОЛЬКО 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]
Статический метод попадает туда же, куда и обычные методы - в сегмент команд. Суть в том, что методы не копируются для каждого объекта класса. В смысле размещения все функции "статические", потому что все функции, которые вызываются хотя бы один раз, записываются в память и не дублируются. static-методы отличаются только тем, что они не принимают неявно первым параметром указатель на объект, и поэтому их можно вызывать не только от имени объекта как mamka.ebat (), но и вообще при отсутствии объектов класса, от имени всего класса: TvoyaMamka::ebat ().
Написал правильно, i это такая же локальная переменная, ее разместят на стеке.
Например, я пишу: >>, а мне выдаёт ошибку что >> не определена.
Спасибо, ты мне безумно помог! Раз ты так хорошо разбираешься в вопросе, то может ты мне ответишь: как писать блоки так, чтобы они не выходили за пределы кластера?
operator>> же.
>>511525
Если ты работаешь со стандартной библиотекой, то ты не можешь гибко на это влиять, т.к. считается, что этим занимается ОС, и она наиболее быстро будет их записывать, исходя из ее знаний об оборудовании. Если тебе нужно самому, то, вероятно, придется отказаться от стандартных интерфейсов для работы с файлами и самому работать с ФС на низком уровне. Потому что для обычной записи вообще не гарантируется, что что-либо пишется на диск на самом деле, ты можешь управлять сбросом буфера, но очень толсто, одной командой "сбросить все", и сделаешь только хуже с большой вероятностью. Оно может, например, кэшироваться в памяти, и не сбрасываться на диск вплоть до конца работы приложения. А чтобы работать именно с диском, тебе понадобится отдельная библиотека, наподобие boost::filesystem.
Тебе в C-тред, лалка. Господа здесь используют нормальные высокоуровневые библиотеки вроде Casablanca и не ебутся с этим говном.
Не думал что тут такие же кодо-проблемы уровня пхп.
Тут вопрос не в библиотеке, и не в том, когда данные записываются, я могу вообще использовать WinAPI, вопрос в том: доступен ли пользовательским данным весь объем кластера на диске, или в нем содержится еще какая-то служебная информация? Это вопрос о структуре NTFS. Я пытался найти инфу, но там в основном о структуре тома, если ты знаешь где можно почитать, то скинь.
Есть официальный репозиторий с программами. Не надо вирусов бояться. Можно легко панель задач настроить. Ярлыки вверху, открытые приложения внизу. Несколько рабочих столов. Куча легко настраиваемых плагинов. Многое можно сделать всего одной командой в консоли.
Нет, для служебной информации просто резервируются отдельные кластеры. В принадлежащих файлу все только по существу, нет указателей на следующий кластер или чего-то подобного. Только данные.
Я, допустим, начал с "Страуструп Б. - Программирование. Принципы и практика использования C++". Почему его нет в рекомендованных, я сильно ошибся с выбором первой книги или это дело вкуса, объясните немного, не пинайте.
Нет, не ошибся. Хорошая книга.
На документации мало на оф. сайте да и не всегда все понятно.
В документации *fix
Да не особо. Просто книжек для ньюфагов много, а у Страуструпа бывают достаточно нудные тексты, поэтому я его не включил в раздел для ньюфагов.
>>511656
http://www.solarix.ru/for_developers/cpp/boost/boost-library.shtml
А теперь напиши pow(n, 1.0/2) или pow(n, 0.5) или pow(n, 1f/2)
Блядь, ну откуда вы лезете-то? Какие нахуй printf в крестах?
Делай раз: std::ifstream file {"TvoyaMamka.txt"};
Делай два: std::string mamka;
Делай три: file >> mamka;
>>511945
У них большая разница в скорости. Те кто fscanf писал сделали за 60 мс, а те что fstream за 150 мс. При чём алгоритм был примерно одинаковый.
%Только что сам замерил программы с пика вышло 320 и 360 мс и fstream быстрее. Что можно вместо .c_str() делать и можно сразу оба варианта использовать?%%
Ну т.е. если код всего класса пишется сразу в один файл, без выноса тел функций в .cpp - сильно говнокодом считается или всем похуй?
Неужели до сих пор вручную все кодят заголовки, и потом, когда решают добавить функцию в класс, рыскают по двум файлам?
Это у тебя продлится до первой получасовой компиляции проекта из одних заголовков.
Два файла делают тогда, когда распространяют библиотеку без исходного кода, в остальных случаях это не принципиально. Стандартная библиотека написана без разделения.
В стандарте http://www.cplusplus.com/reference/ios/ios_base/sync_with_stdio/ про файлы ничего не написано.
Какие подводные камни при использовании cin.tie(0)?
int&& tmp=90;
cout << std::is_rvalue_reference<decltype(tmp)>::value << '\n'; //true
Ведь по сути tmp, это обычный int и как rvalue его использовать нельзя
Ты совсем упоротый? Открой какой-нибудь list.h там будут описаны и классы и функции, если ты найдешь в стандартной библиотеке list.cpp то сообщи.
Файлы не ускоряют. Проверил. Но при выводе с printf и перенаправление вывода в файл из консоли 500 мс, а с выводом в fprinf 360.
%s и массив char. Для iostream естьпара советов, которые делают его быстрее scanf, поищи аналоги для fstream http://habrahabr.ru/post/246257/
Проверил эти советы. Но fstream они не ускоряют.
Нет, tmp это таки будет rvalue reference, сам объект 90 будет жить, пока живут ссылки на него. Другое дело, что в метод его нельзя передать, если параметр объявлен как &&, а если параметр & или по значению, то можно. Я, если честно, не совсем понял, почему так происходит, вся эта тема с rvalue оказалась глубже, чем я думал. Но абсолютно точно tmp не будет непосредственно интом в твоем случае.
Ничем. Кто тебе такое сказал? Где его не надо использовать. Максимум что может произойти это конфликт имён в больших программах.
Насколько мне известно, то он помогает отлаживать программы.
Но у меня возник вопрос, он умеет выводить сообщения об ошибке только в консоль или же нет. Да и ваще нужен ли он? Или нахуй не сдался, если не собираешься крупного пилить ничего.
>сам объект 90 будет жить, пока живут ссылки на него
но я же не могу уничтожить эту ссылку, его время жизни такое же как и у инта в этой функции.
>в метод его нельзя передать, если параметр объявлен как &&, а если параметр & или по значению, то можно
и инт точно также
> вся эта тема с rvalue оказалась глубже, чем я думал
Да это просто какой-то пиздец! А потом они удивляются, почему, блядь, все на яву переходят.
Я нуб, прочитал книгу Шилдта Базовый курс C++ (из шапки). Перед прочтением думал, что знаю плюсы, надо разве что библиотеки вроде буста и qt4 выучить. Оказалось, что вообще не знаю нихуя.
Придумайте для меня задание (проект какой-нибудь), чтобы у меня был стимул изучить актуальные библиотеки. А то скучно самому высосанные из пальца задачки решать.
Блокнот уже сделал?
Напиши два драйвера для мышки: первый может передвигать указатель только в право-влево, а второй - вверх-вниз, один устанавливаешь на одну мышку, второй на вторую. Таким образом тебе чтобы навести курсор в нужное место нужно будет работать обеими руками, причем в разных плоскостях. Не благодари.
Чтобы один экземпляр через свой метод мог вызывать методы другого экземпляра.
Или чтобы один экземпляр через свой метод мог менять свойства другого экземпляра.
>но я же не могу уничтожить эту ссылку, его время жизни такое же как и у инта в этой функции
Ну, лол, так и есть. Кресты это тебе не утиный язык. Если tmp выглядит как инт и применяется как инт, то это еще не значит, что он будет инт.
Тем, что при использовании нескольких библиотек даже в небольшой программе могут перекрываться имена, в зависимости от того, какой using nsmespace сделали раньше. И такую ошибку хуй найдешь потом. Лучше написать using std::TvoyaMamka для сущностей, которые используешь, тогда, по крайней мере, ты сможешь точно знать, откуда взято имя.
Я не пользовался. Для компиляционных проверок есть static_assert, для тестирования удобнее сразу хуярить в gmock.
Напиши какую-нибудь 2D игру для джвух пользователей. Одновременно научишься в формочки, контейнеры, сетевое взаимодействие.
Как он мышки-то отличит, если они usb?
[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]
И два вопроса. Норм я сделал? Может я не понял дохуя хитрый ход автора в его примере?
[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]
И два вопроса. Норм я сделал? Может я не понял дохуя хитрый ход автора в его примере?
Насчет счетчика, такой код как в книге будет вроде работать с майкрософтовским компилятором. Так как ты сделал вообще не вариант, или обяви переменну счетчика перед циклом, или сохрани длину строки strlen(str1) в отдельную переменную size (например) и в цикле будет условие i < size, после цикла str2[size] = '\0';
Насчет сравнения беззнаковых с знаковыми - у тебя наверное жесткие настройки компилятора, он должен такое компилировать, просто что это UB. Ну и так как ты сделал это правильно, UB желательно не допускать, особо хитрожопые компиляторы могут вообще такой цикл выкинуть с таким сравнением как в книге.
Что значит нет? Ты мои посты читал вообще? Я говорю, что сейчас цпп и х объединены, как там может не быть исходного кода?
>Два файла делают тогда, когда распространяют библиотеку без исходного кода
>Открой какой-нибудь list.h там будут описаны и классы и функции,
>Два файла делают тогда, когда распространяют библиотеку без исходного кода
ну правильно, стандартная библиотека распространяется с исходным кодом, и там один файл
>описаны
я не очень удачно выразился
Какая среда для С++ лучше подходит для ньюфага(раньше кодил только на кубейсике и паскале,лол)?
Если не смущает операционная система виндоуз то Visual Studio. Альтернативные варианты Code::Blocks и Qt Creator - это из тех что проще всего навернуть. Совсем небольшие куски кода можно в ideone тестить.
Что-то - да.
Vim + gcc, конечно же.
>str2[size] = '\0';
А не str2[size+1], чтоб место было под этот новый символ?
Спасибо за ответ.
В индексах от 0 до size-1 находятся символы строки, по индексу size нужно вписать терминальный ноль.
А что ты новичку посоветуешь? Vim? Emacs? Студия потому-что скачал и программируешь, даже формошлепствовать можно. Кобдблокс - скачал правильную версию (с компилятором) и программируешь. Размер не сильно важен. Наберет опыта - выберет инструмент под свои цели.
На крестах третий год уже ни строки не писал. Захотелось посмотреть, что изменилось.
Нихуя не изменилось. Разработка под C++ как была, так и осталась адскими муками. Начиная с самого малого. Вот надо мне заюзать класс из сторонней библы. Как я в других языках/IDE это делаю? Project properties > sources > add dir. Всё. Что я должен сделать в VS? То же самое плюс указать каждую папку библы в additional directories и вручную включать через include хуй знает какой хедер, чтоб этот класс появился - и так в каждый файл с кодом.
И пока не просидишь в гугле и не найдешь название хедера, в intellisense этот класс даже не появится. Т.е. приходится реально зубрить внутреннее устройство фреймворков, вместо того чтобы нажать ctrl+space, ввести часть названия класса на интуитивном уровне (Sprite, i.e.), и насладиться автодополнением в полном виде.
Может, я таки не разобрался, и есть плагины/опции студии, позволяющие избегать этого геморроя и автоматизирующие процесс?
А когда в "других IDE" ты указываешь путь, а по нему, допустим, несколько версий либы для разных сборок, ты что будешь делать-то, ммм? В VS подключение в джва действия: добавляешь папку с либой в additional headers и добавляешь пусть к самому .lib. Действий на 10 секунд, зато гибкости больше на порядок. Можно регулировать debug/release версии либы и вот это все.
В библиотеке есть TvoyaMamka.h и TvoyaBabka.h. В обоих есть классы Korzinochka с разными интерфейсами. Ты пишешь Korz без подключения хедера, что по-твоему происходит?
http://ideone.com/Ii3qau
Как вообще условие (-1 < 16) может вернуть false?
/на закоменченое не обращайте внимания/
((size_t)-1 < 16)
Ладно, предыдущий вопрос снимается, объясните плз почему данное выражение возвращает false
Гугли Литвиненко Н.А. - Технология программирования на С++. Win32 API-приложения. Очень хорошая книга для начинающих
Проиграл.
Какой же хуйней вы занимаетесь в 2015 году.
Никогда не интересовался плюсами, ради интереса решил зайти, а тут ТАКОЕ.
>путь, а по нему, допустим, несколько версий либы для разных сборок
Даже больше скажу. Обычно у меня это несколько натив расширений для андроида, iOs, библиотеки для PC, либы для веба. 4 сборки. Никаких проблем, все обрабатывается и подключается автоматически.
>добавляешь папку с либой в additional headers и добавляешь пусть к самому .lib. Действий на 10 секунд
Хех. А про прописывание ручками include в каждом файле (а их сотни)? Далеко ходить не надо - пока не пропишешь include <string>, у тебя нет доступа к классу std::string. Тогда как в том же не самом лучшем эклипсе import-ы прописываются автоматически и в intellisense показываются все (вообще все) классы.
Вот я и интересуюсь - мб можно так же в VS сделать? Похоже, нет.
>>512568
Высвечитыается список:
Korzinochka - TvoyaMamka
Korzinochka - TvoyaBabka
Выбираешь один из них (enter или вниз, enter) - эклипс сам добавляет соответствующий хедер.
>Выбираешь один из них (enter или вниз, enter) - эклипс сам добавляет соответствующий хедер
Хм. Надо будет тогда глянуть. А что там насчет отладки, можно смотреть/менять переменные? Многопоточная отладка есть?
За то мы победили
Ты вопрос о том, можно ли положить функцию в сегмент данных. Ты вот на своем питоне или на чем ты там пишешь можешь?
Какая передача функции, лол? Для нормальной работы с передачей первоклассных функторов не нужно перезаписывать код, они же энивей реализуются через указатели. А товарищ спрашивал про что-то из разряда самомодификации, исполнения стека и вот этого всего. Подобное байтоебство вообще относительно легально только в виде голого асма, никто и никогда не предоставляет таких средств жи. Тем не менее, после некоторых плясок на крестах можно такое провернуть, а вот в джаве/питоне/функциональной параше ты соснешь с такими задачами абсолютно точно.
С многопоточностью не работал (игры и простые аппы пилил). Отладка норм, все смотрится и изменяется на лету, но вроде отмотки назад (intellitrace?) нет. Но это для java/as3. С крестами там, похоже, жопа еще больше, чем в VS, я час проебался с хелло вордом, но так его и не запустил. Каждые 5 минут ошибки, и на эти ошибки куча топиков в гугле, т.е. это типа так и надо. Все через жопу.
Еще мне жутко не хватает рефакторинга. В эклипсовых IDE выделяешь класс, жмешь хоткей (ctrl+shift+r), вводишь новое название - все переименовывается само - и классы и конструкторы, и файлы, и хедеры. Но уж это я надеюсь в плагинах VS найду.
Нене, рефакторинг уже завезли в VS2015, по ощущениям охуенно. Там вообще много добавили, например, графики занятой памяти и загрузки ядер. Анимированные, блядь, графики, в реалтайме, я аж теку. Только предрелизная версия не до конца вылизана, но релиз уже скоро.
>статические члены класса выделяются при старте в сегменте данных
>статические функции могут быть статическими членами класса
>значит статические функции-члены класса тоже хранятся в сегменте данных?
>НЕТ!! в сегменте данных хранятся только МАССИВЫ!!!! Сделай функцию МАССИВОМ!!!
Речь шла про данные, сука, не путай. Только потом он про статические методы спросил. Так можно до чего угодно доебаться.
И расширить его нельзя? Почему нужно разное количество памяти чтобы порвать стэк и кучу?
А теперь мне дураку расскажите. Например обыные переменные и указатели хранятся на стеке. А массивы типо int m[5] хранятся где? А функции как хранятся? Указатель в стеке, тело в куче?
Потому что в современных системах не используется сегментная организация памяти. Используется страничная, когда каждому процессу присваиваются определенные страницы виртуальной памяти, которая не равна по размеру аппаратной. Процесс видит только виртуальную память, причем только свои страницы, а при обращении по адресу процессорное ядро аппаратно просматривает таблицу страниц и преобразует виртуальный адрес в настоящий. Страницы тоже делятся на страницы с "данными" и "командами". Но никто не мешает дополнительно подкачать сколько угодно виртуальных страниц можно адресовать до 2^64 байт, ну ты понел, которые хранятся на диске, пока не используются. Поэтому все ограничения на размер идут не от реальных размеров сегментов, а от того, что ОС не хочет выделять процессу моар. А т.к. считается, что куче и стеку нужно разное количество памяти, то и ограничения разные.
Ну вот смотри. Ты написал программу, откомпилировал, она преобразовалась в машинный код. Когда ты запускаешь ее, загрузчик ОС берет весь код из файла и копирует в область памяти с кодом. В файле отдельно описаны статические переменные, для них загрузчик зарезервирует место в области данных. А вот все остальные переменные не требуют никаких отдельных действий загрузчика с памятью. Какое-нибудь {int a;} преобразуется в PUSH/DEC BP в самом коде, где она используется. Поэтому они и называются автоматическими, в том смысле, что они автоматически создаются самим кодом на стеке, без участия загрузчика. Массивы в этом плане ничем не отличаются.
Спасибо, все понятно
Про виртуальную память есть что почитать? Советовали лекции в которых много раз про виртуальную память упоминают, а что это не поясняют. и книгу http://ftp.vtyulb.ru/%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5%20%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B%20%28%D0%BC%D0%B0%D1%88%D0%B1%D1%83%D0%BA%29.pdf. Прочитать книгу достаточно чтобы понять виртуальную память или надо отдельно изучать?
Ну, я после Машечкина все кристально понял, например. Правда, когда он анально карает за пропуски лекций, а зимой хардкорный экзамен, это немного другое, чем читать книгу.
https://arhivach.org/thread/94971/
https://arhivach.org/thread/94972/
Я же скромняша. Не уверен был, что кому-то это нужно будет потом. Если хотите, буду схоронять, конечно. Алсо, вообще пилите пожелания/предложения/литературу для шапки/что угодно. В новом треде тогда добавлю по реквестам.
suka pidor
В винде большие проблемы из-за codepage 866 в консоли. Надо или сохранять файл в 866, или подменять cout на что-то с конвертом, или менять шрифт в свойствах cmd.exe через alt-пробел. А в линуксах проблем не помню.
>литературу для шапки
Может Бьерне Страуструп "Программирование. Принципы и практика использования C++" в раздел для новичков?
>пожелания
Переконвертить все книги из ОП-поста в пдф, выложить прямую ссылку на файл чтобы можно было просмотреть в браузере и сократить ссылку с помощью гугла. Возможно для тебя одного это будет сложно поэтому я разберусь как это сделать и помогу.
Задачки в интернете. Их больше. Писать быстрее.
А почему бы и нет? Это рождает охуительный возможности по обфускации.
>Может Бьерне Страуструп "Программирование. Принципы и практика использования C++" в раздел для новичков?
Можно, но приготовьтесь жрать блины говно с лопаты.
>>512015
>std::ios::sync_with_stdio(false);
Снятие флажка синхронизации с сишными потоками ввода/вывода ускоряет <iostream> , а не <fstream> . Ещё немного платины на эту тему:
>Насколько медленны iostreams?
http://habrahabr.ru/post/246257/
А теперь о том, как собственно увеличить скорость <fstream> . Дело в том, что потоки ввода/вывода в C++ имеют кроссплатформенную реализацию, и эта реализация может с разной скоростью работать на разных операционных системах / компиляторах. Как работают потоки (since C++11): им даётся имя файла std::string и они конструируют объект типа std::fstream (например std::fstream , это уже ты решаешь), который имеет... та-дамм! Буфер для чтения и/или записи.
(продолжение следует)
>std::ofstream ofs; //only writing
>ofs.rdbuf()->pubsetbuf(0, 0); //both zeros to disable buffer
>ofs.open(filename, std::ios::binary); //std::string filename
>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
Важный момент:
http://stackoverflow.com/questions/16605233/how-to-disable-buffering-on-a-stream
>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).
fast fix
>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
>}
Впрочем, если пишешь знаковый char_array, то всё ещё проще:
>for (std::size_t i = 0; i < n; ++i)
>{
> fill_array(signed_char_array, i);
> ofs.write(signed_char_array, array_size); //std::streamsize array_size
>}
На самом деле у меня вся литература и дохуя по крестам, не вошедшего в шапку уже есть в pdf/djvu, только заливать я не знал куда, поэтому искал по новой на книгообменниках. Вообще, годная идея же, надо тогда найти, где размещать будем это все, чтобы прямая ссылка не привязывалась к ойпи.
Но зачем, лол? if (a & 1) {нечетное} же.
Эту книку стоит читать не прочитав версию "без учёта специфики х64"
Пробовал на dropbox, но там качать неудобно. Пробовал на какой-то вечный файлообменик, но там скорость маленькая. В контакт получилось удобнее всего. Так https://vk.com/doc10903696_406254436 или https://goo.gl/43uPI1 но только пдф надо. Если боишься что кто-то про твою страницу узнает могу сам всё залить. Только выложи пдэфы которые есть чтобы самому не конвертировать.
Забыл добавить что прямая ссылка нужна была чтобы не искать кнопочку для предпросмотра. Поэтому такая тоже пойдёт.
>Как в этом случае выводить 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
Разметка говно и сожрала пару *, но где начался курсив, и где он закончился, там и сожрало.
Код с пика выполняется 800 мс, а без оптимизации 330. Что я не так делаю?
Вот мои схороненные. Нюфажеские я не схоронял, но они в шапке уже по прямым ссылкам, так что можно взять оттуда для конвертации в pdf.
http://my-files.ru/9n9v2o
Тут что-то не так со скоростью. Хотя перед контактом попробую сюда залить.
1. Там повторяются старые и новые издания. Ничего страшного если залью только новые? Если надо будет потом старые добавлю. На пике выделил те что можно не заливать.
2. Джоссатис больше чем пол гига весит. Попробуй у себя поискать пдф поменьше, а я ещё раз в инете гляну. Если не найдём оставим то что теперь в шапке.
3. Записал годы выпуска английской версии. В интернет при поиске показывает год выхода русской версии. Может для удобства поиска их через / написать? Или это излишне?
http://tonsky.livejournal.com/221767.html
вот этого почитай
Алсо на пикрилейтеде моя схема. Подсвечены только идентификаторы, комментарии и текст в кавычках. Вообще не понимаю, почему по дефолту всегда и везде подсвечивается всякое говно вроде int или using, блять, в этом же вообще смысла нет.
> Он тоже подсвечивается
Ещё светлее его сделай.
> цвет идентификаторов и текста в кавычках похож
Ярко голубой и фиолетовый. Ты либо толстишь так, либо и впрямь поезавший.
Так лучше? У тебя всего 3 цвета на чёрном фоне. Мог бы цвет в кавычках красным сделать для контраста.
> У тебя всего 3 цвета на чёрном фоне
Ты статью читал вообще?
> Мог бы цвет в кавычках красным сделать для контраста
Я не понимаю, он недостаточно контрастный для тебя? Сливается с фоном или что? Ты уже сетчатку себе спалил к хуям свой цветовой схемой, ничего не видишь.
>std::ios::binary
>Это обязательно?
Почему нет, если явно текст в файл не пишешь? Бинарный режим не нужен, если у тебя возможна ситуация, когда один чар может быть записан более чем одним байтом. Я не настаиваю (не эксперт), просто интересуюсь, какие возможны варианты.
>>512946
>Что я не так делаю?
Применяешь мой совет по быстрой записи больших массивов (но не больших, чем может записать ОС) к записи микроскопических данных.
Кто виноват? Не ты, а я, что дал глупый совет >>512936 записывать единичные int, double и небольшого размера std::string -- не подумал.
Почему этот совет подходит только для массивов среднего размера? Объясняю на пальцах: отключение буфера приводит к тому, что на каждый чих <fstream> обращается к жёсткому диску как только ему ОС предоставляет такую возможность физически. Если к жёсткому диску обращаться 100 000 раз ради нескольких байт, можно и жёсткий диск попортить при частом использовании твоей программы. Работать в любом случае будет медленно.
Что делать? Установить размер буфера равным (или делящимся нацело, если есть подозрения, что ОС не сожрёт записать такой объём за один раз) количеству итераций по записи значения * на его sizeof .
http://en.cppreference.com/w/cpp/io/basic_streambuf/pubsetbuf
http://www.cplusplus.com/reference/streambuf/streambuf/pubsetbuf/
Попробую переписать твой пример (напоминаю, что согласно стандарту 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);
>std::ios::binary
>Это обязательно?
Почему нет, если явно текст в файл не пишешь? Бинарный режим не нужен, если у тебя возможна ситуация, когда один чар может быть записан более чем одним байтом. Я не настаиваю (не эксперт), просто интересуюсь, какие возможны варианты.
>>512946
>Что я не так делаю?
Применяешь мой совет по быстрой записи больших массивов (но не больших, чем может записать ОС) к записи микроскопических данных.
Кто виноват? Не ты, а я, что дал глупый совет >>512936 записывать единичные int, double и небольшого размера std::string -- не подумал.
Почему этот совет подходит только для массивов среднего размера? Объясняю на пальцах: отключение буфера приводит к тому, что на каждый чих <fstream> обращается к жёсткому диску как только ему ОС предоставляет такую возможность физически. Если к жёсткому диску обращаться 100 000 раз ради нескольких байт, можно и жёсткий диск попортить при частом использовании твоей программы. Работать в любом случае будет медленно.
Что делать? Установить размер буфера равным (или делящимся нацело, если есть подозрения, что ОС не сожрёт записать такой объём за один раз) количеству итераций по записи значения * на его sizeof .
http://en.cppreference.com/w/cpp/io/basic_streambuf/pubsetbuf
http://www.cplusplus.com/reference/streambuf/streambuf/pubsetbuf/
Попробую переписать твой пример (напоминаю, что согласно стандарту 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);
Можно ещё раз. Почему размер буффера не резмер строки, а количество обращение?
В примере на котором тестировал в первый раз было не 30, а 1000 символов в строке. Теперь результат от 30 до 40 мс. Это слишком мало чтобы сравнивать. Не слишком опасно сделать размер строки 1000 символов?
>Почему размер буффера не резмер строки, а количество обращение?
Ещё раз: ты хочешь 100 000 раз обращатсья к диску? Скорость запись на диск во много раз медленнее, чем работа с оперативной памятью.
>>512986
Лучше увеличь n в 100 раз. Всё равно задаётся константой в начале кода, а размер строки сделай символов 10-30, как удобно тебе. Жду 2 скриншота кода с и без выставления буфера результаты измерений в мс.
Спасибо. Получилось. С оптимизацией за 310мс. Без оптимизации 410 мс.
Хуже может быть, только если сделать фон каким-нибудь ядовито-зелёным, например, на мой взгляд.
Кажется понял. Вместо того чтобы выводить строку в файл он пишет его в буфер. А когда буфер в оперативной памяти заполниться он его выводит в файл. Тоесть чтобы к диску меньше раз обращаться надо увеличить буфер так чтобы в него влезло больше строк. А если размер строк очень большой, то буффер надо убрать и он сразу огромную строку выведет в файл не занося повторно в память. Всё правильно понял?
>>512993
Он дэфолтный. В настройках другой схемы нет. Самому пердолить желания нет. Может потом из интета скачаю красивую цветовую схему.
1. Там самые новые, которые я нашел. Т.е., допустим, если про шаблоны 96 года, то новых изданий не было, либо я долбился в глаза и не нашел их. В таком случае буду очень признателен, если ты покажешь, где есть что-то новее моих.
2. Это ты его сконвертировал, и он таким большим стал? В djvu же всего 50 МБ. Можно файнридером его распознать, ну или оставить djvu, мне кажется, новизна издания важнее удобства/размера.
3. Да можно вообще не писать, лол. Если там будут самые новые, анон откроет файл, и в нем уже указаны все подробности, на странице, где типографская инфа.
Вдогонку: ну я же вот открыл исходную djvu, там прямо на первой странице написано про 2003 год. Ты бы тогда брал эти даты из самих файлов, а не из интернетов, изданий-то много разных, некоторым уже по двадцать лет.
Еще вдогонку: я таки долблюсь в глаза и перепутал соседние файлы. У тебя все правильно, но таки ссылки на новые издания для выделенных реквестирую.
>Спасибо. Получилось. С оптимизацией за 310мс. Без оптимизации 410 мс.
Я ожидал большего. Впрочем, какая ОС, какой компилятор? Скажи, а я поделюсь своими наблюдениями про "без буфера массивы среднего размера".
>>512999
Всё правильно понял?
Да.
Небольшое дополнение: при отключённом буфере нужно не прошляпить момент, когда в общем-то любая ОС сможет записать твой массив за один раз. 4 мегабайта, полагаю, любая современная ОС может записать за 1 раз. Ну и не забывай про всяческие sizeof, чтобы не прострелить себе ногу, ведь стандарт строго регламентирует только sizeof(char) == 1.
Dev-c++ НАчинал и не жалею. Недавно скачал видимую студию и охуел от того сколько нужно манипуляций чтобы запилить халоворлд.
>1. Там самые новые, которые я нашел. Т.е., допустим, если про шаблоны 96 года, то новых изданий не было, либо я долбился в глаза и не нашел их. В таком случае буду очень признателен, если ты покажешь, где есть что-то новее моих.
А нет таких же книг, но поновее и другого автора?
>2. Это ты его сконвертировал, и он таким большим стал? В djvu же всего 50 МБ. Можно файнридером его распознать, ну или оставить djvu, мне кажется, новизна издания важнее удобства/размера.
Тоже в инете ничего не нашёл. Заливать не буду, а возьму ссылку из шапки.
>3. Да можно вообще не писать, лол. Если там будут самые новые, анон откроет файл, и в нем уже указаны все подробности, на странице, где типографская инфа.
Так проще неверно ориентироваться в файлах. Ладно это оставлю как есть.
>>513004
Брал данные не с первой странице, а английское издание как на первом пике.
>>513008
На втором пике не они? Те же книги на ту же тему, от тех же авторов, но поновее.
>А нет таких же книг, но поновее и другого автора?
Ну, Мейерс это своеобразный гуру, в других книжках обычно более примитивные рекомендации даются. А тут что-то на уровне собрания статей из блога, как делать лучше всего. Энивей, подобные вещи не сильно устаревают, там же нет жесткой привязки к синтаксису, так что сойдет и 2000 год, думаю. Она больше не перевыпускалась, к сожалению, но у него вышла новая книга Effective Modern C++ я ее тоже залил в архив, правда она до сентября только на ангельском будет.
>На втором пике не они? Те же книги на ту же тему, от тех же авторов, но поновее.
Нет, другие. У Саттера и Мейерса они именно дополняют первые, рассказано то, что не вошло в предыдущие. Джоссатис и Вандевурд это тоже другая, но вот она таки немного устарела уже, шаблоны сильно обновили в новом стандарте. Можно ее не включать, думаю.
Заливать то что на пике? Теперь не могу, но сегодня начну. Завтра закончу. И одним постом отчитаюсь. Если ссылки через гугл сокращу лучше будет? Они же вечно работают?
>Раньше >>511954 обычный fstream без оптимизации 320 выдавал, а fprintf 360. Во всех случаях выводил 100 МБ. Теперь только больше раз выводил меньшую строку.
Вот теперь я вообще ничего не понял. Ты мне вот этот код >>512989 , его же с закомменченными 8 и 10 строкой, и сишную запись в файл. Хотелось бы увидеть три цифорки с миллисекундами.
>GCC с линуксом
А, ну ожидаемо, что ручной оптимизацией ты выиграл (410-310)/310 = 32%, это не так плохо. В винде-то всё ещё деревяннее.
Это я к тому, что в винде при записи средних и больших массивов при отключённом буфере делается всё с мало-мальски приличной скоростью, т.е. практически запись в файл перестаёт быть бутылочным горлышком. С дефолтным конструктором при записи больших и средних массивов скорость записи падает... пожалуй, в десятки раз.
>>513176
>с закомменченными 8 и 10 строкой
Забыл 8 закоментить. Теперь он 400 мс работает.
> и сишную запись в файл
Нет. Эти измерения делал раньше.
Провёл все измерения снова и получилось:
1. Без оптимизация пик 400 мс
2. Оптимизация буфером 310 мс
3. Вывод в стиле С с помощью .c_srt() 430 мс
4. Вывод в стиле С с помощью С-строки 410 мс
Может как-то не так проверяю? Делаю как на пике и смотрю на real.
Ну, в ходе твоих измерений выяснили, что fstream твёрдо быстрее си, хоть с оптимизациями, хоть без. У тебя же вроде была претензия изначально, что fstream медленнее работает, если я правильно понял?
>У них большая разница в скорости. Те кто fscanf писал сделали за 60 мс, а те что fstream за 150 мс. При чём алгоритм был примерно одинаковый.
Да. Сам не понял. Начальные измерения с чужих задач на кодфорсе. И те кто писали в стиле С делали быстрее. На кодфорсе надо делать вывод в стандартный поток, а он сам его в файл перенаправляет. Но при очной олимпиаде вывод надо делать в файл самому и комп будет на винде. К этому я и хотел подготовиться. Есть что почитать на эту тему оптимизация fstream с помощью регулирования размер буфера в интернете?
Минут через 15 закончу заливать на dropbox ещё через 10 проверю и сокращу ссылки и через 5 вброшу в тред. Через полчаса всё будет.
https://goo.gl/e1V5BC Александреску - Современное проектирование на языке C++(2002)
https://goo.gl/HdELHy Джосаттис Н.М. - Стандартная библиотека C . Справочное руководство(2012)
https://goo.gl/uImH0J Мейерс - Effective Modern C++ (англ.)(2015)
https://goo.gl/tHa0tO Мейерс - Наиболее эффективное использование C++(1996)
https://goo.gl/wsDXGz Мейерс - Эффективное использование C++(2005)
https://goo.gl/QtS8Dc Мейерс - Эффективное использование STL(2002)
https://goo.gl/4nn512 Саттер - Новые сложные задачи на C++(2004)
https://goo.gl/iWaa6S Саттер - Решение сложных задач на C++(2002)
https://goo.gl/Cpk4YR Саттер, Александреску - Стандарты программирования на C++(2005)
https://goo.gl/FqbPwo Страуструп - Дизайн и эволюция C++(1994)
https://goo.gl/iZBDiV Страуструп - Язык программирования C++(2010)
https://goo.gl/qJfBkD Уильямс - Параллельное программирование на C++ в действии(2012)
Когда будешь в шапку заносить на всякий случай предупреди что если попросит регистрацию то надо закрыть окошко и нажать "скачать" снова.
>Джосаттис Н.М. - Стандартная библиотека C . Справочное руководство(2012)
Опечатка. Нужно С++. Там исправил. В шапке тоже поправь.
Прога под никсы, с байндингом бод eth0.
Подскажите, с чего нечать. А то я только пол годна на плюсах, а в си полный ноль.
"Кто-нибудь использует code::blocks?
Не могу понять как заставить окно Wathces появляться автоматически во время дебага. Т.е начинаю отладку и нужно каждый раз лезть debug->debuging windows -> wathces.
И еще не могу изменять в вотчах элементы массива, пик. Как тут программировать вобще. Хотел эту иде как замену Студии. "
>И те кто писали в стиле С делали быстрее. На кодфорсе надо делать вывод в стандартный поток, а он сам его в файл перенаправляет.
не вижу смысла обсуждать чёрный ящик.
>Но при очной олимпиаде вывод надо делать в файл самому и комп будет на винде. К этому я и хотел подготовиться.
Измерения ты провёл, решай сам.
>Есть что почитать на эту тему оптимизация fstream с помощью регулирования размер буфера в интернете?
Лучше почитай на тему винды, какой у неё максимальный и/или оптимальный по скорости буфер записи на жёсткий диск. Дальше сам знаешь что делать.
>>513289
Я бы на твоём месте на CLion перекатился. Если она такая же как и идея - вообще годнота.
Единственное что, если у тебя много свободного времени, разберись, как в сишечке отключается буфер / выставляется буфер и его размер. Там ведь абсолютно та же кухня (только, очевидно, без ООП), что и в iostream. Что будет быстрее, ну мне было бы очень интересно знать, просто времени и сил не так много.
Т.е. можешь провести дополнительные измерения с оптимизацией fprintf или что там в си, я не знаю. Если сделаешь -- можешь сюда написать, я читаю C++ треды (все остальные треды не читаю).
>Там ведь абсолютно та же кухня (только, очевидно, без ООП), что и в iostream.
fastfix: что и в <fstream>
Еще выше был кун, который просил впилить книгу Страуструпа для нюфагов, ее бы неплохо добавить к тем трем. Но у меня ее нет, нагуглил только какое-то говно в .chm.
https://goo.gl/PEyiMH Джосаттис Н.М. - Стандартная библиотека C++. Справочное руководство(2012)
>>513358
Нашёл в djvu уже конвертирую.
Нашёл setvbuf и setbuf, но пока не понял их отличия. Также нашёл в описании это предложение.
> Буфер записывается на физическое устройство каждый раз, когда встречается символ новой строки
Заменил в строке вывода последний символ на \n, но результат почти без изменений. Также узнал что по умолчанию размер буфера для вводы/вывода в стиле С у меня 8192.
На первом пике 310 мс, а на втором 360. Как так ещё не понял. Первый пик выводит буфер в файл после заполнения, а второй пока не понял.
Лучшие результаты C и C++ одинаковые -- 310 мс. Тебе необходим замер на большие количества данных (например, чтобы писалось минуты), может там разница будет.
Если, конечно, ты уверен, что I/O будет самым узким бутылочным горлышком в твоей олимпиаде.
После рассказа об возможном повреждении HDD боюсь увеличивать размер файла. Если буду выводить в /dev/null результаты можно сравнивать?
Ещё раз проясню: возможное повреждение HDD у тебя могло быть на этом этапе (цитирую тебя):
>512985
>Можно ещё раз. Почему размер буффера не резмер строки, а количество обращение?
Если же будешь писать крупными кусками (буфер намного больше, чем переменные. которые ты пишешь), ничего не станется. Фильмы ты не боишься на свой компьютер копировать?
>Если буду выводить в /dev/null результаты можно сравнивать?
Тебе нужно ставить физический эксперимент с записью на жёсткий диск. Ну ты понял.
Тоесть нужно увеличить n? Он выдаёт ошибку про сегментацию память или что-то в это роде.
Ну вот, видимо, экспериментально и подобрались к ограничению твоей сейчасшней ОС на максимальный буфер записи жёсткого диска.
Тогда делаешь так, как я говорил раньше: n оставляешь таким, чтоб не было segmentation fault, делаешь буфер, и вводишь дополнительную переменную m = n * 100; например, чтобы получить в 100 раз более долгий эксперимент по времени.
>for (... i < m; ...)
И так для фпринтфа и для фстрима.
P.S. Вангую отличие результатов не более чем на 5%.
Кстати, здесь на втором скрине, я так понял, обе строчки должны быть раскомменчены, раз результат очень быстрый.
Да. Это я не ту программу протестировал.
>>513428
Очень странно запускаю с 8382052 и всё работает примерно 10 сек. Второй раз запускаю и ошибка. Ничего страшного если n будет 8000000?
Теперь нужно чтобы количество циклов было больше размера буфера? Может в 10 раз будет достаточно, а то 1000 сек. Я не прожду.
>Очень странно запускаю с 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
> почему уже такие тупые вопросы спрашиваешь?
Чтобы быть уверенным что всё правильно делаю. Долго всё по много раз проверять.
>Долго всё по много раз проверять.
Здесь тебе так и так проверять придётся, ты лучше меня знаешь, какие объёмы данных тебе придётся писать.
Ну и вообще, про экстраполяцию слыхал?
И отчего жёсткий диск попортиться может, в конечном итоге понял или нет?
Забыл добавить что 8 гигов буфером в 8 магабайт строку из 100 символов 80000000 раз выводил.
>От того что много раз меленькие объёмы данных записывать?
Ну да, по-моему предположению, из-за частых циклов записи (да и чтения тоже) просто уменьшается его время жизни. Но лучше пускай знатоки железа выскажутся.
>Проверил быстрые fstream средняя скорость 1 мин. 18 сек.
>Забыл добавить что 8 гигов буфером в 8 магабайт строку из 100 символов 80000000 раз выводил.
Сравнение с сишечкой давай при тех же параметрах.
Со string удобнее работать проще. Думаю теперь проведу ещё пару тестов с другими типами. Где искать советы по оптимизации программы без изменения её алгоритма?
>Со string удобнее работать проще. Думаю теперь проведу ещё пару тестов с другими типами.
Можешь влететь по производительности, если не будешь делать с reinterpret_cast<const char> и низкоуровневой функцией записи ofs.write(arr, arr_streamsize);
подробно я описал тут:
>512797 >512803 (быстрее этого уже не будет ничего):
>std::ofstream ofs; //only writing
>ofs.rdbuf()->pubsetbuf(0, 0); //both zeros to disable buffer
>ofs.open(filename, std::ios::binary); //std::string filename
>for (std::size_t i = 0; i < n; ++i)
>{
> fill_array(any_type_array, i);
>(any_type_array), array_size); //std::streamsize array_size> ofs.write(reinterpret_cast<const char
>}
std::streamsize -- это знаковый аналог std::size_t , в него легко кастовать статик_кастом
Кстати, почему в своих программах ты нигде не используешь std::size_t для индексов и разметки памяти? Стандарт, как-никак.
Пидорашенная разметка. Ну ты понял, где начинается курсив, там первая * , где заканчивается курсив, там вторая.
Есть ли смысл учить .Net зная лишь С++/CLI?
Обязательно ли учить С#?
Тогда выписываешься из своей маленькой хрущёвки и поселяешься на http://ru.cppreference.com/w/
Параллельно учишь английский, потому что база статей на русском там весьма неполна (почти все машинный перевод) и, кроме того, частенько на http:://www.cplusplus.com , хоть это и не официальный сайт, бывают более адекватные, полные и более ясные для понимания примеры.
начни-ка с http://ru.cppreference.com/w/cpp/io/basic_ostream/write
Хотя при полном незнании английского языка я бы всё равно предпочёл
http://www.cplusplus.com/reference/ostream/ostream/write/?kw=write
НЕ ЗАБЫВАЙ ПЕРЕКЛЮЧАТЬСЯ НА ВКЛАДКУ C++11 , по умолчанию не она
Но моим примеры более понятные для понимания. Что такое reinterpret_cast <const char*>? Это указание компилятору, чтобы он думал, что там массив типа char, так ещё и указание конст чтоб не менять его. Обманываем компилятор и правильно делаем, ради скорости.
В чем вопрос то?
.net без сишарпа есть, но его мало.
Учить вообще ничего не надо, работать надо.
2. float 55 мегабайт 9 780 мс. fstream
3. long 95 мегабайт 1 650 мс. fprintf
4. float 46 мегабайт 4 230 мс. fprintf
>>513482
>НЕ ЗАБЫВАЙ ПЕРЕКЛЮЧАТЬСЯ НА ВКЛАДКУ C++11 , по умолчанию не она
А как включить? И как проверить или включён?
>А как включить? И как проверить или включён?
См. приложенный пик.
>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
>что мы пишем чары, а на деле пишем какой-то другой массив или даём ссылку на переменную.
Если там будет к примеру 2 байта unsigned short(12), а мы скажем что там чар. То он вместо "12" выведет 2 байта преобразовав их в чар. Тоесть char(0) и char(12). Разве нет? Не в интернет статья по этой теме?
В интернет нешёл что пишут у прата про это хорошо поясняется. Это так? Стоит отрывок из его книги читать?
>Думал что ты про компилятор.
Компилятор у тебя просто последней версии должен быть, тогда всё в порядке с 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 элемента чара).
>Думал что ты про компилятор.
Компилятор у тебя просто последней версии должен быть, тогда всё в порядке с 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 элемента чара).
Почему не используешь скрипт для [CODE]?
И всё же я не понимаю. Ведь переменные разных типов хранятся в память по разному. Откуда он знает как их переводить в другой тип? И ещё. Программа с примера в файл записывает байты, а не символы.
Скрипт не использую, потому что смотри соседний тред про Столярова Андрея Викторовича у меня помирающий компьютер, ещё не хватало навешивать всяческие плагины на браузер. Я вообще сторонник веб 1.0.
>Откуда он знает как их переводить в другой тип?
Он их не переводит в другой тип, он подряд расположенные байты в памяти воспринимает как другой тип. Реинтерпрет_каст на этапе выполнения кода ~почти всегда является бесплатной операцией.
Константу я навесил чтобы подчеркнуть read-only характер действия в отношении памяти.
>>513522
>Что такое streamsize?
Я кому ссылку на вики дал?
http://ru.cppreference.com/w/cpp/io/streamsize
http://www.cplusplus.com/reference/ios/streamsize/
Стримсайз -- это размер в байтах того, что пишешь за один раз с помощью write() . Знаковый тип, обращаю внимание, поэтому не std::size_t
>Он их не переводит в другой тип, он подряд расположенные байты в памяти воспринимает как другой тип. Реинтерпрет_каст на этапе выполнения кода ~почти всегда является бесплатной операцией.
Значит он полезен только при выводе string? Ведь другие типы совсем не так представляются в памяти как массив char. Значит другие типы никак не ускорить?
>Я кому ссылку на вики дал?
Там по предложения про это. По чему отдельный тип? Почему не int?
>другие типы совсем не так представляются в памяти как массив char
Структуры так представляются, например.
>Ведь другие типы совсем не так представляются в памяти
Другие типы в оперативной памяти лежат в количестве 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).
Выводом куда именно? Если в файлы, то по легенде, M$ Word их так прямо в файлы и бросал.
ulong rc = write (файл, смещение, структура, sizeof (тип));
> тебе 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 всё расписал.
>А строку выводить Как в твоём примере?
Возьми строку "abc", два раза запиши её в файл.
Если файл будет 6 байт, значит, делимитером надо ставить char delimiter = '\0'; (т.н. null-char, который обозначает окончание строки).
Если файл будет больше 6 байт, там автоматически проставится '\0'. Но так не будет, мне кажется.
Ты видимо уже устал пояснять. Спасибо. Всё что не понял перечитаю заново и нагуглю. Ещё раз спасибо.
>Неужели до сих пор вручную все кодят заголовки
не, зачем, автоматизация этого - одна из базовых опций любого рефакторного плагина любой ide
>записать в него любые байты, например, те, из которых состоит функция
в машкодах вообще то должна быть функция уже
Она будет записана в сегменте кода, а нужен сегмент данных.
Ясно.
Если перед вузиком то норм. Книга хорошая но она старая, и там не плюсы же.
1) Посоветуйте годную литературу по Qt. Или исключительно Qt Documentation курить?
2) В одном из прошлых тредов анон выкладывал со своими пояснениями список литературы и каналы на ютубе, там ещё помечал их типа LEVEL 1, LEVEL 3 и т.д. Может схоронил кто-нибудь?
PS. Половину этого я тестил, другую половину собирал по рекомендациям.
=====================================================
Books:
[LEVEL1] http://www.math.spbu.ru/user/dlebedin/cpp1.pdf – методичка по VS 2010 C++ СПбГУ. (чтобы перейти к следующей части методички изменить цифру после cpp)
[LEVEL1] http://aco.ifmo.ru/el_books/applied_programming/ - конспекты ИТМО
[LEVEL1] http://www.ozon.ru/context/detail/id/31315281/ - Страуструп
[LEVEL1] http://www.ozon.ru/context/detail/id/5410595/ - Лафоре ООП в С++
[LEVEL1] http://www.ozon.ru/context/detail/id/1498452/ - Шилдт справочник по С++
[LEVEL3] http://www.ozon.ru/context/detail/id/31619787/ - Qt программирование
[LEVEL3] http://www.amazon.com/Object-Oriented-Analysis-Design-Applications-3rd/dp/020189551X/ref=sr_1_1?s=books&ie=UTF8&qid=1431380343&sr=1-1 – ООП Гради Буча
Courses:
[LEVEL1] http://ru.yasno.tv/course/details/programming-start – Введение в язык
[LEVEL1] http://loftblog.ru/category/courses/osnovy-oop-na-s/ – Основы ООП С++
[LEVEL3] https://ru.coursera.org/instructor/~214 – Алгоритмы на C++
[LEVEL1] https://stepic.org/users/31 и https://www.lektorium.tv/speaker/2941 – Курсы Александра Смаля
[LEVEL1] https://stepic.org/users/12 и https://www.lektorium.tv/speaker/2678 – Курсы Александра Куликова
[LEVEL2] https://www.edx.org/bio/deepak-b-phatak – Курсы C++ программирования (минимум C++)
[LEVEL1] http://www.amse.ru/courses/cpp2/ - АСП по C++
=====================================================
YouTube channels:
[LEVEL1] http://www.youtube.com/playlist?list=PL2F919ADECA5E39A6 – С++ с основ
[LEVEL2] http://www.youtube.com/playlist?list=PL2D1942A4688E9D63 – C++ Qt с основ
[LEVEL3] http://www.youtube.com/view_play_list?p=9D558D49CA734A02 – Стэнфордские лекции по программированию (не только C++)
=====================================================
Sites:
[LEVEL1] http://acmp.ru/index.asp?main=tasks – Онлайн контестер с легкими задачами
[LEVEL2] http://www.boost.org/ - Boost библиотеки
[LEVEL2] http://www.amazon.com/gp/bestsellers/books/9045760011/ref=zg_b_bs_9045760011_1 – Популярные книги по C++
[LEVEL1] http://hyperpolyglot.org/ - Сравнивание языков программирования (быстрый переход с другого языка)
[LEVEL1] http://www.cplusplus.com/reference/ - Справочник по всем стандартным библиотекам C++ (можно просто вбивать в поиск запросы)
[LEVEL1] http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0 – Конспекты ИТМО
[LEVEL1] https://msdn.microsoft.com/ru-ru/library/3bstk3k5.aspx – MSDN справочник по C++
[LEVEL1] http://stackoverflow.com/questions/tagged/c%2b%2b или http://ru.stackoverflow.com/questions/tagged/c%2b%2b – задаем вопросы по С++
=====================================================
Contests and algorithms:
[LEVEL1] http://acm.timus.ru/ - Архив задач для решения и редкие контесты
[LEVEL2] http://www.spoj.com/ - Архив задач на английском
[LEVEL3] http://www.sanfoundry.com/1000-cpp-algorithms-problems-programming-examples/ - алгоритмы и приемы на C++
[LEVEL2] http://algolist.manual.ru/ - Описание известных алгоритмов (устарел)
[LEVEL2] http://codeforces.com/ - Контесты + новости о больших контестах
[LEVEL2] http://www.topcoder.com/community/events/ - Еще одни контесты
[LEVEL3] https://www.hackerrank.com/calendar – расписание известных контестов
[LEVEL3] https://contest.yandex.ru/contest-list/ – контесты от Яндекса
[LEVEL3] http://cups.mail.ru// – Mail.ru cups (не только спортивное программирование)
[LEVEL4] https://code.google.com/codejam – контесты от google
[LEVEL4] http://icpc.baylor.edu/worldfinals/problems – задачи финалов чемпионата мира по программированию
=====================================================
Forums:
http://rsdn.ru/forum/cpp
http://www.cyberforum.ru/cpp/
http://www.cplusplus.com/forum/
http://www.qtcentre.org/forum.php
https://www.google.ru/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#newwindow=1&q=c%2B%2B+forum – другие запросы гугла
Забыл http://e-maxx.ru/algo/
Использовать сверху вниз.
https://www.youtube.com/playlist?list=PLbmlzoDQrXVFC13GjpPrJxl6mzTiX65gs или http://www.youtube.com/playlist?list=PL2F919ADECA5E39A6 или https://tech-mail.ru/materials/video/
http://www.itmathrepetitor.ru/zadachi-po-programmirovaniyu/
http://www.ozon.ru/context/detail/id/5410595/
http://hyperpolyglot.org/cpp
Затем ответвление в софт или спортивное программирование.
Софт:
http://www.amazon.com/Professional-C-Marc-Gregoire/dp/1118858050/ref=sr_1_2?s=books&ie=UTF8&qid=1431362511&sr=1-2&keywords=professional+programming+c%2B%2B
http://www.amazon.com/Game-Programming-All-Jonathan-Harbour/dp/1598632892/ref=sr_1_1?s=books&ie=UTF8&qid=1431362593&sr=1-1&keywords=game+programming+all+in+one
https://youtube.com/devicesupport
Спорт:
http://e-maxx.ru/algo/
Дасгупт, Кормен, Орлов, Техносфера.
http://codeforces.com/
http://www.topcoder.com/
PS. Половину этого я тестил, другую половину собирал по рекомендациям.
=====================================================
Books:
[LEVEL1] http://www.math.spbu.ru/user/dlebedin/cpp1.pdf – методичка по VS 2010 C++ СПбГУ. (чтобы перейти к следующей части методички изменить цифру после cpp)
[LEVEL1] http://aco.ifmo.ru/el_books/applied_programming/ - конспекты ИТМО
[LEVEL1] http://www.ozon.ru/context/detail/id/31315281/ - Страуструп
[LEVEL1] http://www.ozon.ru/context/detail/id/5410595/ - Лафоре ООП в С++
[LEVEL1] http://www.ozon.ru/context/detail/id/1498452/ - Шилдт справочник по С++
[LEVEL3] http://www.ozon.ru/context/detail/id/31619787/ - Qt программирование
[LEVEL3] http://www.amazon.com/Object-Oriented-Analysis-Design-Applications-3rd/dp/020189551X/ref=sr_1_1?s=books&ie=UTF8&qid=1431380343&sr=1-1 – ООП Гради Буча
Courses:
[LEVEL1] http://ru.yasno.tv/course/details/programming-start – Введение в язык
[LEVEL1] http://loftblog.ru/category/courses/osnovy-oop-na-s/ – Основы ООП С++
[LEVEL3] https://ru.coursera.org/instructor/~214 – Алгоритмы на C++
[LEVEL1] https://stepic.org/users/31 и https://www.lektorium.tv/speaker/2941 – Курсы Александра Смаля
[LEVEL1] https://stepic.org/users/12 и https://www.lektorium.tv/speaker/2678 – Курсы Александра Куликова
[LEVEL2] https://www.edx.org/bio/deepak-b-phatak – Курсы C++ программирования (минимум C++)
[LEVEL1] http://www.amse.ru/courses/cpp2/ - АСП по C++
=====================================================
YouTube channels:
[LEVEL1] http://www.youtube.com/playlist?list=PL2F919ADECA5E39A6 – С++ с основ
[LEVEL2] http://www.youtube.com/playlist?list=PL2D1942A4688E9D63 – C++ Qt с основ
[LEVEL3] http://www.youtube.com/view_play_list?p=9D558D49CA734A02 – Стэнфордские лекции по программированию (не только C++)
=====================================================
Sites:
[LEVEL1] http://acmp.ru/index.asp?main=tasks – Онлайн контестер с легкими задачами
[LEVEL2] http://www.boost.org/ - Boost библиотеки
[LEVEL2] http://www.amazon.com/gp/bestsellers/books/9045760011/ref=zg_b_bs_9045760011_1 – Популярные книги по C++
[LEVEL1] http://hyperpolyglot.org/ - Сравнивание языков программирования (быстрый переход с другого языка)
[LEVEL1] http://www.cplusplus.com/reference/ - Справочник по всем стандартным библиотекам C++ (можно просто вбивать в поиск запросы)
[LEVEL1] http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0 – Конспекты ИТМО
[LEVEL1] https://msdn.microsoft.com/ru-ru/library/3bstk3k5.aspx – MSDN справочник по C++
[LEVEL1] http://stackoverflow.com/questions/tagged/c%2b%2b или http://ru.stackoverflow.com/questions/tagged/c%2b%2b – задаем вопросы по С++
=====================================================
Contests and algorithms:
[LEVEL1] http://acm.timus.ru/ - Архив задач для решения и редкие контесты
[LEVEL2] http://www.spoj.com/ - Архив задач на английском
[LEVEL3] http://www.sanfoundry.com/1000-cpp-algorithms-problems-programming-examples/ - алгоритмы и приемы на C++
[LEVEL2] http://algolist.manual.ru/ - Описание известных алгоритмов (устарел)
[LEVEL2] http://codeforces.com/ - Контесты + новости о больших контестах
[LEVEL2] http://www.topcoder.com/community/events/ - Еще одни контесты
[LEVEL3] https://www.hackerrank.com/calendar – расписание известных контестов
[LEVEL3] https://contest.yandex.ru/contest-list/ – контесты от Яндекса
[LEVEL3] http://cups.mail.ru// – Mail.ru cups (не только спортивное программирование)
[LEVEL4] https://code.google.com/codejam – контесты от google
[LEVEL4] http://icpc.baylor.edu/worldfinals/problems – задачи финалов чемпионата мира по программированию
=====================================================
Forums:
http://rsdn.ru/forum/cpp
http://www.cyberforum.ru/cpp/
http://www.cplusplus.com/forum/
http://www.qtcentre.org/forum.php
https://www.google.ru/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#newwindow=1&q=c%2B%2B+forum – другие запросы гугла
Забыл http://e-maxx.ru/algo/
Использовать сверху вниз.
https://www.youtube.com/playlist?list=PLbmlzoDQrXVFC13GjpPrJxl6mzTiX65gs или http://www.youtube.com/playlist?list=PL2F919ADECA5E39A6 или https://tech-mail.ru/materials/video/
http://www.itmathrepetitor.ru/zadachi-po-programmirovaniyu/
http://www.ozon.ru/context/detail/id/5410595/
http://hyperpolyglot.org/cpp
Затем ответвление в софт или спортивное программирование.
Софт:
http://www.amazon.com/Professional-C-Marc-Gregoire/dp/1118858050/ref=sr_1_2?s=books&ie=UTF8&qid=1431362511&sr=1-2&keywords=professional+programming+c%2B%2B
http://www.amazon.com/Game-Programming-All-Jonathan-Harbour/dp/1598632892/ref=sr_1_1?s=books&ie=UTF8&qid=1431362593&sr=1-1&keywords=game+programming+all+in+one
https://youtube.com/devicesupport
Спорт:
http://e-maxx.ru/algo/
Дасгупт, Кормен, Орлов, Техносфера.
http://codeforces.com/
http://www.topcoder.com/
Тут отфильтровал то что на русском.
http://ru.yasno.tv/course/details/programming-start
http://loftblog.ru/category/courses/osnovy-oop-na-s/
https://stepic.org/users/31
https://www.lektorium.tv/speaker/2941
https://stepic.org/users/12
https://www.lektorium.tv/speaker/2678
http://www.amse.ru/courses/cpp2/
http://acmp.ru/index.asp?main=tasks
http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0
https://msdn.microsoft.com/ru-ru/library/3bstk3k5.aspx
http://ru.stackoverflow.com/questions/tagged/c%2b%2b
http://acm.timus.ru/
http://algolist.manual.ru/
http://codeforces.com/
https://contest.yandex.ru/contest-list/?ncrnd=5199
http://cups.mail.ru//
http://rsdn.ru/forum/cpp
http://www.cyberforum.ru/cpp/
https://www.youtube.com/playlist?list=PLbmlzoDQrXVFC13GjpPrJxl6mzTiX65gs
https://tech-mail.ru/materials/video/
http://www.itmathrepetitor.ru/zadachi-po-programmirovaniyu/
http://e-maxx.ru/algo/
Нет. Стандарт этого не гарантирует.
Проба
Проба2
Qt creator. Необязательно на куте писать даже
Не похуй. Community.
Потому что сперма.
Локаль подключи
А такое возможно на уровне пхп? Там же тоже можно тело функции в base64 зашифровать, в массив положить, а потом запустить.
Нет, у меня получше сосача будет. Только для мобилок дизигн просасывает. А так почти все функции куклы есть искаропки (спеллы в том числе), кроме совсем бессмысленных (ну типа там пробел после > вставлять при цитировании).
Еще это говно без учета скорости передачи (на локалхосте тестил) держит до 70к постов без картинок в час, или до 30к с картинками, или до 20к тредов.
Есть минималистичный режим, где не используются скрипты, но многие функции работают (такие как добавление файла к посту или редактирование поста (который отмечен как черновик и пока что другим посетителям не виден)).
Тег code, опять же, поддерживается без костылей. Ссылки на посты с других досок.
Есть и уникальные фичи (сомнительной полезности, но все же). Все описывать лениво. В общем, без лишней скромности, движок збс получился, мне нраица. Народу только нет, потому как агрессивно спамить-пиарить совесть не позволяет (и лень тоже).
Один забугорный тип в ирке базарил мне за то, что псевдовокселы потянет легко.
Что скажешь по этому поводу?
И как вообще, легко будет жабабляди пересесть на плюсы организовав по этому поводу вменяемо архитектуру стратегии с непрямым управлением?
Алсо, что скажешь о поиске пути? Именно по этой причине были выбраны плюсы. Советуй, анон.
Попробуй, сделай. wxWidgets -весьма неплохая штука, лично для меня вполне удобная.
Однако, делать что-либо на Милашке, как мне кажется, быстрее и проще.
1. Какие есть библиотеки, и стоит-ли их использовать? Я посмотрел на программирование уровня сокетов и не нашел там чего-то очень сложного, а библиотека типа boost.asio, на первый взгляд показалась мне более запутанной.
2. В чем смысл использования асинхронных сокетов в винде, если я могу запустить синхронный в отдельном потоке?
>Какие есть библиотеки, и стоит-ли их использовать?
Разные, некоторые - да, некоторые - нет. Я только boost::asio использовал
>первый взгляд показалась мне более запутанной.
Ну, есть немного, но мне норм.
> В чем смысл использования асинхронных сокетов в винде, если я могу запустить синхронный в отдельном потоке?
В том что асинхронные не требуют целый поток на одного клиента.
а ок
А в чем преимущество asio, кроме мультиплатформенности? Я посмотрел, интерфейс сокетов в винде и никсах похожий, написать к ним универсальное междумордие можно довольно быстро.
Иногда где-то в примерах натыкаюсь на такие вещи, а именно делают шаблонные структуры, но без каких-либо функций или переменных в них. Ну то есть просто пустая структура.
Ещё замечал, что это делается для метапрограммирования.
Можно какой-то краткий пример для объяснения?
> Андрей Александреску - Современное проектирование на C++ - http://www.proklondike.com/var/file/C/Andrei_Alexandrescu_-_Sovremennoe_Proectirovanier_CPP.rar
Наверни вот это. Там этих примеров, тысячи их.
Пустые структуры часто используют как тег, пустой тип. Такие типы запрещают implicit casting. Гугли tag dispatching.
Пилю тайловую систему к игрушке. Подразумевается, что в ней будет скриптовое описание всех новых тайлов, чтобы можно было без проблем добавить новый, не перекомпиляя. Для этого я сделал абстрактный класс Tile, от которого будут наследоваться все остальные.
Сейчас я пилю генератор ландшафта, и у меня возникла проблема с тем, как он будет понимать, какой именно тайл ему сгенерить. Например, можно в каждом тайле сделать запись с его типом. Но нужно сгенерить не просто тайл, а экземпляр субкласса Tile.
Как вообще реализуют подобные вещи? Тот же Майнкрафт как-то это делает...
Нет. Чтобы посмотреть свой пост перед подправкой и потом не редактировать если с разметкой проебался.
Фабрика же. У фабрики статический метод который принимает параметром тип нужного тайла (название тайла, или номер), создает и возвращает его. При добавлении нового тайла тебе нужно будет скомпилить класс этого тайла и фабрику. Соответвенно пересобрать все с новыми файлами. Поэтому не совсем понятно что именно ты имеешь ввиду под "не перекомпиляя". Если тебе нужно добавление новых типов тайлов вообще без перекомпиляции, только путем изменения каких=то конфигов/скриптов то твоя архитектура не подойдет. Под тайл нужен один класс, наследование не подойдет.
Есть. Система черновиков. Ставишь галку при отправке, пост на доске видишь только ты. Можно редактировать сколько угодно, пока не снимешь галку. После этого редактировать нельзя.
Точно не помню, но скорее всего изначальное. Должно быть время последнего редактирования, да?
>>515523 задание соответственно на С++
Там в ответах гляньте рассуждения и чего нибудь наворотите
Хмм... А зачем тогда вообще прикручивают скриптовые движки, если нет возможности заставить класс-наследника вести себя так, как хочется?
Не используют наследование. Скрипты настраивают существующие классы, а не создают новые.
Это был риторический вопрос, наверное.
Можно ли работать с интернетом из-под консоли?
Что за библиотеки подключать, и что почитать про этому поводу?
А проблема в чем? И вообще странный выбор, впервые слышу о таком.
Хмм... Я вроде видел, как при моддинге Don't Starve создавали нового моба методом создания нового класса.
Там будет уже для приложений вин32, вангую
Ну допустим, я хочу сделать элементарно запрос на вывод времени. Как это сделать вообще? Нужно обращаться к серверу, запрашивать данные. Как это все делается?
А если я хочу точное время с сервера шиндавс? Ну это просто для примера. Вот поясни мне за это
Говна въебал.
Есть же встроенная утилита синхронизации времени с серверами. Не думаю, что на питоне написано
Может. Но тебе перед этим нужно сам С++ выучить за 21 день. Питон быстрее учится.
>Но тебе перед этим нужно сам С++ выучить за 21 день
Тонкий юморок кодеров?
Хочу си. Не знаешь как - так и говори
> Не знаешь как - так и говори
Да. Ты прав. Я не знаю как такое делать. Это же время в консольки из интернета смотреть.
Если тебе не нравится так, то лови идею.
Кончолько быстро чекает время с сервера, сверяет его с системным. Если неправильно - исправляет. Так лучше?
Это всё на QT
Просто я уже говорил, что в шиндавс есть встроенная утилита синхронизации с сервером (несколько на выбор). Суть та же, но это надо заходить, искать, выбирать сервер. Проще же было бы просто запустить консольную приложку, которая просто даст тебе на выбор сервер, и настроит твое время на +4 по Гринвичу.
QNetworkAccessManager manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply)), this, SLOT(fileIsReady(QNetworkReply)) );
manager->get(QNetworkRequest(QUrl("http://example.com/your.xml")));
...
void fileIsReady( QNetworkReply reply)
{
QTemporaryFile temp_file;
temp_file.write(reply->readAll());
}
И дальше этот темп_файл запихнуть в ХмлСимплРидер?
Не понял этого. Это для проверки имени файла?
Алсо, я вроде уже понял как это сделать, но просто не хватает навыка программирование чтоб это всё вписать в программу :(
Хочется сделать возможность писать новые тайлы на каком-то незакрытом языке, но при этом не просто задавать параметры, а переписывать эти типовые функции. Нужно это для того, чтобы основной движок просто генерил эвенты и дергал функции, а что конкретно произойдет -- узнавал из открытых для редактирования файлов.
Собственно, вопрос: насколько это вообще реально и как это можно реализовать?
- графика на SFML
- интерфейс на Qt
Внимание вопрос: это вообще законно?
Прикручивают интерпретаор какого-то скриптового языка, часто это lua, так как есть небольшие библиотеки. Наверное для питона есть, хотя хуй знает. Потом через этот интерпретатор вызывают код на скриптах. У Qt есть свой скриптовый язык, правда не знаю можно на нем сдедать такое.
А можешь для того же Lua, например, найти ссылку, где описывается такое вот создание наследников скриптами и их интеграция? Я только по настройке скриптами смог маны найти.
В Кьюте есть метапрограммирование, которое в это потенциально может, но как же не хочется с ним возиться.
Имхо, проще все-таки писать целиком на Кьюте, потому что не придется мешать два разных стиля программирования. Но я сам с графониумом именно по Кьюту знаком.
Никаких наследников. Нельзя добавить новый класс без перекомпиляции. У тебя один класс тайла. Для каждого вида тайла создаешь свой файл скриптов, там функции/переменные с одинаковыми именами, разными реализациями. В конструкторе тайла передаешь имя нужного файла с скриптами., в зависимости от типа тайла. Когда нужно что-то сделать класс дергает функции из своего файла.
Долбаеб, реализацию шаблонных классов нельзя вынести в отдельный .СРР файл по правилам языка C++. Пиздец, как же смешно было читать твои комментарии.
Попробуй порыться здесь https://eliasdaler.wordpress.com/ Ильюша там делает то что ты хочешь, неуверен конечно там там написано именно то что тебе нужно, при беглом осмотре там только lua скрипты, может в туториалах он там нормально поясняет.
Задавай вопросы. Мы тут кормим людей, а не прожевываем, чтобы сплюнуть им в рот.
Ты не знаешь, что такое auto? Или не понимаешь, что суммирование флота и инта это не то же самое, что суммирование двух флотов?
Потому что в первой строке у тебя double, который при присвоении приводится к float.
То есть твой код на самом деле эквивалентен этому:
float a = (float) (12345);
float b = 12345F;
В такой виде разницы нет. Но вот добавим умножение к числу на границе точности float: http://ideone.com/4hHqqe
>Долбаеб, реализацию шаблонных классов нельзя вынести в отдельный .СРР файл по правилам языка C++. Пиздец, как же смешно было читать твои комментарии.
https://msdn.microsoft.com/en-us/library/by56e477.aspx
Что тебе, блядь, конкретно то надо?
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
.h
class D_EXPORT _4matrix
{
public:
_4matrix
(
_point m00, _point m01, _point m02, _point m03,
_point m10, _point m11, _point m12, _point m13,
_point m20, _point m21, _point m22, _point m23,
_point m30, _point m31, _point m32, _point m33
);
_4matrix(void);
static _4matrix identity(void)
{
return _4matrix();
}
inline static _4matrix zero(void)
{
return _4matrix(
0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f
);
}
union
{
_4point d_4p32[4];
_point d_p32[4][4];
_32un d_u32[4][4];
};
};
.cpp
_4matrix::_4matrix
(
_point m00, _point m01, _point m02, _point m03,
_point m10, _point m11, _point m12, _point m13,
_point m20, _point m21, _point m22, _point m23,
_point m30, _point m31, _point m32, _point m33
)
{
d_p32[0][0] = m00;
d_p32[0][1] = m01;
d_p32[0][2] = m02;
d_p32[0][3] = m03;
d_p32[1][0] = m10;
d_p32[1][1] = m11;
d_p32[1][2] = m12;
d_p32[1][3] = m13;
d_p32[2][0] = m20;
d_p32[2][1] = m21;
d_p32[2][2] = m22;
d_p32[2][3] = m23;
d_p32[3][0] = m30;
d_p32[3][1] = m31;
d_p32[3][2] = m32;
d_p32[3][3] = m33;
}
_4matrix::_4matrix(void)
{
d_p32[0][0] = 1;
d_p32[0][1] = 0;
d_p32[0][2] = 0;
d_p32[0][3] = 0;
d_p32[1][0] = 0;
d_p32[1][1] = 1;
d_p32[1][2] = 0;
d_p32[1][3] = 0;
d_p32[2][0] = 0;
d_p32[2][1] = 0;
d_p32[2][2] = 1;
d_p32[2][3] = 0;
d_p32[3][0] = 0;
d_p32[3][1] = 0;
d_p32[3][2] = 0;
d_p32[3][3] = 1;
}
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
.h
class D_EXPORT _4matrix
{
public:
_4matrix
(
_point m00, _point m01, _point m02, _point m03,
_point m10, _point m11, _point m12, _point m13,
_point m20, _point m21, _point m22, _point m23,
_point m30, _point m31, _point m32, _point m33
);
_4matrix(void);
static _4matrix identity(void)
{
return _4matrix();
}
inline static _4matrix zero(void)
{
return _4matrix(
0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f
);
}
union
{
_4point d_4p32[4];
_point d_p32[4][4];
_32un d_u32[4][4];
};
};
.cpp
_4matrix::_4matrix
(
_point m00, _point m01, _point m02, _point m03,
_point m10, _point m11, _point m12, _point m13,
_point m20, _point m21, _point m22, _point m23,
_point m30, _point m31, _point m32, _point m33
)
{
d_p32[0][0] = m00;
d_p32[0][1] = m01;
d_p32[0][2] = m02;
d_p32[0][3] = m03;
d_p32[1][0] = m10;
d_p32[1][1] = m11;
d_p32[1][2] = m12;
d_p32[1][3] = m13;
d_p32[2][0] = m20;
d_p32[2][1] = m21;
d_p32[2][2] = m22;
d_p32[2][3] = m23;
d_p32[3][0] = m30;
d_p32[3][1] = m31;
d_p32[3][2] = m32;
d_p32[3][3] = m33;
}
_4matrix::_4matrix(void)
{
d_p32[0][0] = 1;
d_p32[0][1] = 0;
d_p32[0][2] = 0;
d_p32[0][3] = 0;
d_p32[1][0] = 0;
d_p32[1][1] = 1;
d_p32[1][2] = 0;
d_p32[1][3] = 0;
d_p32[2][0] = 0;
d_p32[2][1] = 0;
d_p32[2][2] = 1;
d_p32[2][3] = 0;
d_p32[3][0] = 0;
d_p32[3][1] = 0;
d_p32[3][2] = 0;
d_p32[3][3] = 1;
}
Здесь никакой разницы нет, потому что ты явно указываешь, что переменная a относится к типу float. Разница возникает в тех случаях, когда компилятор может об этом не догадаться.
Фигня в том, что float это примерное представление числа с некоторой точностью. И из-за этого могут возникать неприятные косяки. Например, 1234567891.1F - 1234567890.0F = 0, а не 0.1F.
Парни вот поясните за указатели на функцию. Что это? Пока в моем нубо представление, это указатель на возвращаемый функцией объект.
Вот у Праты пример(стр 359, 6 издание)
const double f1(const double ar[], int n);
const double (p1)(const double , int) = f1;
Что это значит? Почему называется указатель на функцию? Почему не называть просто указатель на возвращаемый объект?
блять хз как сделать звездочки
const double(звездочка) f1(const double ar[], int n);
const double(звездочка) ((звездочка)p1)(const double(звездочка) , int) = f1;
Че не понятно то? Это указатель на место в памяти, где хранится функция. Разыменуешь его и можно будет эту функцию вызвать.
Какая из этих строок 465?
Сейчас ему не нравится, что где-то неявно должен вызываться не объявленный в классе copy constructor
Ой дибииил
Есть такая хуйня.
Хочу чтоб вводил текст, он добавлялся к ссылке и делая реквест к этой ссылке, он выводил мне всё что придет в текст браузер.
Оно компилируется, но когда нажимаю кнопку реквеста, то пишет:
"QObject::connect: No such signal QNetworkAccessManager::finished(reply) in ..\ATrey\mainwindow.cpp:104
QObject::connect: (receiver name: 'MainWindow')".
Помогите, пожалуйста.
Ебать ты даун.
>QNetworkAccessManager::finished(reply)
>reply
Замени на имя тип. Вроде bool там.
Да нашёл в
union
{
\t_4point d_4p32[3];
\t_point\td_p32[4][4];
\t_32un\td_u32[4][4];
};
_4point это класс
union data
{
\t_4point d_4p32[3];
\t_point\td_p32[4][4];
\t_32un\td_u32[4][4];
\t~data()
\t{
\t}
};
Но нет, так всё сломалось буду отдельную структуру делать
>Должно быть время последнего редактирования, да?
Естественно. Ведь все остальные увидят в момент последнего редактирования. А что я там в формочке писал, вообще неважно, мог ведь и не отправить.
Нет) так лучше будет.
typedef struct
\t{
\t\tunion
\t\t{
\t\t\t_point d_p32[4];
\t\t\t_32un d_u32[4];
\t\t};
\t} _4point_dat;
\ttypedef struct
\t{
\t\tunion
\t\t{
\t\t\t_4point_dat d_4p32[4];
\t\t\t_point d_p32[4][4];
\t\t\t_32un d_u32[4][4];
\t\t};
\t} _4matrix_dat;
class D_EXPORT _4matrix
\t{
\tpublic:
\t\t_4matrix
\t\t(
\t\t\t_point m00, _point m01, _point m02, _point m03,
\t\t\t_point m10, _point m11, _point m12, _point m13,
\t\t\t_point m20, _point m21, _point m22, _point m23,
\t\t\t_point m30, _point m31, _point m32, _point m33
\t\t);
\t\t_4matrix(void);
\t\tinline ~_4matrix(void)
\t\t{
\t\t}
\t\tstatic inline _4matrix identity(void)
\t\t{
\t\t\treturn _4matrix();
\t\t}
\t\tstatic inline _4matrix zero(void)
\t\t{
\t\t\treturn _4matrix(
\t\t\t\t0.0f, 0.0f, 0.0f, 0.0f,
\t\t\t\t0.0f, 0.0f, 0.0f, 0.0f,
\t\t\t\t0.0f, 0.0f, 0.0f, 0.0f,
\t\t\t\t0.0f, 0.0f, 0.0f, 0.0f
\t\t\t);
\t\t}
\t\t_4matrix_dat data;
\t};
Нет) так лучше будет.
typedef struct
\t{
\t\tunion
\t\t{
\t\t\t_point d_p32[4];
\t\t\t_32un d_u32[4];
\t\t};
\t} _4point_dat;
\ttypedef struct
\t{
\t\tunion
\t\t{
\t\t\t_4point_dat d_4p32[4];
\t\t\t_point d_p32[4][4];
\t\t\t_32un d_u32[4][4];
\t\t};
\t} _4matrix_dat;
class D_EXPORT _4matrix
\t{
\tpublic:
\t\t_4matrix
\t\t(
\t\t\t_point m00, _point m01, _point m02, _point m03,
\t\t\t_point m10, _point m11, _point m12, _point m13,
\t\t\t_point m20, _point m21, _point m22, _point m23,
\t\t\t_point m30, _point m31, _point m32, _point m33
\t\t);
\t\t_4matrix(void);
\t\tinline ~_4matrix(void)
\t\t{
\t\t}
\t\tstatic inline _4matrix identity(void)
\t\t{
\t\t\treturn _4matrix();
\t\t}
\t\tstatic inline _4matrix zero(void)
\t\t{
\t\t\treturn _4matrix(
\t\t\t\t0.0f, 0.0f, 0.0f, 0.0f,
\t\t\t\t0.0f, 0.0f, 0.0f, 0.0f,
\t\t\t\t0.0f, 0.0f, 0.0f, 0.0f,
\t\t\t\t0.0f, 0.0f, 0.0f, 0.0f
\t\t\t);
\t\t}
\t\t_4matrix_dat data;
\t};
Да, ты прав, седня с утреца уже сделал.
http://doc.qt.io/qt-5/qnetworkaccessmanager.html#finished
Я просто не могу понять, оно ведь хочет чтоб передавали обьект QNetworkReply.
connect(manager, SIGNAL(finished(QNetworkReply)),this, SLOT(replyFinished(QNetworkReply)))
И эта строка говорит, что если манагер сделал свою работу, он занес ее в REPLY и дальше, в REPLYFINISHED, мы уже работаем с этим реплаем.
Кароче хуйня какая то получается у меня.
TheprogramminglanguageCLecturesandexercises6thEditionPrata
Я вот это читал. Там и резюме в конце каждой главы и вопросы контрольные + задачки для решения.
Тогда спасибо.
Return:
A value different from zero (i.e., true) if indeed c is a lowercase alphabetic letter. Zero (i.e., false) otherwise.
А почему - надо читать сорцы.
Я имею в виду в коммерческой разработке. Многие вынуждены поддерживать старые компиляторы.
А вообще уже c++14.
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, собственно вопрос: можно-ли это сделать более эффективно?
rand() это детерминированый алгоритм который получает на вход число (seed - скрыто в дебрях стандартной библиотеки) и возвращает другое число, напервый взгляд никак не связаное. В качестве seed исползуется чило возвращенное rand() последний раз. А так как при запуске программы вызывов rand() еще небыло, там записано какое-то число по умолчанию, всегда одинаковое. Используя srand() можно вписать другой seed и получить другую последовательность псевдослучайных чисел.
А есть ли какое-нибудь более переносимое решение?
Нет. Ты вызываешь srand однажды и инициализируешь, например, временем. Тут есть простой пример: http://en.cppreference.com/w/cpp/numeric/random/rand
http://www.cplusplus.com/reference/cstdlib/rand/
Используешь srand с временем и будет тебе каждый раз новое число.
> Sams Teach Yourself C++ in 10 Minutes (2nd Edition)
http://www.amazon.com/dp/0672324253
Customers Who Viewed This Item Also Viewed:
>Passion Natural Water-Based Lubricant - 55 Gallon
http://www.amazon.com/dp/B005MR3IVO
Да и о боже добавьте последнего Прату в шапку.
Типа, такая запись:
// Doing your mom.
{
onBoardHerAss();
}
в кьютокриэйторе скрывается в :
// Doing your mom. { ... }
Нет. Набор стандартных способов заимоействия с консолью очень ограничен, так как считается что консоль это устройство типа телетайп с очень ограниченым функционалом. Если в твоей системе в качестве консоли используется устройство с более широким функционалом - тебе нужно уже дергать драйвера этого устройства. А конкретно в операционной системе виндоуз консоль вообще гавно. Если тебе нужно переносимое решение, одним из вариантов может быть использование библиотек, например ncurses.
Спасибо, понял. То есть если писать конкретно под шиндовс, то гораздо разумнее юзать их библиотеку?
Он не позволяет на строку вверх подняться.
Мне пока ещё очень тяжело работать со строками на крестах, так что я не очень понимаю алгоритм. Как я думаю, сначала нужно попросить пользователя ввести слово, потом ему нужно посчитать количество букв в слове и создать многомерный массив или что-то типа того. В общем введя слово "faggot" нужно, чтобы программа перебирала словарь в поиске слов где есть одна a, одна f, две g, одна o и одна t. Как это делать - душой не ебу. Неужели нужно создать цикл под каждую букву алфавита? Дальше поиск по словарю и вывод слов совпадающих с введённым, но не являющиеся собственно введённым. То есть если в словаре есть слово stop, и пользователь введёт stop оно не выводило stop как решение анаграммы. В общем почти ничего не понимаю, подскажите. Можно ли сделать проще? А то как-то много циклов выйдет.
Каждый раз делать перебор - будет слишком большая алгоритмическая сложность. Тебе нужен индекс.
Заводишь индекс multi_map<string, string>. Далее для каждого слова в словаре английских слов:
1. Сортируешь символы по алфавиту. stop => opst. Например, конвертируешь string в vector<char> и вызываешь std::sort.
2. Запихиваешь в multi_map по ключу opst это слово.
Тебе нужно сгенерировать все перестановки твоих букв. Проще всего рекурсивно берешь первую букву, генеришь все перестановки оставшихся букв, к этим перестановкам добавляешь взятую перую букву в начало. Потом тоже самое для второй и т.д. Слово stop просто пропускаешь, там в зависимости от алгоритма оно может напрмиер генерироватся всегда первым.
Ну так если человек введет 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
Если можешь в qt - то норм. Да и гейдев хоть и дохлый, но все же. А вот насчёт этого не знаю. Думаю, так на любом яп много не заработаешь.
main.cpp
http://ideone.com/LZcHnR
Dungeon.h
http://ideone.com/jjOZLH
Dungeon.cpp
http://ideone.com/ZWVYj
Constants.h
http://ideone.com/yBoTh6
http://www.qt.io/download
Да, сегодня тоже зашел и такая хуйня. Подожди малёха, думаю оживет.
Для такого рода поиска словарь делают с помощью графа.
На самом деле нет. Для новичков вообще не годится. Такое чувство, будто страус думает, что C++ все с рождения знают
Кодблокс.
#include <cstring>
using namespace std;
int main(int argc, char* argv[])
{
\tchar str[80];\t
\tchar buf[80];
\tcout<<"Enter string : \n"<<endl;
\tcin.getline(str,80);
\tint i=strlen(str)-1, j=0;
\twhile (str>=0) {
\t\tbuf= str[j];
\t\ti--;
\t\tj++;}
\tcout << buf;
return 0;
-------------------------------------
переворачивается, но иногда в конце вот эта собачка, почему она там?
спасибоу, а я думал он сам как-то добавляется
JIT у нас лучше, чем обычная компиляция?
Строгая типизация это что-то плохое?
C ещё не на свалке истории?
Или это типа само троллинг? Тогда где php?
>само троллинг
This. Ну и еще своеобразный топ доебов, которыми школьники с жабами и пистонами пытаются доказать, что их язык лучше.
Ты че, охуел? Динамическая типизация - это так здорово! Часами отлаживать код, устранять ошибки, которые могли бы быть замечены на этапе компиляции - что может быть прекраснее? Тупым крестоблядям не понять, ведь они не тратят впустую время на устранение граблей, которые им услужливо подставляет собственный язык. Да, жабаскрипт, я на тебя намекаю.
https://2ch.hk/pr/res/517858.html
Ну это я загнул немного. На самом деле C++ без QT довольно мало применим. А зачем нужен чистый си в наше время? Микроконтроллеры небось микроконтроллишь?
>C++ без QT довольно мало применим
Вот уж где загнул так загнул. Даже если забыть про килотонны тырпрайзного легаси времен, когда куте еще не было. И да, я не люблю QT, но таки на самом деле гораздо чаще вижу проекты без него.
>На самом деле C++ без QT довольно мало применим
на основании своего богатого опыта написания laba6 вещаешь?
Стек протоколов SS7, некоторые из них жуткое легаси, вроде TCAP, но вот мобильные протоколы нормально так обновляются.
Курсовая - система учета в аптеке. База данных, связи между объектами, окошки и прочая лабуда, ничего интересного. Нужно написать на С++. Но есть один нюанс. Универ не совсем... айтишный и запускать надо будет все это дело на университетской Visual Studio (надеюсь, старше 2013). Никаких бустов, Qt и прочего. Максимум .net.
Но есть одна проблема. Я красноглазый пердолик и вообще предпочитаю скрипты.
Есть два стула:
1) Максимально изъебнуться и любой ценой сделать кроссплатформенное приложение. Статически скомпановать его с qt, рисовать на opengl, что угодно, но заставить приложение работать в прыщах.
2) Расслабить пукан и позволить дотнету войти в меня. Написать непортируемое приложение конкретно под Windows, максимально задействовать виндовые компоненты и библиотеки. И попытаться запустить на Mono, конечно.
Наверное оба варианта для меня одинаково интересны. Что посоветуете?
Не буду письку сосать
Учитывая, что системы учета в аптеке на С++ никто в здравом уме не пишет (красноглазые пользуют Java), то пиши на дуднете - отличий с C# будет минимум, а так ты хоть будешь знать, как это делается.
Антош, не приставай к взрослым.
Да много что он делает.
Менеджмент линий, абонентов, геолокации, всякие сервисы типа запроса баланса (точнее он предоставляет интерфейс для реализации подобных сервисов), доставка смс, пакетных данных и прочие радости твоей жизни.
Это нельзя сделать на высоком языке из-за производительности, или чтобы не рефакторить?
Слушай, как в юзерскрипте отключить показ кода с pastebin и ideone?
Основа была запилена в далеком 1980 году, с тех пор никому не хотелось переделывать огромные портянки кода. Производительность там тоже в приоритете, каждый % деградации сопровождается сильным недовольством заказчика.
Поспешил - людей насмешил.
https://2ch.hk/pr/res/518004.html
https://2ch.hk/pr/res/518004.html
https://2ch.hk/pr/res/518004.html
Наврал наверное про 1980. Сейчас вот нашел только код датированный 1993 г., но сути это сильно не меняет, легаси оно и есть легаси.
tdd + catch
скажи, на основе чего ты это писал? http-сервер сам писал или что-то готовое? какие либы или фреймворки юзал?
Найди его пост на хабре
Вы видите копию треда, сохраненную 22 августа 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.