Это копия, сохраненная 15 ноября 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Ответы на все вопросы - http://en.cppreference.com/w/ http://www.cplusplus.com/reference/
Прошлый - https://2ch.hk/pr/res/1063107.html (М)
Никогда не понимал, нахуй позировать лезть, если у тебя нога в шрамах и с синяками.
пишу сразу байткодом.
0010101011101010001010101110101000101010111010100010101011101010001010101110101000101010111010100010101011101010001010101110101000101010111010100010101011101010001010101110101000101010111010100010101011101010001010101110101000101010111010100010101011101010 пидоры.
01010010 01100101 01100010 01101010 01100001 01110100 01100001 00101100 00100000 01101110 01100101 00100000 01110011 01110100 01101111 01101001 01110100 00100000 01110110 01110011 01101011 01110010 01111001 01110110 01100001 01110100 00100111 00100000 01101010 01100101 01110100 01110101 00100000 01110100 01100101 01101101 01110101 00101110 00100000 01010110 01111001 00100000 01101101 01101111 01101100 01101111 01100100 01111001 01100101 00101100 00100000 01110011 01101000 01110101 01110100 01101100 01101001 01110110 01111001 01100101 00101100 00100000 01110110 01100001 01101101 00100000 01110110 01110011 01100101 00100000 01101100 01100101 01100111 01101011 01101111 00101110 00100000 01001010 01100101 01110100 01101111 00100000 01101110 01100101 00100000 01110100 01101111 00101110 00100000 01001010 01100101 01110100 01101111 00100000 01101110 01100101 00100000 01000011 01101000 01101001 01101011 01100001 01110100 01101001 01101100 01101111 00100000 01101001 00100000 01100100 01100001 01111010 01101000 01100101 00100000 01101110 01100101 00100000 01100001 01110010 01101000 01101001 01110110 01111001 00100000 01110011 01110000 01100101 01100011 01110011 01101100 01110101 01111010 01101000 01100010 00101110 00100000 01010011 01101010 01110101 01100100 01100001 00100000 01101100 01110101 01100011 01101000 01110011 01101000 01100101 00100000 01101110 01100101 00100000 01101100 01100101 01111010 01110100 00100111 00101110 00100000 01010011 01100101 01110010 00100111 01100101 01111010 01101110 01101111 00101100 00100000 01101100 01101010 01110101 01100010 01101111 01101010 00100000 01101001 01111010 00100000 01110110 01100001 01110011 00100000 01100010 01110101 01100100 01100101 01110100 00100000 01111010 01101000 01100001 01101100 01100101 01110100 00100111 00101110 00100000 01001100 01110101 01100011 01101000 01110011 01101000 01100101 00100000 01111010 01100001 01101011 01110010 01101111 01101010 01110100 01100101 00100000 01110100 01100101 01101101 01110101 00100000 01101001 00100000 01111010 01100001 01100010 01110101 01100100 00100111 01110100 01100101 00101100 00100000 01100011 01101000 01110100 01101111 00100000 01110100 01110101 01110100 00100000 01110000 01101001 01110011 01100001 01101100 01101111 01110011 00100111 00101110 00100000 01001010 01100001 00100000 01110110 01110000 01101111 01101100 01101110 01100101 00100000 01110000 01101111 01101110 01101001 01101101 01100001 01101010 01110101 00101100 00100000 01100011 01101000 01110100 01101111 00100000 01100100 01100001 01101110 01101110 01111001 01101101 00100000 01110011 01101111 01101111 01100010 01110011 01101000 01101000 01100101 01101110 01101001 01100101 01101101 00100000 01110110 01111001 01111010 01101111 01110110 01110101 00100000 01100100 01101111 01110000 01101111 01101100 01101110 01101001 01110100 01100101 01101100 00100111 01101110 01111001 01101010 00100000 01101001 01101110 01110100 01100101 01110010 01100101 01110011 00101100 00100000 01101110 01101111 00100000 01101000 01101111 01100011 01101000 01110101 00100000 01110011 01110010 01100001 01111010 01110101 00100000 01110000 01110010 01100101 01100100 01101111 01110011 01110100 01100101 01110010 01100101 01100011 01101000 00100111 00100000 01110000 01111001 01110100 01101100 01101001 01110110 01111001 01101000 00100000 00101101 00100000 01110011 01110100 01101111 01110000 00101110 00100000 01001111 01110011 01110100 01100001 01101100 00100111 01101110 01111001 01100101 00100000 01110000 01110010 01101111 01110011 01110100 01101111 00100000 01101110 01100101 00100000 01101110 01100001 01101010 01100100 01110101 01110100 00101110 00100000
01010010 01100101 01100010 01101010 01100001 01110100 01100001 00101100 00100000 01101110 01100101 00100000 01110011 01110100 01101111 01101001 01110100 00100000 01110110 01110011 01101011 01110010 01111001 01110110 01100001 01110100 00100111 00100000 01101010 01100101 01110100 01110101 00100000 01110100 01100101 01101101 01110101 00101110 00100000 01010110 01111001 00100000 01101101 01101111 01101100 01101111 01100100 01111001 01100101 00101100 00100000 01110011 01101000 01110101 01110100 01101100 01101001 01110110 01111001 01100101 00101100 00100000 01110110 01100001 01101101 00100000 01110110 01110011 01100101 00100000 01101100 01100101 01100111 01101011 01101111 00101110 00100000 01001010 01100101 01110100 01101111 00100000 01101110 01100101 00100000 01110100 01101111 00101110 00100000 01001010 01100101 01110100 01101111 00100000 01101110 01100101 00100000 01000011 01101000 01101001 01101011 01100001 01110100 01101001 01101100 01101111 00100000 01101001 00100000 01100100 01100001 01111010 01101000 01100101 00100000 01101110 01100101 00100000 01100001 01110010 01101000 01101001 01110110 01111001 00100000 01110011 01110000 01100101 01100011 01110011 01101100 01110101 01111010 01101000 01100010 00101110 00100000 01010011 01101010 01110101 01100100 01100001 00100000 01101100 01110101 01100011 01101000 01110011 01101000 01100101 00100000 01101110 01100101 00100000 01101100 01100101 01111010 01110100 00100111 00101110 00100000 01010011 01100101 01110010 00100111 01100101 01111010 01101110 01101111 00101100 00100000 01101100 01101010 01110101 01100010 01101111 01101010 00100000 01101001 01111010 00100000 01110110 01100001 01110011 00100000 01100010 01110101 01100100 01100101 01110100 00100000 01111010 01101000 01100001 01101100 01100101 01110100 00100111 00101110 00100000 01001100 01110101 01100011 01101000 01110011 01101000 01100101 00100000 01111010 01100001 01101011 01110010 01101111 01101010 01110100 01100101 00100000 01110100 01100101 01101101 01110101 00100000 01101001 00100000 01111010 01100001 01100010 01110101 01100100 00100111 01110100 01100101 00101100 00100000 01100011 01101000 01110100 01101111 00100000 01110100 01110101 01110100 00100000 01110000 01101001 01110011 01100001 01101100 01101111 01110011 00100111 00101110 00100000 01001010 01100001 00100000 01110110 01110000 01101111 01101100 01101110 01100101 00100000 01110000 01101111 01101110 01101001 01101101 01100001 01101010 01110101 00101100 00100000 01100011 01101000 01110100 01101111 00100000 01100100 01100001 01101110 01101110 01111001 01101101 00100000 01110011 01101111 01101111 01100010 01110011 01101000 01101000 01100101 01101110 01101001 01100101 01101101 00100000 01110110 01111001 01111010 01101111 01110110 01110101 00100000 01100100 01101111 01110000 01101111 01101100 01101110 01101001 01110100 01100101 01101100 00100111 01101110 01111001 01101010 00100000 01101001 01101110 01110100 01100101 01110010 01100101 01110011 00101100 00100000 01101110 01101111 00100000 01101000 01101111 01100011 01101000 01110101 00100000 01110011 01110010 01100001 01111010 01110101 00100000 01110000 01110010 01100101 01100100 01101111 01110011 01110100 01100101 01110010 01100101 01100011 01101000 00100111 00100000 01110000 01111001 01110100 01101100 01101001 01110110 01111001 01101000 00100000 00101101 00100000 01110011 01110100 01101111 01110000 00101110 00100000 01001111 01110011 01110100 01100001 01101100 00100111 01101110 01111001 01100101 00100000 01110000 01110010 01101111 01110011 01110100 01101111 00100000 01101110 01100101 00100000 01101110 01100001 01101010 01100100 01110101 01110100 00101110 00100000
Блядь, создай. Но вообще только плюс. Вон в JS ввели, так эти дауны вообще всё через массив ебашут. Даже фронт, даже бэй, даже БД, Даже сокеты, даже небо блядь!
Как что-то плохое, блядь. Зачем ездить на велосипеде, если есть автомобиль?
Зачем ездить на велосипеде, если есть массив ты хотел сказать?
Алсо в крестах как я понял вектор то и есть тот же самый массив судя по всему.
Вообще-то ни один язык не умеет "работать с массивами", а то, что называют массивами в других языках -- vector в c++ (изменяй как хочешь), ну или связный список.
>Как что-то плохое, блядь. Зачем ездить на велосипеде, если есть автомобиль?
Ага, а потом возникают такие ФРАКТАЛЫ
http://php.net/manual/en/array.sorting.php
В плюсах нормально зделано, есть набор разных структур данных с понятными предназначениями и алгоритмами.
когда на глазу фофан и муж-алкаш заставляет позировать, деваться больше некуда
теперь это алкашей тред
std::vector
Не понял что ты имеешь ввиду?
Статические массивы? int a[32];
Динамические массивы? std::vector, std::list
Ты о чем вообще?
>Так что следующие возможные варианты : +7 или +2.
Можно только со второй строки брать? А потом только с третьей?
Нет, двигаться можно по вертикали, горизонтали и диагонали ЧИСЛО-ЗНАК-ЧИСЛО. Пример на пикреле.
Один из способов прийти к нулю
Можно. Но те знаки и числа, которые использовал, использовать повторно нельзя.
Числа только однозначные?
Самопересекаться?
Строишь дерево и обходишь его в глубину.
Ну не, там всё-таки в всоё время была фича в работе с бд и всё это было полезно.
A a = new B; // Неявное преобразование
A a = dynamic_cast<A*>(new B); // Явное преобразование
На тебе решения, начинающиейся с "1+" http://termbin.com/4szs
Проверяй на соответствие правилам, которые ты всё никак не можешь нормально описать
> В C++ нет никаких инструментов для работы с массивами? Какого, блядь, хуя?
array
vector
list
deque
ассоциативный map
range for
куча всяких прикладных функций типа apply, sort
Что ещё хочешь?
>>1075307
Правильность первой строки проверит компилятор - если A - предок Б, то программа скомпилируется.
Во второй строке правильность проверит собранная программа во время исполнения (динамик каст вернёт нуллптр, если А - не предок Б).
Когда тебе известны оба типа - тип указателя и тип объекта, на который ты хочешь его направить - логично использовать только первый вариант, тогда ошибка будет выявлена компилятором.
Только если ты присваиваешь одному указателю другой указатель на объект с неизвестным типом, ты должен использовать dynamic_cast.
void f() const
{
std::cout << m_x << '\n';
}
И что тут странного? По мне так то что ты привёл в пример это самое читабельное и понятное что может быть в C++, ты нечитабельное и вырвиглазное не видел.
Из code style тут только первая фигурная скобка перенесена да префикс m_ указывающий на поле класса. В остальном это язык, а не стиль. Однобуквенные имена для примеров это нормально.
Как тебе такое?
#include <iostream>
template<typename Tag, typename Tag::type M>
struct Rob {
friend typename Tag::type get(Tag) {
return M;
}
};
struct A {
A(int a):a(a) { }
private:
int a;
};
struct A_f {
typedef int A::type;
friend type get(A_f);
};
template struct Rob<A_f, &A::a>;
int main() {
A a(42);
std::cout << "proof: " << a.get(A_f()) << std::endl;
}
Как тебе такое?
#include <iostream>
template<typename Tag, typename Tag::type M>
struct Rob {
friend typename Tag::type get(Tag) {
return M;
}
};
struct A {
A(int a):a(a) { }
private:
int a;
};
struct A_f {
typedef int A::type;
friend type get(A_f);
};
template struct Rob<A_f, &A::a>;
int main() {
A a(42);
std::cout << "proof: " << a.get(A_f()) << std::endl;
}
Нихуя не понял, что тут происходит?
Вкатываюсь в многопоточность. За 5 минут на коленке собрал говнокод для суммирования последовательных чисел, чтобы просто проверить реально ли загружается несколько ядер. Запускается, работает, реально грузится 4 потока, но результат почему-то каждый раз разный как будто join() не работает или я х.з. что еще. Так что не так с этим говном?
Потому что сам синтаксис языка такой. На С++ очень сложно, писать что-то читабельное и понятное, особенно новичкам и мидлам и зачастую тимлидам. Те кто могут использовать понятный code style в С++ это элита, но для этого надо очень хорошо знать язык и что испрользовать в языке а что нет. Например использовать очень ограниченно шаблоны, не использовать такие библиотеки типа boost, а лучше и без stl.
Вот, например, нормальные люди, кто пишет на С++ что-то посерьезней серверов у конторе у дяди коли, используют такие штуки как misra c++, embedded c++, rt c++ и т.д.
https://en.wikipedia.org/wiki/Embedded_C++
Все так, только код с умеренным бустом, стл и шаблонами будет читаемее, чем очередная итерация вложенных циклов на "си с классами".
Ну про буст я очень сомневаюсь, ибо на деле знаю что это такое. Стл можно впринципе использовать более менее, но опять же не все подряд и с умом, но это чревато, например чтобы использовать итераторы, которые сами по себе не очень хорошая вещь by design, чтобы не писать телеги типа
typename std::vector<my_super_class::my_type_t::value::type>::iterator it = my_super_class_object.vector.begin();
то вероятно всего лучше использовать auto, но использование auto скрывает тип и делает код непонятным аля
auto v = myobject.get();
поэтому авто тоже не стоит использовать, но понятно что использовать шаблонные телеги типа как в премере выше тоже не вариант, поэтому люди часто вообще отказываются от них, ибо как только ты начинаешь что-то использовать из С++, то сразу тянется куча зависимых костылей языка, для того, чтобы это работало и выглядело нормально.
Алсо, что будет если ввести k = 3?
A = B = C = D = 0
k = 7?
A = 1, B = 2, C = 3, D = 4
Не очень похоже на "сумму от 0 до k", верно?
При чем здесь вообще IDE?
Я говорю про синтаксис языка, который должен быть чистым и понятным, даже если он отображается в терминале 20х60 без подсветки синтаксиса.
А зачем мне вводить k = 3, если я могу ввести k = 12? Вопрос был про то почему многопоточность не срабатывает, а не про защиту от дурака.
Не надо давать уебанские названия переменным и функциям. Программисту в 95% случаях надо понимать смысл происходящего, поэтому там будет не myobject.get(), а auto c = car.get(); c.turnLeft();. Все что надо знать, что у car есть get, а у полученного типа есть turnLeft. В остальных 5% случаев в IDE наведет мышку и посмотрит, какой конкретно тип.
И конечно не надо писать код в терминале.
Ты школьник? Извини, что уточняю.
У тебя незакрытый кейс в свитче. И потоки разные, а переменные общие, это и есть гонка потоков.
Допустим, второй поток отработал раньше. Он прыгает на case 2 и записывает B1. После чего отрабатывает первый поток. Он прыгает на case 1 и записывает A1 после чего идет дальше по кейсам и перезаписывает B1 этим же числом.
>>1075396
Так ты не делишь последовательность на 4 равных доли, если ты введешь 999 до отработает только до 996.
Ну это вообще пиздец какая-то экзотика этот volatile. Там и так нечего в этих переменных оптимизировать. Ни в каких проверках они не участвуют. В каждую пишет только свой поток. На всякий случай проверил с volatile - не изменилось ничего.
Ты похоже еще более бесполезен, чем я.
1) Первый поток может записать только в переменную А1, потому что при вызове в функцию schet() бай дизайн передается num = 1. Второй поток может писать только в В1 и так далее. Нет там никаких гонок. Это разные кейсы, срабатывающие в разных котоках, в каждом свой.
2) А я не ввожу 999, я ввожу 996. Проблемы?
>Второй поток может писать только в В1 и так далее.
>Нет break; в конце case
Дебилам не помогаю.
>Не надо давать уебанские названия переменным и функциям
Это уже называется code style, который строится и зависит от базовых вещей в языке.
Тем более, что меняется от того что ты изменил название переменной в auto c = car.get() ?
Что за тип c? Это поинтер? Это ссылка? Или это копирование? Если копирование то как? Использует ли он COW или копирует весь объект побитово? Перегружен ли там оператор =?
Такой код сразу вызывает пачку вопросов и непонятков.
Если еще васяны пихают авто куда не попадя, дают методам и переменным невнятные имена, то такой код становится не поддающимся расшифровке, который можно смело выкидывать в помойку, ибо сам васян скорее всего забудет что там происходит через пару недель.
>Что за тип c? Это поинтер? Это ссылка?
Какая разница? В IDE автокомплит подставит . или ->
>Или это копирование?
Не надо по уебански называть копирование гет-ом.
>Перегружен ли там оператор =?
Какая разница, если ты потом все равно какой то метод вызываешь.
>Какая разница
>IDE подставит
>Какая разница
Мда, вот оно уже сейчас, поколение быдло-кодеров.
Бля, сук, точно. Никогда не любил этот ебаный кейс. А ты не так уж плох, как кажешься на первый взгляд. Ладно, спасибо, бустите дальше.
Чушь не неси, а лучше посмотри какие нибудь слайды с CppCon14-17, никто не пишет std::map<std::wstring, std::map<std::wstring, int>>::iterator когда тебе нахер не сдалось знать, что конкретно там за тип, а тебе просто надо пройтись по нему фор-ичем, то достаточно просто auto и код становится читаемей и понятней, а не наоборот.
Да че мне эти слайды смотреть, я все равно на с++ уже больше года не пишу и не хочу писать, ибо с++11 был последний гвоздь в крышку гроба.
Так как я по такой залупе вор ичем пройдусь если я даже не знаю что там внутри потмоу что там какая нибудь залупа типа
template<typename T>
void foo(T& val)
{
auto it = val.begin();
...
}
И как мне быть понять, что там за хуйня вообще происходит? И такого говна в с++ проектах обычно навалом.
Проще взять какой-нибудь нормальный язык у которого все эти вещи из коробки и встроены в дизайн, а не как костылями все в с++.
И что твой пример изображает? Работаешь с полученным итератором как с любым другим.
бывший революционный оп
Я вот тоже год назад стоял на развилке путей, думал тоже пойти в хайлод, чем я в принципе на с++ занимался, только на яве или scala, ибо доебало это говно в с++ с костылями. Но в итоге решил вкатиться в С и более системное программирование поближе к ядру ОС. Но теперь я бы ни за что не стал бы явистом ибо понимаю какое это дно похуже с++, с кучей макак вкатывальщиков из /b/. А на С в основном пишут крутые парни и обезьян и смузихлебов там вообще нету, ибо не модно и сложно. В общем, мне все нравится.
>но использование auto скрывает тип и делает код непонятным аля
>auto v = myobject.get();
.get гетает что именно? У большинства STL-функций имена с подсказками, а твой геттер что гетает?
Минус авто только в том, что я не могу его авточлен сделать. Гусары, молчать!
>Минус авто только в том, что я не могу его авточлен сделать.
В прошлом треде ради лулзов соорудил нечто подобное:
template<class T> class Zalupa {
T value;
public:
T get() { return value; }
};
Zalupa<int> lupa;
class A {
decltype(lupa.get()) a = 1;
};
PIMAGE_BASE_RELOCATION pIBR;
list=(PWORD)(pIBR+1);
Поясните нуфагу, что это за плюс один? Что будет в list?
Объясните, в почему имена структур и типов не мешают друг другу. В каких неймспейсах они находятся? https://ideone.com/5CJXAs
В моем коде при помощи структуры с тэгом complex объявляется тип complex.
Что такое complex в объявлении конструктора?
complex(double re, double im)
: re(re), im(im) {}
Тип или структура?
Что такое complex в объявлении методов?
void complex::swap(complex & other
pIBR+1 - это указатель на следующую в памяти структуру IMAGE_BASE_RELOCATION.
(PWORD) - это преобразование полученного указателя к указателю на WORD (который джва байта, вроде).
То есть, ты получишь указатель на первые два байта следующей структуры IMAGE_BASE_RELOCATION. Какому наркоману это понадобилось - не знаю.
Про касты можешь прочитать здесь: http://en.cppreference.com/w/cpp/language/explicit_cast
То есть, на псевдокоде это будет
list=(PWORD) pIBR+sizeof(IMAGE_BASE_RELOCATION);
так?
Если да, то мне все понятно, спасибо.
Двоеточие - это предлог "в" (только порядок другой). Какждый класс - это простанство имён, к членам которого ты можешь обратиться только через операторы ".", "->" и "::".
class T {
T(){}
}
- это конструктор.
class T {
T();
}
T::T (){}
- это объявление конструктора и объявление его снаружи.
T T::operator=(T rhs){}
- это оператор присвоения, определённый в классе T, принимающий T и возвращающий T.
>>1075548
Грубо говоря - да.
Заговорился.
>- это объявление конструктора и ОПРЕДЕЛЕНИЕ его снаружи.
>- это ОПРЕДЕЛЕНИЕ оператора присвоения, ОБЪЯВЛЕННОГО в классе T, принимающего T и возвращающего T.
>Какому наркоману это понадобилось - не знаю.
После этой структуры идет массив вордов неопределенной длины. Если вдруг тебе интересно.
>То есть, на псевдокоде это будет
>list=(PWORD) pIBR+sizeof(IMAGE_BASE_RELOCATION);
>так?
Что такое "на псевдокоде"? Арифметика указателей такая же, как в C++? Тогда не так.
Если честно я не ебу какая там арифметика. Я хотел сказать что к адресу pIBR прибавляется размер этой структуры, и мы получаем указатель та следующую структуру, как если бы они шли подряд.
>Я хотел сказать что к адресу pIBR прибавляется размер этой структуры
Тогда пиши
(char*) pIBR+sizeof(IMAGE_BASE_RELOCATION);
Это про плюсы тред, а не про Си.
>embedded c++
Зашёл по твоей ссылке, вначале воодушевился, а потом дичь пошла.
> The following language features have been removed:
> <...>
> Exceptions
Серьёзно? Выкинуть исключения? Это просто гениальное "упрощение"
> Templates
Теперь надо под каждый пердёж создавать свой отдельный контейнер? И без смартпоинтеров?
По ссылкам всё мертво, по ссылкам 404, сами ссылки десятилетней давности...
Че-то какой-то говнокод пиздец.
Во-первых, убери всю эту хуйню с глобальными переменными.
Короче вот пример от профи.
https://pastebin.com/mZfwhfj9
>пример от профи.
if(threads == -1)
threads = std::thread::hardware_concurrency();
Очень надёжно! Профи видно сразу!
>vector
>chrono
>mutex
Ну у меня же не было задачи использовать как можно больше библиотек и контейнеров. Я просто хотел посмотреть реально ли работает этот thread и на сколько быстрее с ним идет вычисление, а то во всех обучалках одно говно какое-то с выводом сообщений в двух потоках, когда реально хуй поймешь параллельно они по факту выполняются или нет.
Ты шо ебонутый? Давай в програмке на коленке рандом хую с двача, все возможные кейсы очень маловероятных ошибок прорабатывать.
Зачем вообще в parallel_sum что-то проверять? Скажи, что число потоков должно быть от 1. И пусть вызывающий передаёт правильное число, используя /dev/random или hardware_concurrency() и обрабатывая случай нуля как хочет.
Исключения выкинуты, т.к. лишний код, занимает и байты, и время исполнения, причем сами исключения возникают в 0,001%, а код этот работает постоянно. На встройке это критично. С шаблонами похожая проблема, ты напишешь один раз а компилятор его 100 раз размножит для разных типов, и программа опять не влезет никуда.
А зря. Хроно это маст хэв, вектор тем более.
Так там число потоков опциональный аргумент, и если он опущен, то в функцию передается -1 и вызывается hardware_concurrency() Я думаю не существует имплементаций где он может вернуть 0. Конечно если у него линукс, можно было вызвать get_nprocs(), но у него то винда.
>>1075624
Использовал только самое необходимое.
vector - чтоб динамически алокейтить место под массив.
chrono - перформанс таймер.
mutex - чтоб отпечатать нормально в потоках.
Вообще, конечно создавать потоки на лету, плохая идея в реальной жизни так никто не делает, ибо это оверхед большой. Обычно, потоки создаются один раз и потом используются.
>Так там число потоков опциональный аргумент, и если он опущен, то в функцию передается -1
Чёт не вижу, что там есть значение по-умолчанию.
>Короче вот пример от профи.
Ой-вей. Ты сначала зачем-то заполняешь числами массив, а потом суммируешь его.
Просто 13/10.
Рассказываю "профи", что такое "опциональный аргумент":
static void parallel_sum(int a[], int size, int res, int threads = std::thread::hardware_concurrency());
static void parallel_sum(int a[], int size, int res, int threads)
{
if (threads == 0) threads = 1;
.....
}
Теперь threads — это опциональный аргумент. И если его не передавать, то там будет std::thread::hardware_concurrency()
Лол. Ты вообще читал, пост а который я ответил? Я лишь переделал программу автора, где он разбирается в потоках.
Читал. Там вроде просто числа суммиоровались, которые генерируются при суммировании.
А зачем их сначала писать в массив, а потом читать оттуда?
Бля, а как ты будешь вызывать функцию эту, если аргумент приходит из командной строки?
https://pastebin.com/BEcj176w строка 12
А твоё однопоточное заполнение массива занимает в несколько раз больше времени, чем, собственно, суммирование.
Ну ты пиздец. Смысл программы в функции parallel_sum а не в том что происходит до.
Смысл программы в многопоточном суммировании последовательных чисел.
А не в том, как сделать это как можно тормознее.
>Смысл программы в многопоточном суммировании последовательных чисел.
Так она именно это и делает.
Она делает как быстрее. А ты — как можно медленнее.
Ты бы ещё в файл сначала записал числа, а потом считывал оттуда.
Ты ебанутый? Какая разница откуда числа приходят, когда смысл суммировании массива с числами?
Тогда надо сразу на шаблонах, чтобы посчиталось в компайл тайме и выдало константу.
Для монотонной последовательности не нужны вообще циклы и потоки, это считается одной формулой.
Тому, кто топит, что его вариант быстрее других.
>Для монотонной последовательности не нужны вообще циклы и потоки, это считается одной формулой.
Ага. Формулу прикрепляю картинкой.
Или ты имеешь в виду формулу без знаков "сумма" и т.д. (только с элементарными функциями?)? Готов для любой монотонной последовательности предъявить формулу суммы начального отрезка этой последовательности?
Ты уж согласись тогда, что это не с читаемостью кода связано, а с ограничениями железа.
>и на сколько быстрее с ним идет вычисление
Ты вообще ослоёб? Если тебе быстро сложить надо, делай примерно так:
std::vector x;
// Fill x
auto result = cblas_dsum(x.size(), x.data(), 1);
cblas_dsum замени на функцию из твоей любимой математической библиотеки.
А, да, с прогрессией перепутал.
Меня просто смущает то что по идее ведь если у нас программа состоит из кучи либ, каждая либа будет загружена в рандомное место в адрессспейсе, и как в таком случае привязывается return адресс к чему-то в мапфайле?
for (x = 0.10; x <= 1; x + 0.09)
{ ... }
цикл зацикливается до бесконечности, чому?
ну я и даун, спасибо
Чем дебуг-версия отличается, по-твоему?
Стектрейсы в релизе? Да запросто, но ты забыл про злоебучие оптимизации, которые могут заинлайнить или перемещать вызовы, при чём не все.
>>1075784
Можно. КРОМЕ того, что:
- в cin может прилететь feof не один раз. Т.е.: читаешь, юзер нажал Ctrl+D (или что там в твоей ОС), прилетел EOF, ты сбрасываешь состояние cin и можешь читать до следующего EOFa. С файлами может быть то же самое, если он не в одной программе открыт, наверное
- производительность cin/cout/... никакующая, если не отключить синхронизацию с stdin/stdout/...
А, и ЕЩЁ: cin по-умолчанию текстовый, и изменить это ты можешь только с помощью freopen.
Лан, вот тебе код. https://pastebin.com/UTK4PwEs
Там много всего захардкожено, но молодые-шутливые с лёгкостью перепишут так, чтобы исходные данные можно было задавать с помощью конфига на JSON.
Для компиляции нужна header-only однофайловая библиотека exprtk https://github.com/ArashPartow/exprtk
exprtk.hpp весит полтора мегабайта, так что компилится этот код минуту-полторы. Зато работает быстро. Без оптимизаций находит все решения за 0.5 сек, с оптимизациями — за 0.01 сек.
Про FAQ. Почему Липман, а не Прата или Лафоре? Или, в конце-концов, не Шилдт? Ладно, страус сложный, но щит проще их всех, да и примеры охуительно наглядные. Ну и да, все эти прекрасные книжки не рассказывают о boost, qt и прочем, а об STL - обзорно (для сравнения, тот же Шилдт в книжке о Джаве рассматривает АВТ, Свинг, Сервлеты...). При этом книжки непомерно большие, а хочется чего-то вроде кьюик старт гайда (С++ за 24 часа здорового человека, если проще). Что скажете, что посоветуете? Язык менять не хочется, ибо нужна универсальность и низкое потребление ресурсов. Джава и шарп тянут за собой свои говна, пайтон и жс тянут за собой свои интерпретаторы + они медленные даже для типовых приложений, а все остальные языки на десктопе мало кому всрались, неуниверсально.
Если тебе нужно что-то высокопроизводительное, то бери С++. У липпмана одна из самых лучших книг по крестам, остальные - говно, рассчитанное на абсолютных ньюфагов.
А если тебе просто надо делать десктопные приложения, то учи js и electron, сейчас гуи туда движется.
Можешь объяснить, почему остальное - говно?
Нет, анон, мне не нужна какая-то особенная производительность, но я хочу
>просто
писать приложения, это правда, но чтобы при этом это были приложения как винамп - охуенный, лучший в истории аудиоплеер с моментально отзывчивым интерфейсом, моментальным же запуском, всем необходимым, и при этом весящий в памяти 3 мегабайта, не пытающийся подтянуть за собой пол-хрома. Или вот как нотпад++ - охуенный, фичастый эдитор текста, (если) уступающий (да и то, за счет плагинов) только всяким эклипсам и сублаймам, но весящий в разы меньше и работающий на порядки быстрее перечисленных. И уж тем более, меньше весящий и быстрее работающий в сравнении с брэкетсами-атомами.жс. Что-то вот такое мне нужно. Я не собираюсь писать браузеры, фотошопы и подобную хуйню, моя цель - маленькие, быстро и просто (да, знаю, это не совсем про цпп) разрабатываемые приложения, которые не только выглядят, но и работают хорошо (без тормозов, без запуска длиной в 20 секунд, без пожирания 200 метров оперативки на хеллоуворлд, без нетфреймворков, электронов и jre). Поэтому я думал в сторону С++ (не хардкорного, база, основа) + Qt или подобный фреймворк. Что скажешь, няша?
std::vector<int> example{1, 2, 3, 4, 5};
Но памяти мало, и считывать в вектор, который потом предполагается обработать, не хочется.
Подскажите, получится ли работать с неким входным потоком с помощью std::istream_iterator? Или здесь только решение вида "достать (getchar) символ, если он из тех, что надо заменить, закинуть (putback) во входной поток замененный символ"?
И какое (линейное/постоянное) время может занять unget символа?
жаль мне ньюфань в с++. Вангую через лет 5 с++ будет медленее и в 50 раз более громоздким чем та же ява. Ну а потом когда встроят туда JS и электрон прикрутят, вообще будет охуенчик.
Ну тебе же ничего не мешает не использовать эти списки инициализации, можешь хоть на голом C писать с ассемблерными вставками в отличии от явы, в чём проблема?
Нужно прикрутить к этому окну drag and drop. То есть. У меня на рабочем столе лежит какой нибудь файл. Я его перетаскиваю мышкой в окно и получаю путь к нему. Гуглить пытался. Ничего не нашёл. Вообще как в шиндовс такое сделать?
Вот как это делается на Winapi:
https://stackoverflow.com/questions/2263586/how-to-get-path-of-file-dragged-into-win32-app-and-delete-it
Как это делать на SFML я не знаю, у них и спрашивай, раньше я тоже использовал SFML, но бросил его, у меня свой велосипед.
Какой учебник лучше взять ньюфегу. Если что, я оче хорошо понимаю, когда в книге есть упражнения.
В факе рекомендуют эти:
Бьерн СтрауструпПрограммирование. Принципы и практика использования C++
Стэнли Липпман, Жози Лажойе и Барбара МуЯзык программирования C++
Стивен ПратаЯзык программирования C++
Эх. Придётся всё таки юзать winAPI. Хорошо что хоть SFML может handle окна и объектов ядра отдавать. А то бы вообще горе было.
Ещё можешь глянуть
https://www.slideshare.net/olvemaudal/deep-c/13-What_will_happen_if_you
И
https://www.slideshare.net/adankevich/c11-15621074
и вообще по 14 стандарту поищи чего там же
Да.
Короче как я понимаю в чём моя проблема. У созданного sfml окна есть свой обработчик коллбеков. Мне нужно как-то сделать так, чтобы перехваченное сообщение передавалось в функцию обработчик этого окна и в дополнении к этому нужно изменить эту функцию, чтобы она обрабатывала WM_DROPFILES сообщения.
Как сделать-то это?
Да никак! Пушили из константного массива.
http://en.cppreference.com/w/cpp/container/vector/vector - почти все конструкторы в 11+, а аггегатом вектор не является.
>>1075936
В каком виде нужен результат? Сделай свой класс, наследник basic_streambuf:
http://en.cppreference.com/w/cpp/io/basic_streambuf
внутри этого класса будешь манипулировать данными.
Сделанный буфер можешь подсунуть в другой поток: http://en.cppreference.com/w/cpp/io/basic_ios/rdbuf
http://en.cppreference.com/w/cpp/io/basic_istream
>Но памяти мало, и считывать в вектор, который потом предполагается обработать, не хочется.
>Подскажите, получится ли работать с неким входным потоком с помощью std::istream_iterator?
Типа, если пихать всё обратно, память не расходуется?
>std::istream_iterator is a single-pass input iterator that reads successive objects of type T from the std::basic_istream object for which it was constructed, by calling the appropriate operator>>.
>>1075943
Типа, конст-массив память не занимает, а списки инициализации - занимают. Так надо понять тебя?
А всё. Понял. Можно winAPI окно описать, а потом его хендел передать как параметр при создании SFML окна. Типа
sf::RenderWindow SFML_window(winAPI_window);
Нет, а нахуй надо? И так всё понятно/
Есть grey hat, то там python.
Интел ему интринсики дали, а нет, хочу ассемблер жрать. На самом деле я не стараюсь оскорбить тебя, мне просто интересно, много ли смысла писать на ассемблере, когда есть интринсики.
Когда сложность О(n^3) то одна лишняя инструкция может замедлить общую скорость на 10-20%, а доверяться компилятору на то что он там соптимизирует хорошо, не вариант, ибо я сначала на интрисиктах сделал, но посмотрев выхлом gcc решил переделать все сам.
Ну да тебе виднее там за стойлом с пхп. Тут же все идоты сидят, не то что ты, умничка от как наверстываешь пхпешку от как молодца, и ява скриптик не забудь подправить.
Свинья
https://cpp-school.unigine.com/#video-lectures
1. Получаешь хендел окна SFML с помощью getSystemHandle()
2. Разрешаешь ему drag and drop с помощью DragAcceptFiles
3. пишешь свою функцию обработчик, которая LRESULT CALLBACK
4. Сохраняешь старую функцию обработчик этого окна и подменяешь её своей с помощью SetWindowLongPtr. Пример:
WNDPROC pOldProc = (WNDPROC)(SetWindowLongPtr(window.getSystemHandle(), GWLP_WNDPROC, (LONG_PTR)myWindowProc));
5. При обработке сообщений если это сообщение WM_DROPFILES делаешь всё что тебя надо и выходишь. Если не WM_DROPFILES, то прыгаешь на старую функцию обработчик с помощью CallWindowProc
6...
7. Профит.
>почему остальное - говно?
Я, видимо, неправильно высказался. Для ньюфагов шилдт и прата, может быть, лучше липпмана. Но если у тебя уже есть опыт в программировании, то может есть смысл взять книгу для более продвинутых?
>Что скажешь, няша?
Вроде все хорошо
Но кому нужны в 2017 простые десктопные приложения? Сложные приложения, которые требуют высокой производительности остаются на десктопе, все простое уезжает в веб.
Как по мне он сложный для ньюфага.
-pedantic -std=c++98 (или другого года) уже включил?
Ты про
int a=5;
int b[a];
? Это только в Си и в расширениях языка.
>Для ньюфагов шилдт и прата, может быть, лучше липпмана.
Я не совсем ньюфаг, но у Шилдта таки очень много воды для тех, кто не знает про условия и циклы, а тот же STL очень обзорно разбирается, фактически рерайт документации. Прата жирен, но там куча наглядных примеров. Липпман таки лучше по итогу, после него будешь лучше шарить, чем осилив 1.5к страниц Праты?
>Но кому нужны в 2017 простые десктопные приложения? Сложные приложения, которые требуют высокой производительности остаются на десктопе, все простое уезжает в веб.
Не всем по кайфу пользоваться всем простым за 19.5 евро в месяц, да еще и при необходимости держать запущенным интернет.
>>1075873
Бамп
Пили стори. Мне вот Джава всегда представлялась лютейшим говном. Сейчас я в 2017 сижу на Эклипсе написанном на джаве и бугуртю от каждого её движения.
А вот представить её в хайлоаде - я вообще не могу. Онаж сама 90% хайлоада и сожрёт своим выполнением. Развей мои сомнения или заблуждения.
Сумма цифр числа.
В цикле с предусловием все понятно (прилеплено ниже).
Как то же самое только с постусловием замутить? (do while)
Чому у меня он тупа последнюю цифру числа вываливает?
void main()
{
int a, s;
cin >> a;
s = 0;
while (a > 0)
{
s += (a % 10);
a /= 10;
}
cout << s << endl;
}
Сорян, ошибку понял.
Писал по аналогии с паскалевским repeat until.
Немножко каша в голове.
Они ведь не идентичны.
Не могу понять, где ты мог ошибиться, ведь while от dowhile отличается ровно одним - гарантией выполнения одного шага. Результат твоей программе от замены while на dowhile с таким же условием не зависит НИКАК.
Есть функция, которая принимает вектор по ссылке:
inline void getObjectsFromFile(vector<computer> &vecComp)
{
vector<NetInfo> vecNetInfo;
computer Comp;
NetInfo C;
ifstream fin("networkinfo.txt");
streamsize nameLength = 18, IPLength = 17, MACLength = 13;
C.Name = new char[18];
C.IP_address = new char[17];
int i = 0;
while (1)
{
vecNetInfo.push_back(C);
fin.getline(vecNetInfo.Name, nameLength, '\t');
fin.getline(vecNetInfo.IP_address, IPLength, '\t');
fin.getline(vecNetInfo.MAC_address, MACLength, '\n');
vecComp.push_back(Comp);
vecComp.Info = vecNetInfo;
showComputerInfo(vecComp);
if (fin.fail())
break;
i++;
}
fin.close();
for (int i = 0; i < vecComp.size(); i++)
{
showComputerInfo(vecComp);
}
}
структура NetInfo объявлена вот так:
struct NetInfo
{
char IP_address;
char MAC_address[13];
char Name;
};
она же является полем класса computer.
Функция возвращает вектор computer'ов. Но у них сохраняется только поле MAC_address. А остальные - хранятся во время выполнения функции. Но не сохраняются при выходе из неё.
Что я делаю не так?
Есть функция, которая принимает вектор по ссылке:
inline void getObjectsFromFile(vector<computer> &vecComp)
{
vector<NetInfo> vecNetInfo;
computer Comp;
NetInfo C;
ifstream fin("networkinfo.txt");
streamsize nameLength = 18, IPLength = 17, MACLength = 13;
C.Name = new char[18];
C.IP_address = new char[17];
int i = 0;
while (1)
{
vecNetInfo.push_back(C);
fin.getline(vecNetInfo.Name, nameLength, '\t');
fin.getline(vecNetInfo.IP_address, IPLength, '\t');
fin.getline(vecNetInfo.MAC_address, MACLength, '\n');
vecComp.push_back(Comp);
vecComp.Info = vecNetInfo;
showComputerInfo(vecComp);
if (fin.fail())
break;
i++;
}
fin.close();
for (int i = 0; i < vecComp.size(); i++)
{
showComputerInfo(vecComp);
}
}
структура NetInfo объявлена вот так:
struct NetInfo
{
char IP_address;
char MAC_address[13];
char Name;
};
она же является полем класса computer.
Функция возвращает вектор computer'ов. Но у них сохраняется только поле MAC_address. А остальные - хранятся во время выполнения функции. Но не сохраняются при выходе из неё.
Что я делаю не так?
О, заебок. Сам всё починил.
Просто в цикле выделять память надо было:
vecNetInfo.push_back(C);
vecNetInfo.IP_address = new char[17];
vecNetInfo.Name = new char[18];
Мне кажется, что по производительности будет что-то наравне с вычислительными шейдерами OpenGL только без лишних ебот. А на деле получается что CUDA будет нагибать и первое и второе (причем, судя по всему, OpenCL на NVidia карточках работает так себе, у них CUDA в приоритете).
Все, что не CUDA нахуй не нужно, убедился давно сам, а эти OpenCL - выебоны для нищуков.
Хочу прочитать весь список. Имеются структуры
struct structure
{
std::string album;
std::string singer;
int date;
int songs;
structure next;
};
struct dyn_list {
structure head;
structure* tail;
};
Как мне грамотно оформить функцию, в которой я вывожу все структуры(весь список) через рекурсию(можно и не через неё)?
void CASE2(dyn_list l) // вот тут неправильно
{
while (l.head != NULL)
{
std::cout << "Album name:" << l.head->album << std::endl;
std::cout << "Singer:" << l.head->singer << std::endl;
std::cout << "Release date:" << l.head->date << std::endl;
std::cout << "Number of songs:" << l.head->songs << std::endl;
CASE2(l.head->next); // вот тут неправильно
}
return;
}
Хочу прочитать весь список. Имеются структуры
struct structure
{
std::string album;
std::string singer;
int date;
int songs;
structure next;
};
struct dyn_list {
structure head;
structure* tail;
};
Как мне грамотно оформить функцию, в которой я вывожу все структуры(весь список) через рекурсию(можно и не через неё)?
void CASE2(dyn_list l) // вот тут неправильно
{
while (l.head != NULL)
{
std::cout << "Album name:" << l.head->album << std::endl;
std::cout << "Singer:" << l.head->singer << std::endl;
std::cout << "Release date:" << l.head->date << std::endl;
std::cout << "Number of songs:" << l.head->songs << std::endl;
CASE2(l.head->next); // вот тут неправильно
}
return;
}
Ты дебил? CUDA не работает на АМД карточках и никаких других. И если ты не пишешь какие-то специальное приложение, которые пишется специально под нвидиа карточки, то используя CUDA ты теряешь половину потребителей твоего приложения.
Это все равно что писать кроссплатформенные игры на Direct3D.
Все нормальные люди используют OpenCL и OpenGL.
сука код поехал по пизде.... ща пофикшу....
struct structure
{
std::string album;
std::string singer;
int date;
int songs;
structure next;
};
struct dyn_list
{
structure head;
structure* tail;
};
void CASE2(dyn_list l) // вот тут неправильно
{
while (l.head != NULL)
{
std::cout << "Album name:" << l.head->album << std::endl;
std::cout << "Singer:" << l.head->singer << std::endl;
std::cout << "Release date:" << l.head->date << std::endl;
std::cout << "Number of songs:" << l.head->songs << std::endl;
CASE2(l.head->next); // вот тут неправильно
}
return;
}
сука код поехал по пизде.... ща пофикшу....
struct structure
{
std::string album;
std::string singer;
int date;
int songs;
structure next;
};
struct dyn_list
{
structure head;
structure* tail;
};
void CASE2(dyn_list l) // вот тут неправильно
{
while (l.head != NULL)
{
std::cout << "Album name:" << l.head->album << std::endl;
std::cout << "Singer:" << l.head->singer << std::endl;
std::cout << "Release date:" << l.head->date << std::endl;
std::cout << "Number of songs:" << l.head->songs << std::endl;
CASE2(l.head->next); // вот тут неправильно
}
return;
}
Бля забаньте это имбициала, засирающего тред своей парашей, который даже не додумался использовать pastebin или подобное, что свое говно запостить. Пиздец. Репорт.
Свинья, блять, просто свинья
Вектор я использую, чтобы передать массив объектов класса в функцию. А в структуре NetInfo у меня char-указатели, потомучто я использую некоторые функции winapi, которые принимают именно char. И ещё им надо выделять память через new, иначе getline() ничего в них не запишет.
Конечно, я бы мог объявить вектора символов вместо char, но тогда придётся ВСЮ прогу переписывать.
Если бы я был твоим сожителем, я бы сгрёб весь мусор к тебе на кровать и на клавиатуру. Можешь сделать так же и посмотреть на эффект. Мотивации для сохранения чистоты в доме и сохранения в чистоте себя, кроме общения с другими людьми, быть не может. Раз ты ни с кем лично не общаешься, она тебе и не нужна. Ещё могут завестить тараканчики, но они няши, хоть и бегают везде, пока ты их не видишь.
Я делал по аналогии с repeat-until из паскаля.
Типа, там условия менять нужно.
А как оказалось на крестах эти циклы отличаются только одним проходом, как ты и сказал.
Не могу для себя разобраться, в каких ситуациях уместно использовать обычное объявление переменных а в каких через оператор new. немного подучил плюсы, и теперь почитываю исходные коды различные. во всех случуаях можно сделать оба типа объявлений. Но вот тонкость эту понять не могу.
Если там нет хотяб tesla p100 для вычислений на половинной точности, то хвалится нечем. Поставь хоть 1080, чтоб vgg-16 на нормальной пачке влезал.
>> половину потребителей
Кек, о каких приложениях речь, маня? Адобе алтер эффектс, конвертеры или еще что - это ширпотреб. Определенно, там есть своя аудитория потребителей.
Есть множество специализированных приложений, которые узко ориентированы на CUDA (те же нейроночки для спецзадач и прочее), потому что людям нахуй не уперлось доплачивать за энергонеэффективное говно и за разработку для этого мусора.
New - это оператор динамического выделения памяти. То есть с помощью него ты просто резервируешь место в памяти.
Для начала покури указатели и ссылки.
Нихуя, вместе с new вызывается и конструктор, а ещё бывает placement new.
>>1077529
new нужен или необходим тебе как минимум в четырёх случаях:
- ты пишешь программу для интерфейса, который принимает ссылки на динамические объекты (и потом сам разрушает их)
- тебе нужно сделать большой объект, который на стек не поместится (std::array, например)
- placement new
- тебе нужно сделать smart-указатель (но и здесь можно обойтись без new)
Если твой случай не такой, можешь смело НЕ использовать new, он тебе с вероятностью 99,9999% не нужен.
Он вообще спросил как с помощью new переменные ОБЪЯВЛЯТЬ. Наверняка это ньюфаг, а ты ему про интерфейсы, дин. объекты и smart-указатели заливаешь.
Какой же классный у этой станции рейд массив!
Оба варианта правильны для конструкторов без параметров.
>в одном месте пишется что map\set являются бинарными деревьями поиска, в другом то что красно-чёрными деревьями, что из этого верно?
Красно-чёрные деревья это вид двоичных деревьев поиска.
Может быть и в точности тем же деревом, только со стабильным алгоритмом сортировки.
Хочу сделать обёрту для вызовов java кода из с++
сейчас ипусь с CMakeLists.txt ибо плюсы использовал раньше только ради лаб в унике
пока имею такое дерьмицо, которое ессесно не работает
https://pastebin.com/9UL2AdHQ
2 цистерны чая тому, кто поможет
Слишком мало информации, чтобы помочь. Показывай ошибку, рассказывай про операционку, куда что установлено и.т.п.
Операционка linux mint 18.2
ide clion
JAVA_HOME=/opt/jdk-1-8/jdk1.8.0_141
ошибка
/test-cpp-jni/wrapper/WrapperJNI.cpp:6:17: fatal error: jni.h: Нет такого файла или каталога
compilation terminated.
CMakeFiles/test_cpp_jni.dir/build.make:86: ошибка выполнения рецепта для цели «CMakeFiles/test_cpp_jni.dir/wrapper/WrapperJNI.cpp.o»
В бусте разве что. Если строка с пробелами можно использовать
http://en.cppreference.com/w/cpp/header/iomanip
но всё равно цикл будет.
>>1077875
Ясен хуй, ошибка в исходнике. Имя включаемого файла, лежащего рядом с исходником, должно быть в кавычках, а не в угловых.
да и он же не лежит рядом с исходником, разве не?
я не копировал его в папку проекта, я пытаюсь его из JAVA_HOME/include подгрузить
i <= CONFIG_THREAD_COUNT
Откуда я знаю? Увидел что-то похожее:
main.cpp
wrapper/WrapperJNI.cpp
wrapper/WrapperJNI.h
Можно включить более подробный вывод, понятнее будет.
не, не помогло
всё равно
fatal error: jni.h: Нет такого файла или каталога
подключать пытаюсь и в кавычках и в скобках
всё равно ide говорит cannot find jni.h
ну вот и где я довен?
а ещё все же решил проверить ${JAVA_HOME}
и естественно мне ничего не вывело, сидел тупил .-.
Вот эта говнокод.
Я даже вникать не стал.
Тотально нечитабельно.
Если бы ты был моим подчененным я бы тебя уволил за такое.
Самый топорный вариант - автозамена с помощью регекса, но автозамене похер на комментарии.
Более того, по смыслу многое скорее всего не нужно заменять на long long int. Нужно программу всю перечитывать 100%, на будущее урок будет для типов делать тайпдефы.
>для типов делать тайпдефы.
Никакие тайпдефы делать не надо самому. Ибо есть уже все тайпдефы которые нужны.
#include <stdint.h>
А заменять int на long long int это как с одного непортабельного костыля переваливатсья на другой.
Юзай int64_t / least / fast и т.д.
А с голыми интами наебешься, если будешь портировать куда-то даже на другой компилятор.
Типичный случай с интом: у тебя больше 2^16 элементов для индексов или меньше? Если больше, то тебе нужен 32-битный инт (если у тебя индекс инт), если меньше, то 64-битный.
Откуда стандартной библиотеке в принципе знать, сколько у тебя может быть элементов? libastral.so включили в стандартную поставку?
Никаких тайпдефов не надо ему.
>Если больше, то тебе нужен 32-битный инт (если у тебя индекс инт), если меньше, то 64-битный.
Ну, то есть, наоборот.
Если может быть больше, то используй uint64_t или uint64_fast_t, в чем проблема-то? Но больше 32х бит для индексов это надо придумать еще где такое использоватсья может. Если только ты большие ( больше 4 гб ) файлы читаешь в память, или для оффсета к тем же файлам. Больше то врпинципе такие индексы не нужны.
Вообще для индексов есть специальный тайпдеф - size_t. На 32х битной платформе ты все равн оне сможешь адресовать больше 4гб памяти, а на 64х битной он 64х битный.
Я-то причём? Я использую. В зависимости от версии программы или uint32_t или uint64_t. Но в любом случае тип индексов должен задаваться typedef'ом, выйти за 4 гб бывает не легко, а очень легко.
size_t для этого не годится, может быть сильно длиннее, чем нужно.
Ну выйти за 4 гб памяти я хз, что ты там пишешь. Если какие то сервера на которых по 128 гб оперативы, то там полюбому 64х битная архитектура и size_t будет соотвутствующий, если же сомневаешься можешь использовать uint64_t.
Но если твое приложение нацеленно поддерживать и 32х битные и 64х битные архитектуры, то тут сам подход изначально должен быть другим, и на 32х битной архитектуре выйти за передлы даже 3х гб памяти это уже катастрофа, ибо остальное будет занято ОС, и твоя программа начнет свопаться на диск, а если свопа нет, то это либо тотальное зависание системы, если она не кильне твой процесс, либо аварийный выход из-за невозможности аллокейта памяти.
Но опять же если тебе нужны уверенно 64х битные индексы, то никт оне запрещает тебе их использовать.
>>1078131
Да я то уже давно выучил, когда он еще в драфте был и успел уже разучить, ибо понятно, что это говно делает код только более нечитабельным и менее производительным.
>>1078134
А вот это ты зря. CLion самая адекватная IDE по всем параметрам, если бы она еще кроме CMake поддерживала бы autotools и make было бы вообще идеально.
Конечно там еще по мелочи некоторых фич полезных нету, типа встроенного дизасемблера бинарников и отладчик там деревянный, но я им не пользуюсь обычно, отлаживаю на дебаг логах, а если прям совсем нужно использую gdb из консоли.
Но про тормоза, ты гонишь, у тебя комп наверное деревянный.
У меня Clion вообще никогда не тормозит, не подвисает и время отклика моментальное. Даже в больших проектах.
Студии нету, ибо я не дебил, чтоб писать на С/С++ под винду.
У опенсоса могут быть:
- почта
- мэйлинг лист
- ищью трекер
Что-нибудь одно из этого у разрабов есть.
Это один из самых читаемых примеров кода в треде, каждая строчка четко выражает замысел, насчет производительности конечно у тебя пруфов не будет.
Твою библиотеку лет 10 как не поддерживают, пиши свою.
>Это один из самых читаемых примеров кода в треде
Ты скозал?
> каждая строчка четко выражает замысел
Каждая строчка вызывает боль и недоумение.
Дай дураку лямбды, так они всю программу в одной функции захуярят.
Нахуя вообще функции использовать? Если можно прост окопипастнуть 2 одинаковых действия, как ты сделал с принтами, обернув каждую в еще в скоп.
Нахуя одинаковые вычисления выносить в отдельные перменные, легче же просто копипастнуть их в одну строчку.
Алсо, ты жестко проебался c i <= CONFIG_THREAD_COUNT, у тебя создается всегда на 1 тред больше чем указано в конфиге. Алсо, слово count тут не уместно, ибо обозначает счет, а не количество.
На счет производительности, думаю что умный С++11 делает mfence после каждого измениния атомарной переменной. Хотя не уверен, но ты можешь запостить дизассемблер и мы разберемся.
Но вообще, компилятору намного сложнее оптимизировать такие конструкции с кучей лямбд и всякой хуйни. Можешь посмотреть доклады разработчиков clang для достоверности.
>Алсо, ты жестко проебался
Это не мой код, с тобой другой анон говорит.
>Хотя не уверен, но ты можешь запостить дизассемблер и мы разберемся.
Нет, дорогой, это ты утверждал про производительность, ты и доказывай.
> думаю что умный С++11 делает mfence после каждого измениния атомарной переменной
`sum += acc` это просто `lock xadd`
VS2015
>>1077895
>>1078299
>>1078301
ВНИМАНИЕ ВСЕМ!
ПОКАЗЫВАЮ КАК ПРАВИЛЬНО ПИСАТЬ НА С++11.
https://pastebin.com/ErqiRZJW
В этой работе, я хотел показать элегантность и мощность нового стандарта С++11.
Мне бы очень хотелось, чтобы в мире было больше С++11.
Люди должны мыслить абстракциями и метаобъектами.
Моя работа это вызов общественности, люди должны понять, что они заблуждаются если не пишут на С++11...
Всем спасибо.
Пост-ирония.
too fat
А где unique_ptr для уникальных значений? Где move? Где аллокаторы в фактори функциях? Где в конце концов abstract number factory? Где typename перед каждым T? Где decay->decltype для всех вызываемых функций, неба, аллаха? Почему +1 , = 0 не заменены локальными неймспейсами с интегральными ( enterprise::super_smart_integer_enough_for_everything) константами?
Да ты прав, там явно нехватает С++11. Могу создать репу на гитхабе и будем туда пул реквесты делать, улучшая и совершенсвуюя стиль С++11.
В общем, я запилил репозиторий на гитхабе, кто хочет поговнокодить на самом деле без говнокода на С++11 и т.п. присоеденяйтесь.
https://github.com/CppDvachAnon/CPP11/tree/abstract_number
>Ты скозал?
не, другой анонче
>Дай дураку лямбды, так они всю программу в одной функции захуярят.
why not? особенно если вся программа помещается на один экран.
>Нахуя вообще функции использовать? Если можно прост окопипастнуть 2 одинаковых действия
в лямбду вынести? копипаста копипасте рознь.
>Нахуя одинаковые вычисления выносить в отдельные перменные, легче же просто копипастнуть их в одну строчку.
можно в две. ннада?
>ты жестко проебался c i <= CONFIG_THREAD_COUNT
найди второе место, где я жестоко проебался и получи пирожок
>делает mfence после каждого измениния атомарной переменной
один анонче уже отписал насчет lock xadd, и он прав
>компилятору намного сложнее оптимизировать такие конструкции с кучей лямбд и всякой хуйни
агась, но это если лямбда на лямбде и лямбдой погоняет. от того, что заюзаешь одну лямбду вместо написания отдельной функции, компилятор раком не поставишь
пытаюсь инвочить jvm - падает с sigsegv
это какойта адъ, ну и я конечно молодец
код сего непотребства прилагаю
h: https://pastebin.com/FWaDiFQN
cpp: https://pastebin.com/aShk60S7
выхлоп консоли: https://pastebin.com/1tunNQLA
собственно main
int main() {
jni::WrapperJNI wrapper;
wrapper.Init();
return 0;
}
не бейте
и обратите внимание внизу консольного выхода пишет радостное
JVM load succeeded: Version
танкеры чаю, тому кто пояснит за это дерьмо
итак, оно вроде пусканулось, но в конце случилось веселье
самое время лажать в с++11 когда уже с++17
> оно вроде пусканулось,
С тем же кодом или ты что-то уже поменял? Сделай помощь тебе более простой.
> std::unique_ptr<JavaVMOption[]> options(new JavaVMOption[4]);
> options[4].optionString = const_cast<char >("-verbose:jni");
Пиздец.
> const_cast<char >
> const_cast<char >
> const_cast<char >
> const_cast<char >
> const_cast<char >
Пиздец⁵
Но круче всего — это использование unique_ptr и методы Init() + Release() при наличии нормального управления ресурсами в языке.
Посмотри, что у тебя лежит в твоих unique_ptr, прежде чем методы у хранящихся там указателей дёргать.
А зачем ты пиздишь? Это я found the solution, а не ты.
К нам в айти отдел пришёл новый сотрудник. Нужно сказать, что у нас в отделе работают почтенные крестогоспода. Новичка посадили за компьютер, но не успели даже дать задание, как он начал кодить. Начальник из любопытства подошёл посмотреть, что он там написал. В течении секунд тридцати он побледнел, затем посинел, затем покраснел, а потом трясущимся от нескрываемого гнева голосом сказал:
- Это же Абстрактная фабрика! На чём ты кодил до этого?
- На Джаве.
- Жабапидор! - в один голос заорали все 20 человек.
- Жабапидор! Жабапидор! Жабапидор!
Кто-то включил сирену. Над дверьми замигали красные лампочки тревоги. На окнах мгновенно сомкнулись плотные жалюзи. В офисе одновременно бывает два отдела человек по сорок. На обеде вся эта толпа собирается на первом этаже, где яблоку негде упасть. А поэтому, как охранники ни пытались вырвать джавапидора из рук разъяренной толпы, им это не удалось. По всему офису стоял сплошной рев:
- Жабапидор!
В коридоре его сразу же сбили с ног. Используя галстук как поводок, его тащили через весь коридор, передавая из рук в руки. Поэтому получалось так, что никакого движения в коридоре не происходит, но и джавапидора тоже нет. Его заволокли в каптерку под лестницей, где хранятся ведра и швабры с тряпками, и там закрыли. Под конец рабочего дня он всё же появился. За получасовой обед его изнасиловали несколько человек. Сопротивляться было бы бесполезно. Через день на нем чистым оставалось одно лицо, а на теле не было живого места. Он превращался в мразь, в животное. Его били все, даже дизайнеры и уборщицы. Его заставляли есть говно и опарышей. В очко ему совали битые лампочки, живых птиц и змей. Он стал «дельфином» – в нужнике пятнадцать дырок, он ныряет в первую, выныривает, ныряет во вторую... И так – до конца. От него постоянно воняло. С ним невозможно было рядом находиться. Был такой случай: к нам устроился работать Степаныч. Степаныч сидит на толчке, а кто-то снизу через очко хватает его за яйца. Степаныч с воплем вылетает в коридор без штанов. Напротив - айти отдел. Смех не стихал долго... Потом Степаныч забил его кирзовым сапогом насмерть. Менты как узнали, что сдох джавапидор даже дело заводить не стали.
К нам в айти отдел пришёл новый сотрудник. Нужно сказать, что у нас в отделе работают почтенные крестогоспода. Новичка посадили за компьютер, но не успели даже дать задание, как он начал кодить. Начальник из любопытства подошёл посмотреть, что он там написал. В течении секунд тридцати он побледнел, затем посинел, затем покраснел, а потом трясущимся от нескрываемого гнева голосом сказал:
- Это же Абстрактная фабрика! На чём ты кодил до этого?
- На Джаве.
- Жабапидор! - в один голос заорали все 20 человек.
- Жабапидор! Жабапидор! Жабапидор!
Кто-то включил сирену. Над дверьми замигали красные лампочки тревоги. На окнах мгновенно сомкнулись плотные жалюзи. В офисе одновременно бывает два отдела человек по сорок. На обеде вся эта толпа собирается на первом этаже, где яблоку негде упасть. А поэтому, как охранники ни пытались вырвать джавапидора из рук разъяренной толпы, им это не удалось. По всему офису стоял сплошной рев:
- Жабапидор!
В коридоре его сразу же сбили с ног. Используя галстук как поводок, его тащили через весь коридор, передавая из рук в руки. Поэтому получалось так, что никакого движения в коридоре не происходит, но и джавапидора тоже нет. Его заволокли в каптерку под лестницей, где хранятся ведра и швабры с тряпками, и там закрыли. Под конец рабочего дня он всё же появился. За получасовой обед его изнасиловали несколько человек. Сопротивляться было бы бесполезно. Через день на нем чистым оставалось одно лицо, а на теле не было живого места. Он превращался в мразь, в животное. Его били все, даже дизайнеры и уборщицы. Его заставляли есть говно и опарышей. В очко ему совали битые лампочки, живых птиц и змей. Он стал «дельфином» – в нужнике пятнадцать дырок, он ныряет в первую, выныривает, ныряет во вторую... И так – до конца. От него постоянно воняло. С ним невозможно было рядом находиться. Был такой случай: к нам устроился работать Степаныч. Степаныч сидит на толчке, а кто-то снизу через очко хватает его за яйца. Степаныч с воплем вылетает в коридор без штанов. Напротив - айти отдел. Смех не стихал долго... Потом Степаныч забил его кирзовым сапогом насмерть. Менты как узнали, что сдох джавапидор даже дело заводить не стали.
>template<class K> iterator find(const K& x);
unique_ptr можно передавать custom deleter.
>- На Джаве.
>- Жабапидор! - в один голос заорали все 20 человек.
Ещё на котлине :)
Но я не виноват, что у тех с кем мы работаем код на жабе
Сказали запилить плюсы - пилю
причем у них жаба вызывает плюсы через jni ирония
А тебе нужно просто код с плюсов запусть в жава проекте?
Я просто не пойму, почему ты кресты в dll какую нибудь не засунешь, а из java просто dll функции вызывать? Или в жаве нельзя обращаться к dll? Или у нас не шиндовс?
>За получасовой обед его изнасиловали несколько человек.
Я так ненавижу пидорасов, что хочу выебать их!
Тем, что ЖАВА ООП ПАТТЕРНЫ КУКАРЕКУ НУЖНО БОЛЬШЕ ФАБРИК, БОЛЬШЕ ИНТЕРФЕЙСОВ ПО ИНТЕРФЕЙСУ НА КАЖДОЕ ПОЛЕ
Требую дополнительных пояснений, я тут наоборот пытаюсь въезжать в паттерны, даже книгу на днях купил и позавчера как-раз пытался учить эту фабрику но забил всё-равно, скучно, что с паттернами и уж тем-более ООП не так? Мы же на C++ а не на C.
С паттернами всё отлично. Плохо то, что жава рабы их суют в каждую дыру не понимаю для чего какой паттерн нужен.
Слушай, добрый совет тебе, выброси нахуй эту гнигу, а лучше вообще сожги, чтоб другие не прочитали.
ООП патерны в С++ почти никогда не нужны, если ты не пишешь говно типа как на яве. Я сам прочитал несколько гниг gof и т.п про это говно и мне ниразу эта параша не пригодилась на работе и никто из нормальных людей это не использует.
Мне нужно из плюсов вызывать жаба код, вот в чем подвох.
Просто я знаю что этот жава код в итоге вызывает плюсы.
инсайдерская инфа 146%
Можете даже попробовать угадать сферу деятельности)
Не нихуя)
А почему? Объясни, пожалуйста, если не хочешь или сложно, скажи: в книжке Липпмана это будет разбираться? Я только начал просто. Если не будет - скинь что-нибудь про работу компилятора (в очень общих чертах), разумеется, если несложно.
Имена типов хранятся, но они... Сложные. Можно вытащить из типа строку типа такой (это std::string)
NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Они сложные из-за того, что используется метапрограммироване и классы генерятся во время компиляции.
> скинь что-нибудь про работу компилятора (в очень общих чертах)
Очень тяжело рассказать про работку компилятора в очень общих чертах. Советую начать с первой ссылки в гугле по запросу how c++ compiler works
Советую забить на плюсы, они очень сложные, а профита тебе с них никакого не будет
>Почему стоит забить?
>они очень сложные, а профита тебе с них никакого не будет
А по поводу сабжа
>если я захочу покласть в переменную строку с названием класса, а потом "создать" из этой строки объект - у меня это не получится?
То что ты описал. Так работает dll. Только вызываются функции. С помощью dll непосредственно получить объект созданный в этом самой dll получить достаточно сложно. И насколько я понимаю тут уже зависит от платформы. Если бы не пайтон, а какой нибудь .net язык и шиндовс, то можно было бы Invoke использовать или тот же COM
https://stackoverflow.com/questions/4295432/typedef-function-pointer
Не забудь прокрутить вниз до std::function
>То есть, если я захочу покласть в переменную строку с названием класса, а потом "создать" из этой строки объект - у меня это не получится?
Если очень сильно приспичит, и ты готов использовать нестандартные расширения языка - это в целом возможно, только ты просираешь статическую типизацию (один из важнейших инструментов программирования на плюсах).
Перегрузка функции operator<<().
Во втором случае печатается значение указателя (адрес в памяти).
Попробуй p явно преобразовать к char*
Там какая-то проблема с самим cout
http://www.learncpp.com/cpp-tutorial/613-void-pointers/
Что по-твоему должен делать оператор вывода, видя перед собой указатель на void? Как он по-твоему должен догадаться о том, что там строка/число/структура?
Какой же С++ уебищный язык господи. Нет ничего лучше старого добротного FORTRAN.
Ну у него там как раз С. От крестов там только поток вывода
Аноны,проверьте пожалуйста,все ли сделал так.
Задание:
Для каждого x, изменяющегося от a до b с шагом h, найти значения функции Y(x), суммы S(x) и |Y(x)–S(x)| и вывести в виде таблицы. Значения a, b, h и n вводятся с клавиатуры.
Пик.
Решение:
#include <iostream>
#include <math.h>
using namespace std;
int main(){
double s=0,y=0,n,ex,x,min,max,h,exx;
cout<<"Vvedite n"<<endl;
cin>>n;
cout<<"Vvedite min"<<endl;
cin>>min;
cout<<"Vvedite max"<<endl;
cin>>max;
cout<<"Vvedite shag"<<endl;
cin>>h;
for (int k=0,x=min; k<=n,x<=max; k++, x+=h){
exx=2k+1;
ex=(exx-1)exx;
if (k==0) ex=1;
s=pow(-1,k)pow(x,(2k+1))/ex;
y=sin(x);
cout<<"k = "<<k<<" , S(x) = "<<s<<" ,Y(x)= "<<y<<" ,|Y(x)-S(x)|= "<<fabs(y-s)<<endl;
}
system("pause");
}
Аноны,проверьте пожалуйста,все ли сделал так.
Задание:
Для каждого x, изменяющегося от a до b с шагом h, найти значения функции Y(x), суммы S(x) и |Y(x)–S(x)| и вывести в виде таблицы. Значения a, b, h и n вводятся с клавиатуры.
Пик.
Решение:
#include <iostream>
#include <math.h>
using namespace std;
int main(){
double s=0,y=0,n,ex,x,min,max,h,exx;
cout<<"Vvedite n"<<endl;
cin>>n;
cout<<"Vvedite min"<<endl;
cin>>min;
cout<<"Vvedite max"<<endl;
cin>>max;
cout<<"Vvedite shag"<<endl;
cin>>h;
for (int k=0,x=min; k<=n,x<=max; k++, x+=h){
exx=2k+1;
ex=(exx-1)exx;
if (k==0) ex=1;
s=pow(-1,k)pow(x,(2k+1))/ex;
y=sin(x);
cout<<"k = "<<k<<" , S(x) = "<<s<<" ,Y(x)= "<<y<<" ,|Y(x)-S(x)|= "<<fabs(y-s)<<endl;
}
system("pause");
}
Все правильно, сдавай.
>"Vvedite shag"
Проиграл с этого в голос.
Уже не первый раз замечаю у студентиков с лабами такую хуйню на транслите.
Вас блять что английскому не учат в ваших ПТУ? Этож пиздец, какой-то.
Покажи такой код кому-нибудь в реальной жизни вне лабы, люди же охуеют просто и засмеют сразу.
Пиздец неужели трудно выучить блять хотя бы элементарный уровень языка, чтобы придерживатсья правил установленных в мировом сообществе программирования?
Часто преподы не знают английский, либо просто требуют сдавать работы исключительно с транслитом
Да тут дело ещё хуже. Предположим нужно сделать на русском. Но дело в том, что он не потрудился сделать LC_ALL и писать на русском. А начал городить транслит. У нас тут 2017 как бы utf уже стандарт. Транслин ненужен
В том то и дело, что её почему-то нету во всяком случае в спермо стд. При чем есть бумажка 2016 года, направленная наверное в комитет, не уверен, в которой запрашивается эта фича.
Если препод не знает английского и преподает С++, то можно смело нахуй слать такого долбоеба ибо ничему хорошму он не может научить хотя бы ввиду того, что 99% знаний о программирование находится в англоязычном формате.
>>1079586
А че LC_ALL то? Может хотя бы LC_LANG? Но в общем, даже если он укажет LC_ALL=ru_RU.UTF-8 то не факт что в системе будет установленна эта локаль. А инглишь поддерживает все, и тут 100% не проебешься.
С чего ты взял, говноглот, что кто-то разрешит тебе запускать мои клевые программы, да еще и из под прыщеговна?
Хорошо, что ты не разрешаешь запускать свое говно приличным людям. Но на всякий случай добавь туда комментарии "Не спермоглотам не запускать".
>Там максимум сишечка и винапи
Я тебе по секрету расскажу. Но расшарить winAPI не так и просто на нормальном уровне конечно же. Тем более winAPI оперирует уже с таким понятие как операционная система. И там уже нужно знать как оно работает и как там всё описывается.
>"Не спермоглотам не запускать".
Если там будет такой комментарий, тебе будет можно запускать.
Я говорил про то, что кресты не преподают.
А чего сложного в винапи? Появилась задача, гугли пример, уточняй что в нем происходит на msdn, перепиливай под свою задачу.
Так и есть.
А к чему этот признак? По определению "спермоглот" занимается глотанием спермы, а не раздумьями "захочется или нет". Если не набирать её в рот, то и проглотить не получится. мы же взрослые крестовики, и не будем заниматься грязными хаками, в виде заливания спермы через нос?
http://en.cppreference.com/w/cpp/filesystem/path/append
http://en.cppreference.com/w/cpp/filesystem/path/path
Собственно, если у тебя прилепляется string, то у тебя вызывается конструктор path, а для конструктора есть нужная перегрузка. Выкладывай код, что-то здесь нечисто.
У нас (в 2012) один препод пытался преподавать плюсы. Начал писать код на доске и обосрался. Объяснить я ему не смог, он ушёл в полную несознанку. Я к нему на пары больше не ходил.
Используется одинаковый сид, чтобы он был разным, надо его инициализировать, например, временем.
Вся суть курсохуесосов, что с вас взять. Шёл бы да книжку почитал.
Есть модуль периферии/несколько идентичных модулей, к которому/которым относятся некие конфигурационные регистры, битовые поля в которых отвечают за некие настройки. Библиотека должна обеспечивать методы, модифицирующие эти поля, обеспечивая при этом максимальную защиту от дебила, сидящего за монитором, проверяя на этапе компиляции передаваемые параметры.
Делать это в рантайме, как в сишных библиотеках, поставляемых производителями, уныло и тупо.
В результате, пока что пришел к такому варианту:
Модули периферии объявляются как шаблоны классов с заблокированными конструкторами и статическими методами. Внутри класса объявляются enum class-ы, содержащие возможные значения битовых полей. Для модификации регистров объявляется шаблон метода, который проверяет static_assert-ом тип переданного enum-а, ну а затем делает нужные манипуляции. Вот в таком виде:
namespace VE4 {
////////////////////////////////////////////////////////////////////////////
/// Список портов GPIO
enum class Gpios : uint32_t {
GpioA = 0x40080000,
GpioB = 0x40088000,
GpioC = 0x40090000
};
////////////////////////////////////////////////////////////////////////////
/// Шаблон порта GPIO
template <const Gpios port>
class Gpio {
public:
// Запись/чтение напрямую
static uint16_t Get() {
return base->RXTX;
}
static void Set(const uint16_t d) {
base->RXTX = d;
}
protected:
Gpio();
// Структура управляющих регистров
typedef struct {
uint32_t RXTX;
uint32_t OE;
uint32_t FUNC;
uint32_t ANALOG;
uint32_t PULL;
uint32_t PD;
uint32_t PWR;
uint32_t GFEN;
} Regs;
// И указатель на нее
static constexpr Regs base = (Regs)port;
};
////////////////////////////////////////////////////////////////////////////
/// Шаблон отдельного пина
template <const Gpios port, const uint32_t pin>
class Pin : public Gpio<port> {
public:
// enum-ы с битовыми масками
enum class Direction : uint32_t {
Input = 0,
Output = 1,
MASK = 1 // для сброса поля
};
enum class Function : uint32_t {
GPIO = 0,
Main = 1,
Alternate = 2,
Remapped = 3,
MASK = 3
};
// Чтение/запись
static bool Get() {
return _gpio::base->RXTX && setmsk;
}
static void Set(bool b) {
if (b) _gpio::base->RXTX | setmsk;
else _gpio::base->RXTX & clrmsk;
}
// Конфигурация
template <typename T>
static void Config(T cfg) {
// Проверка передаваемых enum-ов static_assert-ом
APPLICABLE_TYPES(Direction,
Function);
if (ChkType<T, Direction>()) { ModBits<T, pin>(cfg, _gpio::base->OE); } // Модификация бит в регистре по маске и смещению маски
if (ChkType<T, Function>()) { ModBits<T, pin>(cfg, _gpio::base->FUNC); } // Да, нужно в макрос обернуть
}
protected:
Pin();
private:
static constexpr uint32_t setmsk = 0x01u << pin;
static constexpr uint32_t clrmsk = ~setmsk;
using _gpio = Gpio<port>;
};
}
В результате получается, можно писать так:
void f() {
using PA1 = VE4::Pin<VE4::Gpios::GpioA, 1>;
PA1.Config<PA1::Direction>(PA1::Direction::Output);
}
В связи с этим хочу узнать мнение анонов, правилен ли такой подход?
Есть модуль периферии/несколько идентичных модулей, к которому/которым относятся некие конфигурационные регистры, битовые поля в которых отвечают за некие настройки. Библиотека должна обеспечивать методы, модифицирующие эти поля, обеспечивая при этом максимальную защиту от дебила, сидящего за монитором, проверяя на этапе компиляции передаваемые параметры.
Делать это в рантайме, как в сишных библиотеках, поставляемых производителями, уныло и тупо.
В результате, пока что пришел к такому варианту:
Модули периферии объявляются как шаблоны классов с заблокированными конструкторами и статическими методами. Внутри класса объявляются enum class-ы, содержащие возможные значения битовых полей. Для модификации регистров объявляется шаблон метода, который проверяет static_assert-ом тип переданного enum-а, ну а затем делает нужные манипуляции. Вот в таком виде:
namespace VE4 {
////////////////////////////////////////////////////////////////////////////
/// Список портов GPIO
enum class Gpios : uint32_t {
GpioA = 0x40080000,
GpioB = 0x40088000,
GpioC = 0x40090000
};
////////////////////////////////////////////////////////////////////////////
/// Шаблон порта GPIO
template <const Gpios port>
class Gpio {
public:
// Запись/чтение напрямую
static uint16_t Get() {
return base->RXTX;
}
static void Set(const uint16_t d) {
base->RXTX = d;
}
protected:
Gpio();
// Структура управляющих регистров
typedef struct {
uint32_t RXTX;
uint32_t OE;
uint32_t FUNC;
uint32_t ANALOG;
uint32_t PULL;
uint32_t PD;
uint32_t PWR;
uint32_t GFEN;
} Regs;
// И указатель на нее
static constexpr Regs base = (Regs)port;
};
////////////////////////////////////////////////////////////////////////////
/// Шаблон отдельного пина
template <const Gpios port, const uint32_t pin>
class Pin : public Gpio<port> {
public:
// enum-ы с битовыми масками
enum class Direction : uint32_t {
Input = 0,
Output = 1,
MASK = 1 // для сброса поля
};
enum class Function : uint32_t {
GPIO = 0,
Main = 1,
Alternate = 2,
Remapped = 3,
MASK = 3
};
// Чтение/запись
static bool Get() {
return _gpio::base->RXTX && setmsk;
}
static void Set(bool b) {
if (b) _gpio::base->RXTX | setmsk;
else _gpio::base->RXTX & clrmsk;
}
// Конфигурация
template <typename T>
static void Config(T cfg) {
// Проверка передаваемых enum-ов static_assert-ом
APPLICABLE_TYPES(Direction,
Function);
if (ChkType<T, Direction>()) { ModBits<T, pin>(cfg, _gpio::base->OE); } // Модификация бит в регистре по маске и смещению маски
if (ChkType<T, Function>()) { ModBits<T, pin>(cfg, _gpio::base->FUNC); } // Да, нужно в макрос обернуть
}
protected:
Pin();
private:
static constexpr uint32_t setmsk = 0x01u << pin;
static constexpr uint32_t clrmsk = ~setmsk;
using _gpio = Gpio<port>;
};
}
В результате получается, можно писать так:
void f() {
using PA1 = VE4::Pin<VE4::Gpios::GpioA, 1>;
PA1.Config<PA1::Direction>(PA1::Direction::Output);
}
В связи с этим хочу узнать мнение анонов, правилен ли такой подход?
Ты на крестах пишешь. Гспд. Ну ты хотя бы попытался заглянуть в стандартную библиотеку
http://www.cplusplus.com/reference/random/
Собственно где тут С++14?
Что значит правилен?
У тебя не код, а какое насилие шаблонов. И залей его куда нибудь. Читать невозможно.
Нахуя там namespace в начале? Чтобы точки потом можно было ставить?
1. using, constexpr, вот это вот все.
2. Ну есть же какие-то правила хорошего тона, разве нет?
3. Что не так с шаблонами? https://pastebin.com/F6zJyE5K, https://pastebin.com/MFw32PkR
4. Чтобы отделить библиотеку от всего остального.
#include <string_view>
#include <filesystem>
#include <fstream>
#include <iostream>
using namespace std;
namespace fs = experimental::filesystem;
fs::path data_path;
ifstream filestream;
fs::path FileSystemManager::GetDataPath()
{
return data_path;
}
FileSystemManager filesystem;
void openfile(string_view file_name)
{
//filestream = ifstream(filesystem.GetDataPath() / string(file_name)); // это работает
filestream = ifstream(filesystem.GetDataPath() / file_name); // это нет
if (!filestream)
{
//throw underflow_error;
return;
}
}
Как-то так
#include <string_view>
#include <filesystem>
#include <fstream>
#include <iostream>
using namespace std;
namespace fs = experimental::filesystem;
fs::path data_path;
ifstream filestream;
fs::path FileSystemManager::GetDataPath()
{
return data_path;
}
FileSystemManager filesystem;
void openfile(string_view file_name)
{
//filestream = ifstream(filesystem.GetDataPath() / string(file_name)); // это работает
filestream = ifstream(filesystem.GetDataPath() / file_name); // это нет
if (!filestream)
{
//throw underflow_error;
return;
}
}
Как-то так
https://ru.wikipedia.org/wiki/Base64
>Схема соответствия «символ — значение» в Base64
Читаешь побайтово из одного потока, прогоняешь его через энкодер, и выводишь в другой поток.
http://coliru.stacked-crooked.com/a/8256d1a5f54133f8
Ты про эту ошибку говоришь или про какую? ТЫ СВОЮ ОШИБКУ ЗАПОСТИШЬ БЛЯДЬ ИЛИ МНЕ НУЖНО КЛЕЩАМИ ТЕБЯ ЗА ЯЗЫК ТЯНУТЬ?
filesystemmanager.cpp(73): error C2679: binary '/': no operator found which takes a right-hand operand of type 'std::string_view' (or there is no acceptable conversion)
\msvc\14.11.25503\include\filesystem(1500): note: could be 'std::experimental::filesystem::v1::path std::experimental::filesystem::v1::operator /(const std::experimental::filesystem::v1::path &,const std::experimental::filesystem::v1::path &)' [found using argument-dependent lookup]
filesystemmanager.cpp(73): note: while trying to match the argument list '(std::experimental::filesystem::v1::path, std::string_view)'
>> #include <conio.h>
>> #include <time.h>
Говноед плес. Ты зацем со своим Цэ в терд крестов пришел. Дали ему в крестах рандомы с настраиваемыми генераторами и распределениями, нет, блять, хотим парашу с цэ жрать.
Только твоя параша из С++ работает в 1000 раз медленее обычного rand().
> параша из С++ работает в 1000 раз медленее обычного rand().
Хули ты пиздишь?
https://stackoverflow.com/a/35359918
Даже если на 2 порядка, что не так. Но она хотя бы нормально работает.
Код не читал, подход правильный.
Ладно, не пожалел почаса и потратил на написание бенчмарка.
https://pastebin.com/tKPfDNY2
Вот тесты с моей тачки с core i5 4670k:
[Trace timer]: Clocks per second 3,385,997,176
C++ uniform distribution 10,000,000 runs
Total exec cycles: 719,350,631
Avg cycles/run : 71
C rand 10,000,000 runs
Total exec cycles: 310,099,258
Avg cycles/run : 31
RDRAND fair rand 10,000,000 runs
Total exec cycles: 2,856,603,050
Avg cycles/run : 285
RDRAND unfair rand 10,000,000 runs
Total exec cycles: 2,823,199,699
Avg cycles/run : 282
Надеюсь вы там разберетесь как это скомпилировать. Я в хедере написал флаги.
То есть у шланга все работает? Придется на время смириться с виндопроблемами.
Среднее время мало о чем говорит, надо гистограмму.
Эм. Может ты не будешь им диапазон задавать. Понятно что при нормализации будет медленно. Делай вот так
random_device rd;
mt19937 gen(rd());
gen(); <- возвращает рандомное число.
Да так быстрее, вроде показывает 10 циклов avg, но там походу у меня баг с rdtsc, что-то циклы странно показывает. Сейчас нахожусь под виндой и компилирую mingw думаю может из-за этого.
Я конечно не эксперт. Но зачем ты натыкал атрибутов, если не используешь gcc. И вообще зачем тебе эти атрибуты тут.
Или это копипаст с интеловской документации просто?
> int rand_cpp(std::mt19937& gen) {
> return gen();
> }
C++ uniform distribution 10000000 runs
Total exec cycles: 140928009
Avg cycles/run : 14
C rand 10000000 runs
Total exec cycles: 468254179
Avg cycles/run : 46
Басни про скорость работы сишного генератора случайных чисел -- брехня?
Если честно, нет никакой разницы, 14 или 46, гораздо важнее качество распределения. Вот тут можно похоливарить. А заполнение кучей случайных чисел боттлнеком вряд ли станет, только если в монте-карло каком-нибудь очень гнойном.
Вот ради интереса боевой компилятор вместо govnocc
$ icpc -v
icpc version 14.0.0 (gcc version 4.8.0 compatibility)
[Trace timer]: Clocks per second 2,294,860,167
C++ uniform distribution 10000000 runs
Total exec cycles: 99331272
Avg cycles/run : 9
C rand 10000000 runs
Total exec cycles: 283317471
Avg cycles/run : 28
>Вот тут можно похоливарить
https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful
Уже похоливарено
>Атрибуты что бы не дать копилятору удалить код во время оптимизации.
Где-то удалить, а где-то запрещает инлайнить. Мне не понятно зачем это в контексте твоего кода?
Виноват, принёс не самый свежий. Исправляюсь.
$ icpc -v
icpc version 17.0.2 (gcc version 4.8.5 compatibility)
$ icpc -O3 -std=c++11 example.cpp
$ srun a.out
[Trace timer]: Clocks per second 2,294,871,009
C++ uniform distribution 10000000 runs
Total exec cycles: 77200799
Avg cycles/run : 7
C rand 10000000 runs
Total exec cycles: 296607359
Avg cycles/run : 29
>>1080155
Я принёс последний интеловский компилятор, сможешь цифру 7 обуздать? Мне просто тоже стало интересно, насколько быстро можно сделать.
Слушай, ну впринципе можно со своим mt генератором на AVX и распалаллеленым твистером, но это уже задача посерьезней.
Присылай, затестим
$ srun cpuinfo
Intel(R) processor family information utility, Version 2017 Update 2 Build 20170125 (id: 16752)
Copyright (C) 2005-2017 Intel Corporation. All rights reserved.
===== Processor composition =====
Processor name : Intel(R) Xeon(R) E5-2697 v4
Packages(sockets) : 1
Cores : 1
Processors(CPUs) : 1
Cores per package : 1
Threads per core : 1
===== Processor identification =====
Processor Thread Id. Core Id. Package Id.
8 0 26 0
===== Placement on packages =====
Package Id. Core Id. Processors
0 26 8
===== Cache sharing =====
Cache Size Processors
L1 32 KB no sharing
L2 256 KB no sharing
L3 45 MB no sharing
Присылай, затестим
$ srun cpuinfo
Intel(R) processor family information utility, Version 2017 Update 2 Build 20170125 (id: 16752)
Copyright (C) 2005-2017 Intel Corporation. All rights reserved.
===== Processor composition =====
Processor name : Intel(R) Xeon(R) E5-2697 v4
Packages(sockets) : 1
Cores : 1
Processors(CPUs) : 1
Cores per package : 1
Threads per core : 1
===== Processor identification =====
Processor Thread Id. Core Id. Package Id.
8 0 26 0
===== Placement on packages =====
Package Id. Core Id. Processors
0 26 8
===== Cache sharing =====
Cache Size Processors
L1 32 KB no sharing
L2 256 KB no sharing
L3 45 MB no sharing
Лол, не. Это надо уже долго сидеть разбираться в тонкостях алгоритма, чтобы подстроить его под SIMD.
Но как говорит вики, есть реализации на SSE2 которые в 2 раза быстрее обычного, с учетом того, что SSE регистры 128 битные и оперируют за раз по 4 32х битных числа, то AVX c 256 битными регистрами теоритически может дать х4 прирост скорости без изменения алгоритма.
Вообще если дальше идти можно и на GPGPU запилить, и генирировать просто таблицу рандом чисел и потом просто идти по ней, это точно будет в десятки раз быстрее, чем даже C++ генератор.
Visual Studio
>то попробуй Qt
Легче недельку потратить на изучения шарпа и недельку на WPF, чем несколько лет дрочить Qt и всё равно писать глючную парашу.
Для меня это выглядит как лишняя обертка над std::allocator. То есть вместо того , чтобы явно работать с std::allocator , я буду писать что-то типа:
std::allocator_traits<std::allocator<Type>> и потом уже вызывать методы allocator_traits.
И нахера?
Хочу просто понять указатели, поебаться с динамическим массивом чаров. Мне надо эту самую строку, которую введет пользователь, из string перевести в динамический массив. Что-то я запутался.
Дело в том, что ты сейчас занимаешься С стайлом. Это не кресты. Ты можешь использовать метод c_str для того, чтобы получить из с++ строк std::string С строку которая char*.
Но зачем оно тебе нужно? Работая с C строками, ты работает с со стандартной библиотекой С, а значит тебе не в этот тред.
Ну и std::string в твоём понимании это динамический массив, но правильно это конечно же назвать контейнером.
Благодаря тебе кое-что прояснилось. Спасибо.
Можно изучать указатели, работая со string же, а не с *char.
Где ты видишь, чтобы я ему что-то советовал. Я ответил на его вопросы.
>Мне надо эту самую строку, которую введет пользователь, из string перевести в динамический массив
>Ты можешь использовать метод c_str для того
Считаю этот код практически произведением искусства и верх гибкости и универсальности и МОЩИ С++.
Да увидел уже. Делал это когда не было поста того. Но отвлёкся и прослоупочил.
Нашел код пикрелейтед, но он ругается на сишную getline. Че делать? Мозги уже кипят.
http://ru.cppreference.com/w/cpp/string/basic_string/getline
getline первым аргументом всегда принимает поток, вторым так называемый буфер и 3 разделитель. А у тебя getline с какой-то непонятной сигнатурой.
А то что у тебя это http://man7.org/linux/man-pages/man3/getline.3.html
Он принимает 3 аргументом поток типа FILE. Короче ты запутался.
Распутывайся.
>Хочу просто создать строку char, занести в нее введенное пользователем значение и работать с ней дальше, используя С++.
Короче. Делай так.
std::string str;
std::getline(std::cin, str);
char c_str = str.c_str();
и всё. Делай с c_str что хочешь
Это под windows? getline это unix расширение, на крайняк можно использовать std::getline, а затем из std::string брать char\*
>getline это unix расширение
Да вроде стандарт
http://www.cplusplus.com/reference/istream/istream/getline/
>>1080292
Есть std::string::data(), да только запись в этот буфер это undefined behavior. Вы заебали, прекратите ебать строку указателями, дрочеры чёртовы. Читайте сразу в буфер.
Прямые руки запрещают.
>>1080305
>>1080308
Блядь, и чего вам, дебилам, в плюсах будто мёдом намазано? Сидели бы и писали на пыхе
https://stackoverflow.com/questions/1042940/writing-directly-to-stdstring-internal-buffers
After a lot more reading and digging around I've discovered that string::c_str and string::data could legitimately return a pointer to a buffer that has nothing to do with how the string itself is stored. It's possible that the string is stored in segments for example. Writing to these buffers has an undefined effect on the contents of the string.
Additionally, string::operator[] should not be used to get a pointer to a sequence of characters - it should only be used for single characters. This is because pointer/array equivalence does not hold with string.
What is very dangerous about this is that it can work on some implementations but then suddenly break for no apparent reason at some future date.
Therefore the only safe way to do this, as others have said, is to avoid any attempt to directly write into the string buffer and use a vector, pass a pointer to the first element and then assign the string from the vector on return from the dll function.
То есть ты хочешь сказать, что
str[0] всегда равно char ptr = &(str.begin());
Но str[1] не всегда будет равно prt[1]?
Я хочу сказать, что при некоторых (очень маловероятных) условиях &str[0]+n и &str[n] будут различаться. Кроме этого при других условиях c_str() и data() могут вернуть указатель на другой буфер (например, копию). Кроме этого я хочу сказать, что буфер может быть убит при модификации строки любым non-const методом. Кроме этого я хочу сказать, что синтаксис с нулевым элементом просто уродлив.
По совокупности показателей так делать нельзя. Это быдлокод.
>Я хочу сказать, что при некоторых (очень маловероятных) условиях &str[0]+n и &str[n] будут различаться. Кроме этого при других условиях c_str() и data() могут вернуть указатель на другой буфер (например, копию).
Назови эти условия.
P.S. Про то, что мы говорим про C++11+—эру упоминать дополнительно смысла нет, я думаю.
> Кроме этого я хочу сказать, что буфер может быть убит при модификации строки любым non-const методом.
Нет, любым не может.
Это совершенно неважно в рамках обучения указателям. Так то конечно реализации могут быть разными, Small Buffer Optimization та же.
Ты делаешь очень много лишних допущений.
https://stackoverflow.com/questions/14290795/why-is-modifying-a-string-through-a-retrieved-pointer-to-its-data-not-allowed
Зачем ты придумываешь на ходу свой собственный манястандарт, конченный? Совсем необучаемый?
>>1080321
Да, вполне нормально. Указатели это не такая уж и редкая штука.
>>1080322
>Это совершенно неважно в рамках обучения указателям.
Нет, это не нормально в процессе обучения. Не надо учиться писать быдлокод, а потом переучиваться. Сизифов труд это необучаемость
>Ты делаешь очень много лишних допущений.
Всего 3 предложения из стандарта.
> Now, that being said, it is perfectly valid to modify the &str[0] pointer, and the array of characters therein. So long as you stay in the half-open range [0, str.size()).
Сам себя переспорил, молодец.
По твоей же ссылке написано, что это легаси (за исключением модификации ссылки на пустую строку)
>А как взаимодействовать с реальным миром?
Хорошее замечание кстати. Но дело в том, что изначально был вопрос о том, как ввести строку из консольки и представить её в виде сишной строки.
Хотя стоит отметить, что если ты используешь winAPI, то ты используешь их затайпдейфиное чудо. Понятно, что за каким нибудь TCHAR скрывается char для ANSI и w_char для unicode. Но всё таки.
Не его .h файл, а именно сам код. Вот например если для шиндовса, то где посмотреть как оно winAPI юзает?
Где-нибудь в Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.11.25503/crt/src
Кто-нибудь объяснит, отчего может возникать ошибка 11004
WSANO_DATA?
Когда запускаю функцию в консольном приложении
hn = gethostbyaddr((char*)&IP, 16, AF_INET);
всё работает нормально. Но когда класс с этой же функцией использую в winapi, выдаёт такую ошибку. Ещё указывается, что hostent hn равняется nullptr, поэтому невозможно прочитать
hn->name, а именно это и надо.
Внимательно прочитай статью на MSDN и узнай из неё, что должно быть в IP.
>>1079960
Ясен хуй, либо твоё компилятор не поддерживает новый стандарт драфт, либо нужный номер стандарта не указал.
>>1080188
Это ты в С++-треде спрашиваешь про интуитивную понятность?
>>1080254 >>1080321
Попробуй считать блок данных из потока, не используя обычный указатель.
>>1080259
Это нормально, а >>1080248 - нет.
>>1080272
>Непрерывность строки гарантируется.
В С++11 и далее.
>>1080311
В С++11 и далее непрерывность строки гарантируется, а в С++17 ещё и неконстантная .data()
>>1080504
До меня только вот только недавно всё это дерьмо допёрло. Объясняю.
Есть ссылки, ссылки могут быть обычные и на конст. Комитет решил, что обычные ссылки ссылаться на временные значения не могут, так программисты будут ошибаться, думая, что значение, переданное по обычной ссылке будет использовано. Поэтому комитет сказал, что передавать временные значения по обычной ссылке нельзя, а по ссылке на конст - можно (и при этом деструктор откладывается до момента выхода функции, в которую по ссылке на конст было передано временное значение).
Охуеть, конечно. Потом комитет догадался до того, что иногда может быть плохо с точки зрения производительности НЕ изменять временное значение, так как в нём могут быть ресурсы (в широком смысле слова: память, дескрипторы, некопируемые объекты), которые можно и нужно использовать заново, и комитету пришлось ввести rvalue-ссылки (&&), которые такие же, как const &-ссылки, но позволяют менять объект. При этом есть соглашение о том, что объект, принятый по &&-ссылке, не должен вызывать ошибок после изменения, то есть, использовать его нужно правильно, а не "хуй с ним всё равно сдохнет". Соответственно, если есть две функции - f (const X& x) и f(X&& x), то, по принятому соглашению, обе они используют x, как входной параметр, и к тому же вторая функция может оставить объект пустым. std::move - это ТОЛЬКО преобразование любой ссылки не на конст в rvalue-ссылку, то есть, с помощью этой функции ты говоришь "ресурсы этого объекта можно заюзать", и вызывается более подходящая перегрузка функции.
Охуеть, стало лучше. Теперь появилась другая проблема - есть шаблоны, и шаблонным функциям иногда похуй на то, что они принимают, им всего лишь нужно передать аргумент дальше по цепочке без изменений, но если они принимают ссылку только одного типа, то для вложенных вызовов функций теряется информация о том, что ресурсы можно забрать.
Для этого ввели понятие "reference collapsing", которое означает, что если у тебя есть
template<typename T>
void f(T&& t) {
}
то у этого тимплейта будет два инстанса - в одном инстансе будет T&& t, а в другом инстансе будет T& t, и эти инстансы будут выбираться в соответствии с переданным аргументом. Но и здесь тоже возникает проблема: rvalue-ссылка прозрачна, и когда ты используешь ссылку, ты в 99,9999% случаев используешь объект, и тебе не видно, что объект этот - объект, ссылка или rvalue-ссылка. Чтобы решить эту проблему, ввели std::forward. который делает то же самое, что и std::move, но только тогда, когда тип аргумента - rvalue-ссылка.
Вот теперь заживём, блядь.
Внимательно прочитай статью на MSDN и узнай из неё, что должно быть в IP.
>>1079960
Ясен хуй, либо твоё компилятор не поддерживает новый стандарт драфт, либо нужный номер стандарта не указал.
>>1080188
Это ты в С++-треде спрашиваешь про интуитивную понятность?
>>1080254 >>1080321
Попробуй считать блок данных из потока, не используя обычный указатель.
>>1080259
Это нормально, а >>1080248 - нет.
>>1080272
>Непрерывность строки гарантируется.
В С++11 и далее.
>>1080311
В С++11 и далее непрерывность строки гарантируется, а в С++17 ещё и неконстантная .data()
>>1080504
До меня только вот только недавно всё это дерьмо допёрло. Объясняю.
Есть ссылки, ссылки могут быть обычные и на конст. Комитет решил, что обычные ссылки ссылаться на временные значения не могут, так программисты будут ошибаться, думая, что значение, переданное по обычной ссылке будет использовано. Поэтому комитет сказал, что передавать временные значения по обычной ссылке нельзя, а по ссылке на конст - можно (и при этом деструктор откладывается до момента выхода функции, в которую по ссылке на конст было передано временное значение).
Охуеть, конечно. Потом комитет догадался до того, что иногда может быть плохо с точки зрения производительности НЕ изменять временное значение, так как в нём могут быть ресурсы (в широком смысле слова: память, дескрипторы, некопируемые объекты), которые можно и нужно использовать заново, и комитету пришлось ввести rvalue-ссылки (&&), которые такие же, как const &-ссылки, но позволяют менять объект. При этом есть соглашение о том, что объект, принятый по &&-ссылке, не должен вызывать ошибок после изменения, то есть, использовать его нужно правильно, а не "хуй с ним всё равно сдохнет". Соответственно, если есть две функции - f (const X& x) и f(X&& x), то, по принятому соглашению, обе они используют x, как входной параметр, и к тому же вторая функция может оставить объект пустым. std::move - это ТОЛЬКО преобразование любой ссылки не на конст в rvalue-ссылку, то есть, с помощью этой функции ты говоришь "ресурсы этого объекта можно заюзать", и вызывается более подходящая перегрузка функции.
Охуеть, стало лучше. Теперь появилась другая проблема - есть шаблоны, и шаблонным функциям иногда похуй на то, что они принимают, им всего лишь нужно передать аргумент дальше по цепочке без изменений, но если они принимают ссылку только одного типа, то для вложенных вызовов функций теряется информация о том, что ресурсы можно забрать.
Для этого ввели понятие "reference collapsing", которое означает, что если у тебя есть
template<typename T>
void f(T&& t) {
}
то у этого тимплейта будет два инстанса - в одном инстансе будет T&& t, а в другом инстансе будет T& t, и эти инстансы будут выбираться в соответствии с переданным аргументом. Но и здесь тоже возникает проблема: rvalue-ссылка прозрачна, и когда ты используешь ссылку, ты в 99,9999% случаев используешь объект, и тебе не видно, что объект этот - объект, ссылка или rvalue-ссылка. Чтобы решить эту проблему, ввели std::forward. который делает то же самое, что и std::move, но только тогда, когда тип аргумента - rvalue-ссылка.
Вот теперь заживём, блядь.
>Внимательно прочитай статью на MSDN и узнай из неё, что должно быть в IP
У меня всё по канонам.
IPAddr IP = inet_addr(xxx.xxx.xxx.xxx");
const struct hostent hn = new hostent;
hn = gethostbyaddr((char)&IP, 16, AF_INET);
Я же сказал, что код не работает только в winapi-программе
>>Непрерывность строки гарантируется.
>В С++11 и далее.
Спасибо, я в курсе. Очевидные вещи про версию стандарта просто не стал писать.
>std::move - это ТОЛЬКО преобразование любой ссылки не на конст в rvalue-ссылку
std::move это преобразование value category, а не типа. Читать, например, Мейерса нужно внимательно. Нет, ВНИМАТЕЛЬНО:
> Thus, std::move casts its argument to an rvalue, and that’s all it does.
Написано, что casts to an rvalue, а не casts to an rvalue reference.
> Для этого ввели понятие "reference collapsing"
Правило reference collapsing ввели вместе с появлением самих ссылок, ещё в C++98.
В C++11 просто дополнили правила коллапсинга для rvalue-ссылок и ввели специальное правило вывода типа шаблонной функции T, у которой тип аргумента указан как T&&. perfect forwarding работает в первую очередь благодаря этому правилу, а reference collapsing там на втором месте.
Какой-то ты ебанутый. У тебя память течёт, так как сначала ты создаёшь hostent, а потом просериваешь указатель на него.
Ебись с этими винапями сам, меня эти ебанутые винапи заебали. Отличий между консольным и WinAPI-кодом не знаю, та мне какую-то дичь впариваешь, консольная программа в блядовизуалке - это тоже WinAPI.
До этого я не выделял память, так что не из-за этого
Навскидку - не та ширина чара?
На стэковерфлоу такой коммент:
This is not an issue with having or not having an Internet connection. There is no guarantee that gethostbyname() can always resolve the hostname reported by gethostname() into an IP address on all platforms. So don't even try it, it is the wrong approach anyway. Use getifaddrs() or similar function instead.
Он пишет в никуда - создал один объект (char), а указатель использует так, как будто объектов дохуя. Очевидный UB (по правилам использования указателей, не указывающих на созданные объекты). Что лежит в динамической памяти после ОДНОГО созданного char - лишь аллаху известно. >>1080250 - ненормально потому, что гарантий непрерывности строки до C++11 не было, и теоретически строка может быть сегментирована, и оператор[] эту сегментацию прячет только тогда, когда ты его применяешь к самой строке.
Без задней мысли.
>Как реализовать поиск наиболее часто повторяющегося элемента в массиве?
Что нибудь слышал о map?
А что там от GUI нужно? Зависит от сложности самого интерфейса.
Думаю Qt тебе подойдёт. Накидаешь там кнопок в форму и забудешь как страшный сон
.lib - это много уже скомпилированных в объектный файл .cpp-шников
Что такое "построить график"? Вывести в память массив байт-пикселей для заданной функции - запросто.
>>1080710
А точнее - unordered_map.
>>1080996
https://www.gnu.org/software/libc/manual/html_node/Getopt.html
https://www.gnu.org/software/libc/manual/html_node/Parsing-Program-Arguments.html
В .h у тебя должны храниться только прототипы того, что ты хочешь использовать. А вся их реализация хранится в cpp. Но для того, чтобы каждый раз не транслировать твой cpp в объектный код. Придумали lib. Статическая библиотека. По сути это просто тот же cpp только в объектом коде.
Т.е. lib это предварительно скомпилированный cpp?
Алсо, вопрос, в доках по сборке libcurl есть 2 варианта сборки: static и dll. В чем разница и какой выбрать?
Статический и динамический же.
Первый жирнее, но если ты передашь его на другой компьютер с той же архитектурой и операционной системой, он запустится.
Второй меньше. Но если ты передаешь его на другой комплуктер, а Vasyan_laba.dll передать забудешь, ничего не заработает. С другой стороны, зачем тебе статик, если ты ссылаешься, например, на директиксовую (или еще какуюраспространенную) библиотечку?
Уженешкольник
Вопрос от дилетанта, кресты давно не практикую, современные стандарты так не трогал вообще толком.
Берешь FSM генератор типа ragel ну или bison. .Забиваешь туда свою грамматику.
.Генируриешь парсер.
.Встраиваешь его в свою программу.
.Получаешь распарсенные аргементы.
.PROFIT???
Петушков с бустом не слушай, вообще лучше ничего из буста не используй никогда.
>Ясен хуй, либо твоё компилятор не поддерживает новый стандарт драфт, либо нужный номер стандарта не указал.
Оказывается есть в visual studio переключалка на крайний драфт ISO C++ Latest Draft Standard (/std:c++latest). Но это все равно не помогло, майки тормозят.
В чем разница между c++17 и Latest Draft? Второй это уже добавление фич из c++20?
>Т.е. lib это предварительно скомпилированный cpp?
Нет. lib - это архив с объектными файлами (.o или как оно там у вендозных) и ещё чем-то. Когда ты компилируешь файл, ты получаешь объектный файл.
>какой выбрать?
Любой.
>>1081063
>Неужели нельзя без этого?
Ты ещё спроси: "неужели нельзя без шаблонов". Можно, но тогда STL не сможет существовать.
>>1081066
>В чем разница между c++17 и Latest Draft?
НЕЕБУ.
> Опять это ебучее метапрограммирование, костыли на костыли. Неужели нельзя без этого?
В каком месте это костыли? Очень удобная штука, если разберешься.
Что в этом страшного?:
Символьные литералы UTF-8
Удаление некоторых устаревших типов и функций, например, таких как std::auto_ptr, std::random_shuffle или старых функциональных адаптеров
Библиотека файловой системы, основанная на boost::filesystem
Параллельные версии алгоритмов STL
Некоторые математические функции
Если серьёзно, то class wizard реально не создаёт автоматически шапки дл конструктора, деструктора, прагма уанс итд
Это всё в VS17,
у меня одного так ?
Если серьёзно, то таки напиши им в багтрекер. Может они и предполагают такое поведение.
>не создаёт автоматически шапки дл конструктора, деструктора
Еще бы возможность галочками отмечать требуемые функции. И чтоб с семантиками копирования/перемещения.
Тащемта я и спрашиваю где об этом можно почитать
Походу у одного. У меня на VS17 всё перечисленное создаётся само. Ты добавляешь класс к проекту, или создаёшь отдельно?
А да, в этом проблема, спасибо
Ну ты и васян. Это ты с winAPI сокетами ебался в ньюфаг треде?
Хз. Как восстановить.
https://github.com/stuta/Luajit-Tcp-Server/blob/master/c_include/windows/original/ws2def.h
Посмотри это то?
Это копия, сохраненная 15 ноября 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.