Этого треда уже нет.
Это копия, сохраненная 15 ноября 2017 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
#2 #1074846
Вкатился!
757 Кб, 2160x2160
#3 #1074849
Вкатился, освятил тред рабочей станцией HP.
#4 #1074853
>>1074849
Никогда не понимал, нахуй позировать лезть, если у тебя нога в шрамах и с синяками.
#5 #1074864
>>1074841 (OP)
С++ раздутое говно для ООП макак.
Настоящие хакеры пишут на С.
#6 #1074882
>>1074864
Проорал с хакира.
Ассемблеро боярин.
#7 #1074887
>>1074882
Неженка!
Пишу в байткодах с помощью cat
#8 #1074894
>>1074887
пишу сразу байткодом.
0010101011101010001010101110101000101010111010100010101011101010001010101110101000101010111010100010101011101010001010101110101000101010111010100010101011101010001010101110101000101010111010100010101011101010001010101110101000101010111010100010101011101010 пидоры.
#9 #1074898
>>1074894
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
#9 #1074898
>>1074894
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
#10 #1074899
>>1074894
>>1074898
Больше похоже на ASCII. Кого ты тут наебать пытаешься?
#11 #1074909
>>1074898
Но она мертва.
#12 #1074915
>>1074909
01001001 00100000 01101011 01101110 01101111 01110111 00111010 00110011
#13 #1074930
>>1074915

>:3


Смайлоёб.
#14 #1075011
Сап, анон. Я вот чего не понимаю. В C++ нет никаких инструментов для работы с массивами? Какого, блядь, хуя? Как он вообще живет? Не удалить, не вставить, ну охуеть.
#15 #1075018
>>1075011
Блядь, создай. Но вообще только плюс. Вон в JS ввели, так эти дауны вообще всё через массив ебашут. Даже фронт, даже бэй, даже БД, Даже сокеты, даже небо блядь!
#16 #1075019
>>1075018
Как что-то плохое, блядь. Зачем ездить на велосипеде, если есть автомобиль?
#17 #1075023
>>1075019
Зачем ездить на велосипеде, если есть массив ты хотел сказать?
Алсо в крестах как я понял вектор то и есть тот же самый массив судя по всему.
#18 #1075024
>>1075011
Вообще-то ни один язык не умеет "работать с массивами", а то, что называют массивами в других языках -- vector в c++ (изменяй как хочешь), ну или связный список.
#19 #1075044
>>1075019

>Как что-то плохое, блядь. Зачем ездить на велосипеде, если есть автомобиль?


Ага, а потом возникают такие ФРАКТАЛЫ
http://php.net/manual/en/array.sorting.php
В плюсах нормально зделано, есть набор разных структур данных с понятными предназначениями и алгоритмами.
#20 #1075052
>>1074853
когда на глазу фофан и муж-алкаш заставляет позировать, деваться больше некуда

теперь это алкашей тред
#21 #1075062
>>1074853
Вот доебался, там одна мозоль и один синячок. А фотка хорошая вышла. Лучше посмотри на эту прекрасную рабочую станцию.
>>1074849
#22 #1075084
>>1075011
std::vector
1 Мб, 1034x1397
#23 #1075099
Играли сегодня в пикрелейтед. Суть в том, что нужно соврешить еще 5 действий, чтобы в итоге получился ноль. Снизу уже есть две подсказки. Нужно начать с единицы и плюса. Или с пятерки. Выбираю вариант с единицей. Это значит, что пятерку трогать нельзя. Так что следующие возможные варианты : +7 или +2. Дальше либо -7, -3, +3, +3, +3, +2, +4, либо -2, -3, +3, +3, +3, +2, +4, x3, x2. Каждый вариант порождает еще больше вариантов. Сначала подумал, что легко такое реализовать, чтобы программка нашла все пути, по которым приходим к нулю (их несколько). Но теперь задумался и даже примерно не представляю, как это сделать. Есть идеи?
#24 #1075103
>>1075011
Не понял что ты имеешь ввиду?
Статические массивы? int a[32];
Динамические массивы? std::vector, std::list

Ты о чем вообще?
#25 #1075140
>>1075099

>Так что следующие возможные варианты : +7 или +2.


Можно только со второй строки брать? А потом только с третьей?
420 Кб, 1034x1397
#26 #1075141
>>1075140
Нет, двигаться можно по вертикали, горизонтали и диагонали ЧИСЛО-ЗНАК-ЧИСЛО. Пример на пикреле.
423 Кб, 1034x1397
#27 #1075143
>>1075141
Один из способов прийти к нулю
#28 #1075144
>>1075141
И наверх/назад нельзя?
#29 #1075145
>>1075144
Можно. Но те знаки и числа, которые использовал, использовать повторно нельзя.
#30 #1075147
>>1075099
На таких размерах можно сделать перебором, но пахнет ПОЛНОТОЙ
#31 #1075149
>>1075147

>ПОЛНОТОЙ


ну хоть где-то матан пригодится
#32 #1075164
>>1075099
Числа только однозначные?
#33 #1075175
>>1075145
Самопересекаться?
#34 #1075190
>>1075099
Строишь дерево и обходишь его в глубину.
#35 #1075287
>>1075044
Ну не, там всё-таки в всоё время была фича в работе с бд и всё это было полезно.
#36 #1075307
2ch, подскажи, неявное преобразование производного класса в базовый происходит альтернативно тому что делает dynamic_cast? Пример:

A a = new B; // Неявное преобразование
A
a = dynamic_cast<A*>(new B); // Явное преобразование
#37 #1075308
>>1075099

> Выбираю вариант с единицей. Это значит, что пятерку трогать нельзя.


Хули нельзя, ты сказал
>>1075141

>двигаться можно по вертикали, горизонтали и диагонали


И
>>1075145

> те знаки и числа, которые использовал, использовать повторно нельзя



Если я начал с единицы, я не использовал 5!
#38 #1075310
>>1075099
На тебе решения, начинающиейся с "1+" http://termbin.com/4szs
Проверяй на соответствие правилам, которые ты всё никак не можешь нормально описать
#40 #1075329
>>1075011

> В C++ нет никаких инструментов для работы с массивами? Какого, блядь, хуя?


array
vector
list
deque
ассоциативный map
range for
куча всяких прикладных функций типа apply, sort
Что ещё хочешь?
>>1075307
Правильность первой строки проверит компилятор - если A - предок Б, то программа скомпилируется.
Во второй строке правильность проверит собранная программа во время исполнения (динамик каст вернёт нуллптр, если А - не предок Б).
Когда тебе известны оба типа - тип указателя и тип объекта, на который ты хочешь его направить - логично использовать только первый вариант, тогда ошибка будет выявлена компилятором.
Только если ты присваиваешь одному указателю другой указатель на объект с неизвестным типом, ты должен использовать dynamic_cast.
#41 #1075334
Почему в С++ такой странный code style? Понимаю, что у С++ одно из самых старейших легаси, свои традиции и привычки, но почему повсюду (даже в учебных примерах) пишут такой нечитабельный вырвиглазный код?

void f() const
{
std::cout << m_x << '\n';
}
#42 #1075335
>>1075334
И что тут странного? По мне так то что ты привёл в пример это самое читабельное и понятное что может быть в C++, ты нечитабельное и вырвиглазное не видел.
#43 #1075336
>>1075334
Из code style тут только первая фигурная скобка перенесена да префикс m_ указывающий на поле класса. В остальном это язык, а не стиль. Однобуквенные имена для примеров это нормально.
#44 #1075338
>>1075334
Как тебе такое?

#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;
}
#44 #1075338
>>1075334
Как тебе такое?

#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;
}
#45 #1075339
>>1075338
Нихуя не понял, что тут происходит?
24 Кб, 1093x660
#46 #1075352
>>1074841 (OP)
Вкатываюсь в многопоточность. За 5 минут на коленке собрал говнокод для суммирования последовательных чисел, чтобы просто проверить реально ли загружается несколько ядер. Запускается, работает, реально грузится 4 потока, но результат почему-то каждый раз разный как будто join() не работает или я х.з. что еще. Так что не так с этим говном?
#47 #1075356
>>1075334
Потому что сам синтаксис языка такой. На С++ очень сложно, писать что-то читабельное и понятное, особенно новичкам и мидлам и зачастую тимлидам. Те кто могут использовать понятный code style в С++ это элита, но для этого надо очень хорошо знать язык и что испрользовать в языке а что нет. Например использовать очень ограниченно шаблоны, не использовать такие библиотеки типа boost, а лучше и без stl.
Вот, например, нормальные люди, кто пишет на С++ что-то посерьезней серверов у конторе у дяди коли, используют такие штуки как misra c++, embedded c++, rt c++ и т.д.
https://en.wikipedia.org/wiki/Embedded_C++
#48 #1075361
>>1075356
Все так, только код с умеренным бустом, стл и шаблонами будет читаемее, чем очередная итерация вложенных циклов на "си с классами".
#49 #1075371
>>1075361
Ну про буст я очень сомневаюсь, ибо на деле знаю что это такое. Стл можно впринципе использовать более менее, но опять же не все подряд и с умом, но это чревато, например чтобы использовать итераторы, которые сами по себе не очень хорошая вещь 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();
поэтому авто тоже не стоит использовать, но понятно что использовать шаблонные телеги типа как в премере выше тоже не вариант, поэтому люди часто вообще отказываются от них, ибо как только ты начинаешь что-то использовать из С++, то сразу тянется куча зависимых костылей языка, для того, чтобы это работало и выглядело нормально.
#50 #1075373
Слышь, бустеры, вместо того чтобы рассказывать кто больше знает умных слов, лучше на деле покажыте какой длины ваши стл, объяснив нюфане, что не так с его говном >>1075352
#51 #1075381
>>1075371

>использование auto скрывает тип


Проблема IDE.
#52 #1075383
>>1075373
case 1: A1 = s; // <- break;
case 2: B1 = s;
Угадай, что будет, если 1 отработает позже 2.
#53 #1075387
>>1075373
Алсо, что будет если ввести k = 3?
A = B = C = D = 0
k = 7?
A = 1, B = 2, C = 3, D = 4
Не очень похоже на "сумму от 0 до k", верно?
#54 #1075389
>>1075352
A1, B1... не надо помечать как volatile?
#55 #1075393
>>1075381
При чем здесь вообще IDE?
Я говорю про синтаксис языка, который должен быть чистым и понятным, даже если он отображается в терминале 20х60 без подсветки синтаксиса.
#56 #1075395
>>1075383
И чо? Разные потоки же.
#57 #1075396
>>1075387
А зачем мне вводить k = 3, если я могу ввести k = 12? Вопрос был про то почему многопоточность не срабатывает, а не про защиту от дурака.
#58 #1075397
>>1075393
Не надо давать уебанские названия переменным и функциям. Программисту в 95% случаях надо понимать смысл происходящего, поэтому там будет не myobject.get(), а auto c = car.get(); c.turnLeft();. Все что надо знать, что у car есть get, а у полученного типа есть turnLeft. В остальных 5% случаев в IDE наведет мышку и посмотрит, какой конкретно тип.
И конечно не надо писать код в терминале.
#59 #1075398
>>1075395
Ты школьник? Извини, что уточняю.
У тебя незакрытый кейс в свитче. И потоки разные, а переменные общие, это и есть гонка потоков.
Допустим, второй поток отработал раньше. Он прыгает на case 2 и записывает B1. После чего отрабатывает первый поток. Он прыгает на case 1 и записывает A1 после чего идет дальше по кейсам и перезаписывает B1 этим же числом.
>>1075396
Так ты не делишь последовательность на 4 равных доли, если ты введешь 999 до отработает только до 996.
#60 #1075399
>>1075389
Ну это вообще пиздец какая-то экзотика этот volatile. Там и так нечего в этих переменных оптимизировать. Ни в каких проверках они не участвуют. В каждую пишет только свой поток. На всякий случай проверил с volatile - не изменилось ничего.
#61 #1075402
>>1075352
pastebin.com - пихни сюда, чотбы я не набирал заново.
#62 #1075403
>>1075398
Ты похоже еще более бесполезен, чем я.

1) Первый поток может записать только в переменную А1, потому что при вызове в функцию schet() бай дизайн передается num = 1. Второй поток может писать только в В1 и так далее. Нет там никаких гонок. Это разные кейсы, срабатывающие в разных котоках, в каждом свой.

2) А я не ввожу 999, я ввожу 996. Проблемы?
#63 #1075404
>>1075403

>Второй поток может писать только в В1 и так далее.


>Нет break; в конце case


Дебилам не помогаю.
#64 #1075405
>>1075397

>Не надо давать уебанские названия переменным и функциям


Это уже называется code style, который строится и зависит от базовых вещей в языке.
Тем более, что меняется от того что ты изменил название переменной в auto c = car.get() ?
Что за тип c? Это поинтер? Это ссылка? Или это копирование? Если копирование то как? Использует ли он COW или копирует весь объект побитово? Перегружен ли там оператор =?
Такой код сразу вызывает пачку вопросов и непонятков.
Если еще васяны пихают авто куда не попадя, дают методам и переменным невнятные имена, то такой код становится не поддающимся расшифровке, который можно смело выкидывать в помойку, ибо сам васян скорее всего забудет что там происходит через пару недель.
#65 #1075406
#66 #1075407
>>1075405

>Что за тип c? Это поинтер? Это ссылка?


Какая разница? В IDE автокомплит подставит . или ->

>Или это копирование?


Не надо по уебански называть копирование гет-ом.

>Перегружен ли там оператор =?


Какая разница, если ты потом все равно какой то метод вызываешь.
#67 #1075411
>>1075407

>Какая разница


>IDE подставит


>Какая разница


Мда, вот оно уже сейчас, поколение быдло-кодеров.
#68 #1075415
>>1075404
Бля, сук, точно. Никогда не любил этот ебаный кейс. А ты не так уж плох, как кажешься на первый взгляд. Ладно, спасибо, бустите дальше.
#69 #1075418
>>1075411
Чушь не неси, а лучше посмотри какие нибудь слайды с CppCon14-17, никто не пишет std::map<std::wstring, std::map<std::wstring, int>>::iterator когда тебе нахер не сдалось знать, что конкретно там за тип, а тебе просто надо пройтись по нему фор-ичем, то достаточно просто auto и код становится читаемей и понятней, а не наоборот.
#70 #1075422
>>1075418
Да че мне эти слайды смотреть, я все равно на с++ уже больше года не пишу и не хочу писать, ибо с++11 был последний гвоздь в крышку гроба.
Так как я по такой залупе вор ичем пройдусь если я даже не знаю что там внутри потмоу что там какая нибудь залупа типа
template<typename T>
void foo(T& val)
{
auto it = val.begin();
...
}

И как мне быть понять, что там за хуйня вообще происходит? И такого говна в с++ проектах обычно навалом.
#71 #1075424
>>1075422
Проще взять какой-нибудь нормальный язык у которого все эти вещи из коробки и встроены в дизайн, а не как костылями все в с++.
#72 #1075429
>>1075422
И что твой пример изображает? Работаешь с полученным итератором как с любым другим.
#73 #1075431
Ушел с c++ в бигдату, хайлоад на джаве, теперь все как у людей, просыпаюсь с приятным предвкушением о хорошем рабочем дне. Чего и вам советую

бывший революционный оп
#74 #1075436
>>1075431
Я вот тоже год назад стоял на развилке путей, думал тоже пойти в хайлод, чем я в принципе на с++ занимался, только на яве или scala, ибо доебало это говно в с++ с костылями. Но в итоге решил вкатиться в С и более системное программирование поближе к ядру ОС. Но теперь я бы ни за что не стал бы явистом ибо понимаю какое это дно похуже с++, с кучей макак вкатывальщиков из /b/. А на С в основном пишут крутые парни и обезьян и смузихлебов там вообще нету, ибо не модно и сложно. В общем, мне все нравится.
#75 #1075468
>>1075371

>но использование auto скрывает тип и делает код непонятным аля


>auto v = myobject.get();


.get гетает что именно? У большинства STL-функций имена с подсказками, а твой геттер что гетает?

Минус авто только в том, что я не могу его авточлен сделать. Гусары, молчать!
#76 #1075477
>>1075468

>Минус авто только в том, что я не могу его авточлен сделать.


В прошлом треде ради лулзов соорудил нечто подобное:

template<class T> class Zalupa {
T value;
public:
T get() { return value; }
};
Zalupa<int> lupa;

class A {
decltype(lupa.get()) a = 1;
};
#77 #1075491
>>1075477
Мне тут уже подсказали.
vector<int> V;
decltype(V)::iterator;
#78 #1075533
PWORD list;
PIMAGE_BASE_RELOCATION pIBR;

list=(PWORD)(pIBR+1);

Поясните нуфагу, что это за плюс один? Что будет в list?
#79 #1075534
>>1075533
Не буду гуглить за тебя, что такой IMAGE_BASE_RELOCATION.
#81 #1075544
>>1074841 (OP)
Объясните, в почему имена структур и типов не мешают друг другу. В каких неймспейсах они находятся? https://ideone.com/5CJXAs

В моем коде при помощи структуры с тэгом complex объявляется тип complex.

Что такое complex в объявлении конструктора?
complex(double re, double im)
: re(re), im(im) {}
Тип или структура?

Что такое complex в объявлении методов?
void complex::swap(complex & other
#82 #1075546
>>1075537
pIBR+1 - это указатель на следующую в памяти структуру IMAGE_BASE_RELOCATION.
(PWORD) - это преобразование полученного указателя к указателю на WORD (который джва байта, вроде).

То есть, ты получишь указатель на первые два байта следующей структуры IMAGE_BASE_RELOCATION. Какому наркоману это понадобилось - не знаю.

Про касты можешь прочитать здесь: http://en.cppreference.com/w/cpp/language/explicit_cast
#83 #1075548
>>1075546
То есть, на псевдокоде это будет
list=(PWORD) pIBR+sizeof(IMAGE_BASE_RELOCATION);
так?
Если да, то мне все понятно, спасибо.
#84 #1075553
>>1075544
Двоеточие - это предлог "в" (только порядок другой). Какждый класс - это простанство имён, к членам которого ты можешь обратиться только через операторы ".", "->" и "::".
class T {
T(){}
}
- это конструктор.

class T {
T();
}

T::T (){}

- это объявление конструктора и объявление его снаружи.

T T::operator=(T rhs){}

- это оператор присвоения, определённый в классе T, принимающий T и возвращающий T.

>>1075548
Грубо говоря - да.
#85 #1075554
>>1075544
Пофиг же, не? Это как написать typedef int int. Алсо структура это тоже тип.
#86 #1075555
>>1075553
Заговорился.

>- это объявление конструктора и ОПРЕДЕЛЕНИЕ его снаружи.


>- это ОПРЕДЕЛЕНИЕ оператора присвоения, ОБЪЯВЛЕННОГО в классе T, принимающего T и возвращающего T.

#87 #1075558
>>1075546

>Какому наркоману это понадобилось - не знаю.


После этой структуры идет массив вордов неопределенной длины. Если вдруг тебе интересно.
#88 #1075561
>>1075548

>То есть, на псевдокоде это будет


>list=(PWORD) pIBR+sizeof(IMAGE_BASE_RELOCATION);


>так?


Что такое "на псевдокоде"? Арифметика указателей такая же, как в C++? Тогда не так.
#89 #1075562
>>1075554

>Пофиг же, не? Это как написать typedef int int


Тогда зачем нужна идиома typedef struct?
#90 #1075564
>>1075389

>A1, B1... не надо помечать как volatile?


Если ты не дебил — нет.
#91 #1075565
>>1075561
Если честно я не ебу какая там арифметика. Я хотел сказать что к адресу pIBR прибавляется размер этой структуры, и мы получаем указатель та следующую структуру, как если бы они шли подряд.
#92 #1075566
>>1075565

>Я хотел сказать что к адресу pIBR прибавляется размер этой структуры


Тогда пиши
(char*) pIBR+sizeof(IMAGE_BASE_RELOCATION);
#93 #1075572
>>1075352

>Так что не так с этим говном?


От скольки до скольки складываешь?
#94 #1075573
>>1075352
А, уже увидел, что проблема в case и что её тут решили.

А volatile не добавляй.
#95 #1075576
>>1075562
Это про плюсы тред, а не про Си.
#96 #1075607
>>1075356

>embedded c++


Зашёл по твоей ссылке, вначале воодушевился, а потом дичь пошла.

> The following language features have been removed:


> <...>


> Exceptions


Серьёзно? Выкинуть исключения? Это просто гениальное "упрощение"

> Templates


Теперь надо под каждый пердёж создавать свой отдельный контейнер? И без смартпоинтеров?
По ссылкам всё мертво, по ссылкам 404, сами ссылки десятилетней давности...
#97 #1075610
>>1075352
Че-то какой-то говнокод пиздец.
Во-первых, убери всю эту хуйню с глобальными переменными.
Короче вот пример от профи.

https://pastebin.com/mZfwhfj9
26 Кб, 755x229
#98 #1075623
>>1075610

>пример от профи.


if(threads == -1)
threads = std::thread::hardware_concurrency();
Очень надёжно! Профи видно сразу!
30 Кб, 677x342
#99 #1075624
>>1075610

>vector


>chrono


>mutex


Ну у меня же не было задачи использовать как можно больше библиотек и контейнеров. Я просто хотел посмотреть реально ли работает этот thread и на сколько быстрее с ним идет вычисление, а то во всех обучалках одно говно какое-то с выводом сообщений в двух потоках, когда реально хуй поймешь параллельно они по факту выполняются или нет.
#100 #1075625
>>1075623
Ты шо ебонутый? Давай в програмке на коленке рандом хую с двача, все возможные кейсы очень маловероятных ошибок прорабатывать.
#101 #1075626
>>1075625
Зачем вообще в parallel_sum что-то проверять? Скажи, что число потоков должно быть от 1. И пусть вызывающий передаёт правильное число, используя /dev/random или hardware_concurrency() и обрабатывая случай нуля как хочет.
#102 #1075628
>>1075610
Ну и вообще, у тебя во все треды прилетает одинаковый int* res.
#103 #1075629
>>1075610

> THREASHOLD


С engrish тоже в голос.
#104 #1075631
>>1075607
Исключения выкинуты, т.к. лишний код, занимает и байты, и время исполнения, причем сами исключения возникают в 0,001%, а код этот работает постоянно. На встройке это критично. С шаблонами похожая проблема, ты напишешь один раз а компилятор его 100 раз размножит для разных типов, и программа опять не влезет никуда.
#105 #1075634
>>1075624
А зря. Хроно это маст хэв, вектор тем более.
#106 #1075635
>>1075626
Так там число потоков опциональный аргумент, и если он опущен, то в функцию передается -1 и вызывается hardware_concurrency() Я думаю не существует имплементаций где он может вернуть 0. Конечно если у него линукс, можно было вызвать get_nprocs(), но у него то винда.

>>1075624
Использовал только самое необходимое.
vector - чтоб динамически алокейтить место под массив.
chrono - перформанс таймер.
mutex - чтоб отпечатать нормально в потоках.

Вообще, конечно создавать потоки на лету, плохая идея в реальной жизни так никто не делает, ибо это оверхед большой. Обычно, потоки создаются один раз и потом используются.
#107 #1075638
>>1075635

>Так там число потоков опциональный аргумент, и если он опущен, то в функцию передается -1


Чёт не вижу, что там есть значение по-умолчанию.
#108 #1075639
>>1075628
Да тут обосрался. Надо атомарным его сделать.

>>1075629
лол, нашел до чег доебаться.
#109 #1075640
>>1075638
Так
int threads = -1;
в main
#110 #1075641
>>1075610

>Короче вот пример от профи.


Ой-вей. Ты сначала зачем-то заполняешь числами массив, а потом суммируешь его.
Просто 13/10.
#111 #1075642
>>1075640
Рассказываю "профи", что такое "опциональный аргумент":
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()
#112 #1075643
>>1075641
Лол. Ты вообще читал, пост а который я ответил? Я лишь переделал программу автора, где он разбирается в потоках.
#113 #1075644
>>1075643
Читал. Там вроде просто числа суммиоровались, которые генерируются при суммировании.
А зачем их сначала писать в массив, а потом читать оттуда?
#114 #1075645
>>1075642
Бля, а как ты будешь вызывать функцию эту, если аргумент приходит из командной строки?
#115 #1075646
>>1075644

>числа суммиоровались, которые генерируются при суммировании


Это как?
#116 #1075648
>>1075646
https://pastebin.com/BEcj176w строка 12
А твоё однопоточное заполнение массива занимает в несколько раз больше времени, чем, собственно, суммирование.
#117 #1075649
>>1075648
Ну ты пиздец. Смысл программы в функции parallel_sum а не в том что происходит до.
#118 #1075654
>>1075649
Смысл программы в многопоточном суммировании последовательных чисел.
А не в том, как сделать это как можно тормознее.
#119 #1075656
>>1075654

>Смысл программы в многопоточном суммировании последовательных чисел.


Так она именно это и делает.
#120 #1075657
>>1075656
Она делает как быстрее. А ты — как можно медленнее.
Ты бы ещё в файл сначала записал числа, а потом считывал оттуда.
#121 #1075658
>>1075657
Ты ебанутый? Какая разница откуда числа приходят, когда смысл суммировании массива с числами?
#122 #1075659
>>1075658

>смысл суммировании массива с числами


Последовательности чисел.
#123 #1075660
>>1075654
Тогда надо сразу на шаблонах, чтобы посчиталось в компайл тайме и выдало константу.
#124 #1075661
>>1075660
Кому надо?
#125 #1075662
>>1075659
Для монотонной последовательности не нужны вообще циклы и потоки, это считается одной формулой.
#126 #1075666
>>1075661
Тому, кто топит, что его вариант быстрее других.
42x53
#127 #1075667
>>1075662

>Для монотонной последовательности не нужны вообще циклы и потоки, это считается одной формулой.



Ага. Формулу прикрепляю картинкой.

Или ты имеешь в виду формулу без знаков "сумма" и т.д. (только с элементарными функциями?)? Готов для любой монотонной последовательности предъявить формулу суммы начального отрезка этой последовательности?
#128 #1075668
>>1075631
Ты уж согласись тогда, что это не с читаемостью кода связано, а с ограничениями железа.
4 Кб, 152x40
#129 #1075671
>>1075667
Она же простая.
#130 #1075672
>>1075671
Ты, видимо, не в курсе, что такое монотонная последовательность.
#131 #1075676
>>1075624

>и на сколько быстрее с ним идет вычисление


Ты вообще ослоёб? Если тебе быстро сложить надо, делай примерно так:
std::vector x;
// Fill x
auto result = cblas_dsum(x.size(), x.data(), 1);
cblas_dsum замени на функцию из твоей любимой математической библиотеки.
#132 #1075679
>>1075672
А, да, с прогрессией перепутал.
#133 #1075680
Посоны, есть ли какая-то возможность получать стектрейсы в релиз билдах, при условии что для этого билда есть map/pdb файлы?
Меня просто смущает то что по идее ведь если у нас программа состоит из кучи либ, каждая либа будет загружена в рандомное место в адрессспейсе, и как в таком случае привязывается return адресс к чему-то в мапфайле?
#134 #1075682
double x;
for (x = 0.10; x <= 1; x + 0.09)
{ ... }
цикл зацикливается до бесконечности, чому?
#135 #1075683
>>1075682
Потому-что x + 0.09 не увеличивает x
тебе нужно x+=0.09
#136 #1075687
>>1075683
ну я и даун, спасибо
#137 #1075784
При работе с std::cin, можно ли считать его таким же по свойствам, как поток типа std::ifstream, создаваемый по какому-либо файлу?
#139 #1075791
>>1075680
Чем дебуг-версия отличается, по-твоему?

Стектрейсы в релизе? Да запросто, но ты забыл про злоебучие оптимизации, которые могут заинлайнить или перемещать вызовы, при чём не все.
>>1075784
Можно. КРОМЕ того, что:
- в cin может прилететь feof не один раз. Т.е.: читаешь, юзер нажал Ctrl+D (или что там в твоей ОС), прилетел EOF, ты сбрасываешь состояние cin и можешь читать до следующего EOFa. С файлами может быть то же самое, если он не в одной программе открыт, наверное
- производительность cin/cout/... никакующая, если не отключить синхронизацию с stdin/stdout/...
#140 #1075792
>>1075784
А, и ЕЩЁ: cin по-умолчанию текстовый, и изменить это ты можешь только с помощью freopen.
#141 #1075835
>>1075099
Лан, вот тебе код. https://pastebin.com/UTK4PwEs
Там много всего захардкожено, но молодые-шутливые с лёгкостью перепишут так, чтобы исходные данные можно было задавать с помощью конфига на JSON.
Для компиляции нужна header-only однофайловая библиотека exprtk https://github.com/ArashPartow/exprtk

exprtk.hpp весит полтора мегабайта, так что компилится этот код минуту-полторы. Зато работает быстро. Без оптимизаций находит все решения за 0.5 сек, с оптимизациями — за 0.01 сек.
628 Кб, 850x1201
#142 #1075873
>>1074841 (OP)
Про FAQ. Почему Липман, а не Прата или Лафоре? Или, в конце-концов, не Шилдт? Ладно, страус сложный, но щит проще их всех, да и примеры охуительно наглядные. Ну и да, все эти прекрасные книжки не рассказывают о boost, qt и прочем, а об STL - обзорно (для сравнения, тот же Шилдт в книжке о Джаве рассматривает АВТ, Свинг, Сервлеты...). При этом книжки непомерно большие, а хочется чего-то вроде кьюик старт гайда (С++ за 24 часа здорового человека, если проще). Что скажете, что посоветуете? Язык менять не хочется, ибо нужна универсальность и низкое потребление ресурсов. Джава и шарп тянут за собой свои говна, пайтон и жс тянут за собой свои интерпретаторы + они медленные даже для типовых приложений, а все остальные языки на десктопе мало кому всрались, неуниверсально.
#143 #1075885
>>1075873
Если тебе нужно что-то высокопроизводительное, то бери С++. У липпмана одна из самых лучших книг по крестам, остальные - говно, рассчитанное на абсолютных ньюфагов.
А если тебе просто надо делать десктопные приложения, то учи js и electron, сейчас гуи туда движется.
#144 #1075914
>>1075885
Можешь объяснить, почему остальное - говно?
Нет, анон, мне не нужна какая-то особенная производительность, но я хочу
>просто
писать приложения, это правда, но чтобы при этом это были приложения как винамп - охуенный, лучший в истории аудиоплеер с моментально отзывчивым интерфейсом, моментальным же запуском, всем необходимым, и при этом весящий в памяти 3 мегабайта, не пытающийся подтянуть за собой пол-хрома. Или вот как нотпад++ - охуенный, фичастый эдитор текста, (если) уступающий (да и то, за счет плагинов) только всяким эклипсам и сублаймам, но весящий в разы меньше и работающий на порядки быстрее перечисленных. И уж тем более, меньше весящий и быстрее работающий в сравнении с брэкетсами-атомами.жс. Что-то вот такое мне нужно. Я не собираюсь писать браузеры, фотошопы и подобную хуйню, моя цель - маленькие, быстро и просто (да, знаю, это не совсем про цпп) разрабатываемые приложения, которые не только выглядят, но и работают хорошо (без тормозов, без запуска длиной в 20 секунд, без пожирания 200 метров оперативки на хеллоуворлд, без нетфреймворков, электронов и jre). Поэтому я думал в сторону С++ (не хардкорного, база, основа) + Qt или подобный фреймворк. Что скажешь, няша?
#145 #1075921
Подскажите, как в C++98 делали списочную инициализация вектора?
std::vector<int> example{1, 2, 3, 4, 5};
#146 #1075924
>>1075921
Никак. Можешь объявить массив и инициализировать им.
#147 #1075925
>>1075924
Да, я уже понял, жаль мне олдфагов.
#148 #1075936
Надо сделать однообразную замену символов в последовательности, полученной из входного потока.

Но памяти мало, и считывать в вектор, который потом предполагается обработать, не хочется.
Подскажите, получится ли работать с неким входным потоком с помощью std::istream_iterator? Или здесь только решение вида "достать (getchar) символ, если он из тех, что надо заменить, закинуть (putback) во входной поток замененный символ"?

И какое (линейное/постоянное) время может занять unget символа?
#149 #1075943
>>1075925
жаль мне ньюфань в с++. Вангую через лет 5 с++ будет медленее и в 50 раз более громоздким чем та же ява. Ну а потом когда встроят туда JS и электрон прикрутят, вообще будет охуенчик.
#150 #1075947
>>1075943
Ну тебе же ничего не мешает не использовать эти списки инициализации, можешь хоть на голом C писать с ассемблерными вставками в отличии от явы, в чём проблема?
#151 #1075950
>>1075943
>>1075947
И да, списки инициализации наоборот является ускорением, а через 5 лет будет стандарт C++20, в основном что там будет известно уже сейчас, с тебя хуёвая как ванга, так и программист.
helplease #152 #1076036
Короче. Есть окно, которое создано с помощью SFML либы.
Нужно прикрутить к этому окну drag and drop. То есть. У меня на рабочем столе лежит какой нибудь файл. Я его перетаскиваю мышкой в окно и получаю путь к нему. Гуглить пытался. Ничего не нашёл. Вообще как в шиндовс такое сделать?
#153 #1076042
>>1076036
Вот как это делается на Winapi:
https://stackoverflow.com/questions/2263586/how-to-get-path-of-file-dragged-into-win32-app-and-delete-it
Как это делать на SFML я не знаю, у них и спрашивай, раньше я тоже использовал SFML, но бросил его, у меня свой велосипед.
#154 #1076059
#155 #1076061
>>1074841 (OP)
Какой учебник лучше взять ньюфегу. Если что, я оче хорошо понимаю, когда в книге есть упражнения.
В факе рекомендуют эти:
Бьерн СтрауструпПрограммирование. Принципы и практика использования C++
Стэнли Липпман, Жози Лажойе и Барбара МуЯзык программирования C++
Стивен ПратаЯзык программирования C++
#156 #1076064
>>1076042
Эх. Придётся всё таки юзать winAPI. Хорошо что хоть SFML может handle окна и объектов ядра отдавать. А то бы вообще горе было.
#157 #1076067
>>1076059
Школьник, ты тред перепутал, тебе сюда >>1067944 (OP)
#158 #1076069
Страуструп язык программирования с++ самое свежее издание.
Ещё можешь глянуть
https://www.slideshare.net/olvemaudal/deep-c/13-What_will_happen_if_you
И
https://www.slideshare.net/adankevich/c11-15621074
и вообще по 14 стандарту поищи чего там же
#159 #1076085
93 Кб, 695x950
#160 #1076086
>>1076067
Пади падмойся маня
helplease #161 #1076132
>>1076042
https://ideone.com/vbRXUr
Хули оно не драг анд дропается?
#162 #1076141
>>1076132
Короче как я понимаю в чём моя проблема. У созданного sfml окна есть свой обработчик коллбеков. Мне нужно как-то сделать так, чтобы перехваченное сообщение передавалось в функцию обработчик этого окна и в дополнении к этому нужно изменить эту функцию, чтобы она обрабатывала WM_DROPFILES сообщения.
Как сделать-то это?
#163 #1076142
>>1075921
Да никак! Пушили из константного массива.
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
Типа, конст-массив память не занимает, а списки инициализации - занимают. Так надо понять тебя?
#164 #1076144
>>1076141
А всё. Понял. Можно winAPI окно описать, а потом его хендел передать как параметр при создании SFML окна. Типа
sf::RenderWindow SFML_window(winAPI_window);
#165 #1076157
АААА ищу современный годный учебник программирования с Win32 API на C++, чтобы прямо для даунов с примерами кода. Такой существует?
#166 #1076160
>>1076157
Нет, а нахуй надо? И так всё понятно/
#167 #1076163
>>1076157
Есть grey hat, то там python.
#168 #1076192
Двач подскажите книгу по C++ для продвинутых, желательно с уклоном в ООП.
#169 #1076196
>>1076086
Интел ему интринсики дали, а нет, хочу ассемблер жрать. На самом деле я не стараюсь оскорбить тебя, мне просто интересно, много ли смысла писать на ассемблере, когда есть интринсики.
#170 #1076203
>>1076196
Когда сложность О(n^3) то одна лишняя инструкция может замедлить общую скорость на 10-20%, а доверяться компилятору на то что он там соптимизирует хорошо, не вариант, ибо я сначала на интрисиктах сделал, но посмотрев выхлом gcc решил переделать все сам.
#171 #1076231
>>1076203
Сто пудов даже бенчмарк не гонял, человек-ассемблер.
#172 #1076236
>>1076231
Ну да тебе виднее там за стойлом с пхп. Тут же все идоты сидят, не то что ты, умничка от как наверстываешь пхпешку от как молодца, и ява скриптик не забудь подправить.
#173 #1076239
>>1076086
Свинья
#174 #1076241
Тут правда сидят одни свиньи, да?
#175 #1076269
#176 #1076282
Если кому интересно как прикрутить drag and drop к SFML окнам. То
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. Профит.
#177 #1076284
>>1076282
Госпади да все насрать
Принес какое-то парашу под винду.
#178 #1076310
>>1075914

>почему остальное - говно?


Я, видимо, неправильно высказался. Для ньюфагов шилдт и прата, может быть, лучше липпмана. Но если у тебя уже есть опыт в программировании, то может есть смысл взять книгу для более продвинутых?

>Что скажешь, няша?


Вроде все хорошо
Но кому нужны в 2017 простые десктопные приложения? Сложные приложения, которые требуют высокой производительности остаются на десктопе, все простое уезжает в веб.
#179 #1076324
>>1076310
Слушай, для ньюфага норм начинать со Страуструпа?
#180 #1076446
>>1076324
Как по мне он сложный для ньюфага.
#181 #1076448
2ch, почему g++ позволяет создавать массив переменной длинны.
#182 #1076466
>>1076448
-pedantic -std=c++98 (или другого года) уже включил?
Ты про
int a=5;
int b[a];
? Это только в Си и в расширениях языка.
#183 #1076471
>>1076310

>Для ньюфагов шилдт и прата, может быть, лучше липпмана.


Я не совсем ньюфаг, но у Шилдта таки очень много воды для тех, кто не знает про условия и циклы, а тот же STL очень обзорно разбирается, фактически рерайт документации. Прата жирен, но там куча наглядных примеров. Липпман таки лучше по итогу, после него будешь лучше шарить, чем осилив 1.5к страниц Праты?

>Но кому нужны в 2017 простые десктопные приложения? Сложные приложения, которые требуют высокой производительности остаются на десктопе, все простое уезжает в веб.


Не всем по кайфу пользоваться всем простым за 19.5 евро в месяц, да еще и при необходимости держать запущенным интернет.
>>1075873
Бамп
#184 #1076474
>>1075431
Пили стори. Мне вот Джава всегда представлялась лютейшим говном. Сейчас я в 2017 сижу на Эклипсе написанном на джаве и бугуртю от каждого её движения.
А вот представить её в хайлоаде - я вообще не могу. Онаж сама 90% хайлоада и сожрёт своим выполнением. Развей мои сомнения или заблуждения.
#185 #1076524
Нафаня-вопрос.

Сумма цифр числа.
В цикле с предусловием все понятно (прилеплено ниже).
Как то же самое только с постусловием замутить? (do while)
Чому у меня он тупа последнюю цифру числа вываливает?

void main()
{
int a, s;
cin >> a;
s = 0;
while (a > 0)
{
s += (a % 10);
a /= 10;
}
cout << s << endl;
}
#186 #1076526
>>1076524
Сорян, ошибку понял.
Писал по аналогии с паскалевским repeat until.
Немножко каша в голове.
Они ведь не идентичны.
#187 #1076554
>>1076524
Не могу понять, где ты мог ошибиться, ведь while от dowhile отличается ровно одним - гарантией выполнения одного шага. Результат твоей программе от замены while на dowhile с таким же условием не зависит НИКАК.
48 Кб, 1280x720
#188 #1076668
Доброго ранку. Ситуация следующая.

Есть функция, которая принимает вектор по ссылке:

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. А остальные - хранятся во время выполнения функции. Но не сохраняются при выходе из неё.
Что я делаю не так?
48 Кб, 1280x720
#188 #1076668
Доброго ранку. Ситуация следующая.

Есть функция, которая принимает вектор по ссылке:

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. А остальные - хранятся во время выполнения функции. Но не сохраняются при выходе из неё.
Что я делаю не так?
12 Кб, 225x225
#189 #1076680
>>1076668
О, заебок. Сам всё починил.
Просто в цикле выделять память надо было:
vecNetInfo.push_back(C);
vecNetInfo.IP_address = new char[17];
vecNetInfo.Name = new char[18];
#190 #1076683
Кто-нибудь юзал C++ AMP? Как вообще по сравнению с OpenCL/CUDA? На Azure запускали?
#191 #1076713
>>1076683
Мне кажется, что по производительности будет что-то наравне с вычислительными шейдерами OpenGL только без лишних ебот. А на деле получается что CUDA будет нагибать и первое и второе (причем, судя по всему, OpenCL на NVidia карточках работает так себе, у них CUDA в приоритете).
Все, что не CUDA нахуй не нужно, убедился давно сам, а эти OpenCL - выебоны для нищуков.
#192 #1076732
>>1076668
thanks bro, pobleval. worst C++ code I've ever seen
784 Кб, 800x1201
#193 #1076745
Хелпаните аутисту

Хочу прочитать весь список. Имеются структуры

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;
}
784 Кб, 800x1201
#193 #1076745
Хелпаните аутисту

Хочу прочитать весь список. Имеются структуры

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;
}
#194 #1076748
>>1076713
Ты дебил? CUDA не работает на АМД карточках и никаких других. И если ты не пишешь какие-то специальное приложение, которые пишется специально под нвидиа карточки, то используя CUDA ты теряешь половину потребителей твоего приложения.
Это все равно что писать кроссплатформенные игры на Direct3D.
Все нормальные люди используют OpenCL и OpenGL.
#195 #1076749
>>1076745
сука код поехал по пизде.... ща пофикшу....

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;
}
#195 #1076749
>>1076745
сука код поехал по пизде.... ща пофикшу....

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;
}
#196 #1076753
>>1076749
Бля забаньте это имбициала, засирающего тред своей парашей, который даже не додумался использовать pastebin или подобное, что свое говно запостить. Пиздец. Репорт.
13 Кб, 200x382
#197 #1076756
>>1076680

>vector.push_back


>new char[17]

#198 #1076886
>>1076749
Свинья, блять, просто свинья
#199 #1076915
>>1076732
Вам не понять
>>1076756
Хули непонятного? Добавляю элемент в вектор, а потом выделяю память для полей структуры
#200 #1076920
>>1076915
Непонятно зачем комбинировать нормальные приемы и говно мамонта.
#201 #1076936
>>1076920
Вектор я использую, чтобы передать массив объектов класса в функцию. А в структуре NetInfo у меня char-указатели, потомучто я использую некоторые функции winapi, которые принимают именно char. И ещё им надо выделять память через new, иначе getline() ничего в них не запишет.
Конечно, я бы мог объявить вектора символов вместо char
, но тогда придётся ВСЮ прогу переписывать.
#202 #1077088
Какой же я грязный прогер, от меня воняет, волосы комок сала, в душе не был уже 2 месяца, из дома не выхожу только в макдональдс через дорогу, в квартире просто свалка из мусора, мусор прям выкидываю на пол, кот зассал весь коридор и мне похуй воняет пиздец но мыть лень ибо прогаю 24/7. Что делать то?
#203 #1077197
>>1077088
Если бы я был твоим сожителем, я бы сгрёб весь мусор к тебе на кровать и на клавиатуру. Можешь сделать так же и посмотреть на эффект. Мотивации для сохранения чистоты в доме и сохранения в чистоте себя, кроме общения с другими людьми, быть не может. Раз ты ни с кем лично не общаешься, она тебе и не нужна. Ещё могут завестить тараканчики, но они няши, хоть и бегают везде, пока ты их не видишь.
#204 #1077475
>>1076554
Я делал по аналогии с repeat-until из паскаля.
Типа, там условия менять нужно.
А как оказалось на крестах эти циклы отличаются только одним проходом, как ты и сказал.
512x512
#205 #1077477
>>1077197

>Если бы я был твоим сожителем


Да какие там у него сожители...
#206 #1077479
Эээ, чего как малолюдно в треде-то?
#207 #1077529
ананасы поясните по хардкору, а лучше ткните носом в книжку или умную статью.

Не могу для себя разобраться, в каких ситуациях уместно использовать обычное объявление переменных а в каких через оператор new. немного подучил плюсы, и теперь почитываю исходные коды различные. во всех случуаях можно сделать оба типа объявлений. Но вот тонкость эту понять не могу.
#208 #1077554
>>1075062
Если там нет хотяб tesla p100 для вычислений на половинной точности, то хвалится нечем. Поставь хоть 1080, чтоб vgg-16 на нормальной пачке влезал.
#209 #1077578
>>1076748

>> половину потребителей


Кек, о каких приложениях речь, маня? Адобе алтер эффектс, конвертеры или еще что - это ширпотреб. Определенно, там есть своя аудитория потребителей.
Есть множество специализированных приложений, которые узко ориентированы на CUDA (те же нейроночки для спецзадач и прочее), потому что людям нахуй не уперлось доплачивать за энергонеэффективное говно и за разработку для этого мусора.
#210 #1077595
>>1077529
New - это оператор динамического выделения памяти. То есть с помощью него ты просто резервируешь место в памяти.
Для начала покури указатели и ссылки.
#211 #1077599
>>1077595
Нихуя, вместе с new вызывается и конструктор, а ещё бывает placement new.
>>1077529
new нужен или необходим тебе как минимум в четырёх случаях:
- ты пишешь программу для интерфейса, который принимает ссылки на динамические объекты (и потом сам разрушает их)
- тебе нужно сделать большой объект, который на стек не поместится (std::array, например)
- placement new
- тебе нужно сделать smart-указатель (но и здесь можно обойтись без new)
Если твой случай не такой, можешь смело НЕ использовать new, он тебе с вероятностью 99,9999% не нужен.
#212 #1077604
>>1077599
Он вообще спросил как с помощью new переменные ОБЪЯВЛЯТЬ. Наверняка это ньюфаг, а ты ему про интерфейсы, дин. объекты и smart-указатели заливаешь.
#213 #1077623
>>1077604
Более-менее очевидно то, что ньюфренд говорит о
T ЗВЁЗДОЧКА t=new T();
Он читаетт чужой код и попросил пояснить, я пояснил.
>>1077529
Олсо, есть другие редкие случаи, связанные с ООП.
#214 #1077624
>>1074849
Какой же классный у этой станции рейд массив!
#215 #1077630
>>1077623
Держу пари, он говорил о
T *t = new T;
#216 #1077635
Ответьте на вопросы про формальную верификацию, аноны:
https://2ch.hk/pr/res/1077629.html (М)
#217 #1077638
>>1077635

>выучил новое слово

#218 #1077683
>>1077630
Оба варианта правильны для конструкторов без параметров.
#219 #1077730
Двач, в одном месте пишется что map\set являются бинарными деревьями поиска, в другом то что красно-чёрными деревьями, что из этого верно? И чем являются контейнеры multimap\multiset?
#220 #1077742
>>1077730

>в одном месте пишется что map\set являются бинарными деревьями поиска, в другом то что красно-чёрными деревьями, что из этого верно?


Красно-чёрные деревья это вид двоичных деревьев поиска.
#221 #1077746
>>1077742
Хорошо, а что с этим >И чем являются контейнеры multimap\multiset?
#222 #1077747
>>1077746
Скорее всего тем же, просто вместо значений в дереве хранятся списки значений.
#223 #1077766
>>1077747
Может быть и в точности тем же деревом, только со стабильным алгоритмом сортировки.
#224 #1077856
Есть какой-нибудь велосипед для преобразования шестнадцатеричной строки в байты?
#225 #1077860
Антуаны, прошу вашей помощи
Хочу сделать обёрту для вызовов java кода из с++
сейчас ипусь с CMakeLists.txt ибо плюсы использовал раньше только ради лаб в унике

пока имею такое дерьмицо, которое ессесно не работает
https://pastebin.com/9UL2AdHQ

2 цистерны чая тому, кто поможет
#226 #1077867
>>1077860
Слишком мало информации, чтобы помочь. Показывай ошибку, рассказывай про операционку, куда что установлено и.т.п.
#227 #1077875
>>1077867
Операционка 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»
132 Кб, 1147x844
#228 #1077895
>>1075352
//мимопроходил
#229 #1077907
>>1077875
Покажи кеш CMAKE
#231 #1077914
>>1077856
В бусте разве что. Если строка с пробелами можно использовать
http://en.cppreference.com/w/cpp/header/iomanip
но всё равно цикл будет.
>>1077875
Ясен хуй, ошибка в исходнике. Имя включаемого файла, лежащего рядом с исходником, должно быть в кавычках, а не в угловых.
#232 #1077919
>>1077914
не работае и в кавычках, товарищ
Cannot find jni.h
#233 #1077920
>>1077914
да и он же не лежит рядом с исходником, разве не?
я не копировал его в папку проекта, я пытаюсь его из JAVA_HOME/include подгрузить
#234 #1077946
>>1077895
i <= CONFIG_THREAD_COUNT
#236 #1077954
>>1077920
Откуда я знаю? Увидел что-то похожее:
main.cpp
wrapper/WrapperJNI.cpp
wrapper/WrapperJNI.h

Можно включить более подробный вывод, понятнее будет.
#237 #1077956
>>1077860
Зачем указывать REQUIRED и потом проверять if (Java_FOUND)?
#238 #1077960
>>1077954

>wrapper/WrapperJNI.cpp


>wrapper/WrapperJNI.h


анон, ты меня спас наверное
спасибо тебе человеческое!
>>1077956
пробовал всякое, поэтому осталось)
#239 #1077963
>>1077954
не, не помогло
всё равно
fatal error: jni.h: Нет такого файла или каталога
подключать пытаюсь и в кавычках и в скобках
всё равно ide говорит cannot find jni.h
ну вот и где я довен?
#241 #1077965
>>1077954
ОЙ СОРЯН, я все же довен.
пора спать наверное
забыл прилинковать
#242 #1077968
>>1077964
а ещё все же решил проверить ${JAVA_HOME}
и естественно мне ничего не вывело, сидел тупил .-.
#243 #1077995
>>1077909
>>1077968
Надо юзать не FindJava.cmake, а FindJNI.cmake, как уже сказал другой антуан. В кеше должен появиться JAVA_HOME, а лучше Java_INCLUDE_DIRS
#244 #1078061
2ch, мне во всей программе нужно сменить тип с int на long long int, как это можно сделать?
#245 #1078064
>>1078061
Делаешь в хедере typedef long long int idx_t;
Меняешь тип индексов на idx_t с int.
#246 #1078067
>>1077895
Вот эта говнокод.
Я даже вникать не стал.
Тотально нечитабельно.
Если бы ты был моим подчененным я бы тебя уволил за такое.
#247 #1078098
>>1078061
Самый топорный вариант - автозамена с помощью регекса, но автозамене похер на комментарии.
#248 #1078100
>>1078098
Более того, по смыслу многое скорее всего не нужно заменять на long long int. Нужно программу всю перечитывать 100%, на будущее урок будет для типов делать тайпдефы.
#249 #1078110
>>1078100

>для типов делать тайпдефы.


Никакие тайпдефы делать не надо самому. Ибо есть уже все тайпдефы которые нужны.
#include <stdint.h>

А заменять int на long long int это как с одного непортабельного костыля переваливатсья на другой.
Юзай int64_t / least / fast и т.д.
А с голыми интами наебешься, если будешь портировать куда-то даже на другой компилятор.
#250 #1078112
>>1078110
Типичный случай с интом: у тебя больше 2^16 элементов для индексов или меньше? Если больше, то тебе нужен 32-битный инт (если у тебя индекс инт), если меньше, то 64-битный.
Откуда стандартной библиотеке в принципе знать, сколько у тебя может быть элементов? libastral.so включили в стандартную поставку?
Никаких тайпдефов не надо ему.
#251 #1078116
>>1078112

>Если больше, то тебе нужен 32-битный инт (если у тебя индекс инт), если меньше, то 64-битный.


Ну, то есть, наоборот.
#252 #1078127
>>1078112
Если может быть больше, то используй uint64_t или uint64_fast_t, в чем проблема-то? Но больше 32х бит для индексов это надо придумать еще где такое использоватсья может. Если только ты большие ( больше 4 гб ) файлы читаешь в память, или для оффсета к тем же файлам. Больше то врпинципе такие индексы не нужны.
Вообще для индексов есть специальный тайпдеф - size_t. На 32х битной платформе ты все равн оне сможешь адресовать больше 4гб памяти, а на 64х битной он 64х битный.
#253 #1078129
>>1078127
Я-то причём? Я использую. В зависимости от версии программы или uint32_t или uint64_t. Но в любом случае тип индексов должен задаваться typedef'ом, выйти за 4 гб бывает не легко, а очень легко.
size_t для этого не годится, может быть сильно длиннее, чем нужно.
#254 #1078131
>>1078067
Школьник плес. Учи уже С++1* а не си с классами.
#255 #1078134
Попробовал CLion и понял, какая же это параша. Несмотря на то, что VS написана на C#, она работает в разы быстрее, чем это джава поделие. Даже аналог IntelliSense сделан настолько всрато, что для простой подсказки переменной в очень маленьком проекте (меньше 300 строк) требуется около 1-2 секунд.
#256 #1078147
>>1078129
Ну выйти за 4 гб памяти я хз, что ты там пишешь. Если какие то сервера на которых по 128 гб оперативы, то там полюбому 64х битная архитектура и size_t будет соотвутствующий, если же сомневаешься можешь использовать uint64_t.
Но если твое приложение нацеленно поддерживать и 32х битные и 64х битные архитектуры, то тут сам подход изначально должен быть другим, и на 32х битной архитектуре выйти за передлы даже 3х гб памяти это уже катастрофа, ибо остальное будет занято ОС, и твоя программа начнет свопаться на диск, а если свопа нет, то это либо тотальное зависание системы, если она не кильне твой процесс, либо аварийный выход из-за невозможности аллокейта памяти.
Но опять же если тебе нужны уверенно 64х битные индексы, то никт оне запрещает тебе их использовать.

>>1078131
Да я то уже давно выучил, когда он еще в драфте был и успел уже разучить, ибо понятно, что это говно делает код только более нечитабельным и менее производительным.

>>1078134
А вот это ты зря. CLion самая адекватная IDE по всем параметрам, если бы она еще кроме CMake поддерживала бы autotools и make было бы вообще идеально.
Конечно там еще по мелочи некоторых фич полезных нету, типа встроенного дизасемблера бинарников и отладчик там деревянный, но я им не пользуюсь обычно, отлаживаю на дебаг логах, а если прям совсем нужно использую gdb из консоли.
Но про тормоза, ты гонишь, у тебя комп наверное деревянный.
У меня Clion вообще никогда не тормозит, не подвисает и время отклика моментальное. Даже в больших проектах.
Студии нету, ибо я не дебил, чтоб писать на С/С++ под винду.
#257 #1078151
>>1078147
Ты упорно даёшь мне бесполезные советы, которых я не просил. Пожалуйста, будь внимательнее. Не думал заглянуть к психотерапевту? Добра тебе.
>>1078064>>1078100>>1078112>>1078129-кум
#258 #1078154
Двач, ничего не понимаю в этом вашем девелоперском социоблядстве, есть одна говнота под названием imlib2 от которой зависит моя любимая программа и которая нихуя нормально не работает из-за этой библиотеки, скажите, возможно-ли мне как-то разработчикам imlib2 коммитов в сраку репозиторий напушить?
#259 #1078275
>>1078154
У опенсоса могут быть:
- почта
- мэйлинг лист
- ищью трекер
Что-нибудь одно из этого у разрабов есть.
#260 #1078278
>>1078275

>ищью трекер


Ору с этого engrisha
#261 #1078284
>>1078147
Это один из самых читаемых примеров кода в треде, каждая строчка четко выражает замысел, насчет производительности конечно у тебя пруфов не будет.
#262 #1078286
>>1078154
Твою библиотеку лет 10 как не поддерживают, пиши свою.
#263 #1078297
>>1078284

>Это один из самых читаемых примеров кода в треде


Ты скозал?

> каждая строчка четко выражает замысел


Каждая строчка вызывает боль и недоумение.
Дай дураку лямбды, так они всю программу в одной функции захуярят.
Нахуя вообще функции использовать? Если можно прост окопипастнуть 2 одинаковых действия, как ты сделал с принтами, обернув каждую в еще в скоп.
Нахуя одинаковые вычисления выносить в отдельные перменные, легче же просто копипастнуть их в одну строчку.

Алсо, ты жестко проебался c i <= CONFIG_THREAD_COUNT, у тебя создается всегда на 1 тред больше чем указано в конфиге. Алсо, слово count тут не уместно, ибо обозначает счет, а не количество.

На счет производительности, думаю что умный С++11 делает mfence после каждого измениния атомарной переменной. Хотя не уверен, но ты можешь запостить дизассемблер и мы разберемся.
Но вообще, компилятору намного сложнее оптимизировать такие конструкции с кучей лямбд и всякой хуйни. Можешь посмотреть доклады разработчиков clang для достоверности.
#264 #1078299
>>1078297

>Алсо, ты жестко проебался


Это не мой код, с тобой другой анон говорит.

>Хотя не уверен, но ты можешь запостить дизассемблер и мы разберемся.


Нет, дорогой, это ты утверждал про производительность, ты и доказывай.
#265 #1078301
>>1078297

> думаю что умный С++11 делает mfence после каждого измениния атомарной переменной


`sum += acc` это просто `lock xadd`
10 Кб, 796x177
#266 #1078366
Сап, плюсач. Как сделать так, чтобы вместо пикрил вектор отображался по-нормальному (как массив)
VS2015
#268 #1078379
Аноны, мне нужна книга/серия туториалов по с++, но не просто что-то типа "вот это целочисленный тип int, а это логический bool" а нормальный гайд по языку с нормальной структурой и не обязательно хорошим описанием я могу сам загуглить некоторые вещи, к примеру я не совсем понимаю разницу между: const T&, T&, T, T&& и T*, так же какой-то маг в своём коде написал while(1), что ввело меня в ступор из-за неявного преобразования. Проблема поиска конкретных вещей в том, что я могу пропустить какую-нибудь фичу языка и в итоге сделать неоптимизировано/дикий костыль-велосипед за который меня найдут и жестоко покарают.
46 Кб, 1013x341
#269 #1078402
>>1078366
VS 2017, все хорошо
131 Кб, 1920x1080
#270 #1078536
>>1075352
>>1077895
>>1078299
>>1078301
ВНИМАНИЕ ВСЕМ!
ПОКАЗЫВАЮ КАК ПРАВИЛЬНО ПИСАТЬ НА С++11.

https://pastebin.com/ErqiRZJW

В этой работе, я хотел показать элегантность и мощность нового стандарта С++11.
Мне бы очень хотелось, чтобы в мире было больше С++11.
Люди должны мыслить абстракциями и метаобъектами.
Моя работа это вызов общественности, люди должны понять, что они заблуждаются если не пишут на С++11...

Всем спасибо.
#271 #1078538
>>1078536
Пост-ирония.
#272 #1078544
>>1078536
too fat
#273 #1078551
>>1078536
А где unique_ptr для уникальных значений? Где move? Где аллокаторы в фактори функциях? Где в конце концов abstract number factory? Где typename перед каждым T? Где decay->decltype для всех вызываемых функций, неба, аллаха? Почему +1 , = 0 не заменены локальными неймспейсами с интегральными ( enterprise::super_smart_integer_enough_for_everything) константами?
#274 #1078556
>>1078551
Да ты прав, там явно нехватает С++11. Могу создать репу на гитхабе и будем туда пул реквесты делать, улучшая и совершенсвуюя стиль С++11.
#275 #1078584
>>1078556
В общем, я запилил репозиторий на гитхабе, кто хочет поговнокодить на самом деле без говнокода на С++11 и т.п. присоеденяйтесь.

https://github.com/CppDvachAnon/CPP11/tree/abstract_number
#276 #1078594
>>1078297

>Ты скозал?


не, другой анонче

>Дай дураку лямбды, так они всю программу в одной функции захуярят.


why not? особенно если вся программа помещается на один экран.

>Нахуя вообще функции использовать? Если можно прост окопипастнуть 2 одинаковых действия


в лямбду вынести? копипаста копипасте рознь.

>Нахуя одинаковые вычисления выносить в отдельные перменные, легче же просто копипастнуть их в одну строчку.


можно в две. ннада?

>ты жестко проебался c i <= CONFIG_THREAD_COUNT


найди второе место, где я жестоко проебался и получи пирожок

>делает mfence после каждого измениния атомарной переменной


один анонче уже отписал насчет lock xadd, и он прав

>компилятору намного сложнее оптимизировать такие конструкции с кучей лямбд и всякой хуйни


агась, но это если лямбда на лямбде и лямбдой погоняет. от того, что заюзаешь одну лямбду вместо написания отдельной функции, компилятор раком не поставишь
#277 #1078618
вчерашний jni страдалец возвращается
пытаюсь инвочить 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
танкеры чаю, тому кто пояснит за это дерьмо
#278 #1078619
>>1078618
могу ещё дамп памяти приложить
как породник к своему подгорающему пердаку
#279 #1078621
>>1078618
кажется понял что лажаю с unique_ptr, но это не точно
187 Кб, 1920x1080
#280 #1078626
>>1078621
итак, оно вроде пусканулось, но в конце случилось веселье
самое время лажать в с++11 когда уже с++17
#281 #1078669
>>1078402
Спасибо за помощь, блять
>>1078366
Решил путем "починки" установщиком студии
#282 #1078693
>>1078626

> оно вроде пусканулось,


С тем же кодом или ты что-то уже поменял? Сделай помощь тебе более простой.
#283 #1078720
>>1078618

> 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() при наличии нормального управления ресурсами в языке.
#284 #1078722
>>1078626
Посмотри, что у тебя лежит в твоих unique_ptr, прежде чем методы у хранящихся там указателей дёргать.
6 Кб, 629x22
#285 #1078723
>>1078626
А зачем ты пиздишь? Это я found the solution, а не ты.
#286 #1078726
>>1078618
К нам в айти отдел пришёл новый сотрудник. Нужно сказать, что у нас в отделе работают почтенные крестогоспода. Новичка посадили за компьютер, но не успели даже дать задание, как он начал кодить. Начальник из любопытства подошёл посмотреть, что он там написал. В течении секунд тридцати он побледнел, затем посинел, затем покраснел, а потом трясущимся от нескрываемого гнева голосом сказал:
- Это же Абстрактная фабрика! На чём ты кодил до этого?
- На Джаве.
- Жабапидор! - в один голос заорали все 20 человек.
- Жабапидор! Жабапидор! Жабапидор!
Кто-то включил сирену. Над дверьми замигали красные лампочки тревоги. На окнах мгновенно сомкнулись плотные жалюзи. В офисе одновременно бывает два отдела человек по сорок. На обеде вся эта толпа собирается на первом этаже, где яблоку негде упасть. А поэтому, как охранники ни пытались вырвать джавапидора из рук разъяренной толпы, им это не удалось. По всему офису стоял сплошной рев:
- Жабапидор!
В коридоре его сразу же сбили с ног. Используя галстук как поводок, его тащили через весь коридор, передавая из рук в руки. Поэтому получалось так, что никакого движения в коридоре не происходит, но и джавапидора тоже нет. Его заволокли в каптерку под лестницей, где хранятся ведра и швабры с тряпками, и там закрыли. Под конец рабочего дня он всё же появился. За получасовой обед его изнасиловали несколько человек. Сопротивляться было бы бесполезно. Через день на нем чистым оставалось одно лицо, а на теле не было живого места. Он превращался в мразь, в животное. Его били все, даже дизайнеры и уборщицы. Его заставляли есть говно и опарышей. В очко ему совали битые лампочки, живых птиц и змей. Он стал «дельфином» – в нужнике пятнадцать дырок, он ныряет в первую, выныривает, ныряет во вторую... И так – до конца. От него постоянно воняло. С ним невозможно было рядом находиться. Был такой случай: к нам устроился работать Степаныч. Степаныч сидит на толчке, а кто-то снизу через очко хватает его за яйца. Степаныч с воплем вылетает в коридор без штанов. Напротив - айти отдел. Смех не стихал долго... Потом Степаныч забил его кирзовым сапогом насмерть. Менты как узнали, что сдох джавапидор даже дело заводить не стали.
#286 #1078726
>>1078618
К нам в айти отдел пришёл новый сотрудник. Нужно сказать, что у нас в отделе работают почтенные крестогоспода. Новичка посадили за компьютер, но не успели даже дать задание, как он начал кодить. Начальник из любопытства подошёл посмотреть, что он там написал. В течении секунд тридцати он побледнел, затем посинел, затем покраснел, а потом трясущимся от нескрываемого гнева голосом сказал:
- Это же Абстрактная фабрика! На чём ты кодил до этого?
- На Джаве.
- Жабапидор! - в один голос заорали все 20 человек.
- Жабапидор! Жабапидор! Жабапидор!
Кто-то включил сирену. Над дверьми замигали красные лампочки тревоги. На окнах мгновенно сомкнулись плотные жалюзи. В офисе одновременно бывает два отдела человек по сорок. На обеде вся эта толпа собирается на первом этаже, где яблоку негде упасть. А поэтому, как охранники ни пытались вырвать джавапидора из рук разъяренной толпы, им это не удалось. По всему офису стоял сплошной рев:
- Жабапидор!
В коридоре его сразу же сбили с ног. Используя галстук как поводок, его тащили через весь коридор, передавая из рук в руки. Поэтому получалось так, что никакого движения в коридоре не происходит, но и джавапидора тоже нет. Его заволокли в каптерку под лестницей, где хранятся ведра и швабры с тряпками, и там закрыли. Под конец рабочего дня он всё же появился. За получасовой обед его изнасиловали несколько человек. Сопротивляться было бы бесполезно. Через день на нем чистым оставалось одно лицо, а на теле не было живого места. Он превращался в мразь, в животное. Его били все, даже дизайнеры и уборщицы. Его заставляли есть говно и опарышей. В очко ему совали битые лампочки, живых птиц и змей. Он стал «дельфином» – в нужнике пятнадцать дырок, он ныряет в первую, выныривает, ныряет во вторую... И так – до конца. От него постоянно воняло. С ним невозможно было рядом находиться. Был такой случай: к нам устроился работать Степаныч. Степаныч сидит на толчке, а кто-то снизу через очко хватает его за яйца. Степаныч с воплем вылетает в коридор без штанов. Напротив - айти отдел. Смех не стихал долго... Потом Степаныч забил его кирзовым сапогом насмерть. Менты как узнали, что сдох джавапидор даже дело заводить не стали.
#287 #1078749
Двач, я не могу понять, что за перегрузку ввели в C++14 для функции find у классов set/multiset? Может кто подсказать?

>template<class K> iterator find(const K& x);

#289 #1078753
>>1078752
Молодец, гуглить умеешь, в программировании это тебе поможет.
#290 #1078754
>>1078753

>гуглить умеешь


А ещё умею читать на английском.
#291 #1078757
>>1078722
yep, именно там и была проблема, догадался
но всё равно спасибо
>>1078720
таки такое тз
плюс метод DeleteJavaVM делает именно то что и сказано
поэтому у unique_ptr начинаются месяки на вызове деструктера
#292 #1078760
>>1078757
unique_ptr можно передавать custom deleter.
#293 #1078761
>>1078726

>- На Джаве.


>- Жабапидор! - в один голос заорали все 20 человек.


Ещё на котлине :)
Но я не виноват, что у тех с кем мы работаем код на жабе
Сказали запилить плюсы - пилю
причем у них жаба вызывает плюсы через jni ирония
#294 #1078770
>>1078761
А тебе нужно просто код с плюсов запусть в жава проекте?
Я просто не пойму, почему ты кресты в dll какую нибудь не засунешь, а из java просто dll функции вызывать? Или в жаве нельзя обращаться к dll? Или у нас не шиндовс?
#295 #1078832
>>1078726

>За получасовой обед его изнасиловали несколько человек.


Я так ненавижу пидорасов, что хочу выебать их!
#296 #1078860
>>1078726
Про абстрактную фабрику не понял, это как-то связано с джавой?
#297 #1078861
>>1078860
Тем, что ЖАВА ООП ПАТТЕРНЫ КУКАРЕКУ НУЖНО БОЛЬШЕ ФАБРИК, БОЛЬШЕ ИНТЕРФЕЙСОВ ПО ИНТЕРФЕЙСУ НА КАЖДОЕ ПОЛЕ
#298 #1078862
>>1078861
Требую дополнительных пояснений, я тут наоборот пытаюсь въезжать в паттерны, даже книгу на днях купил и позавчера как-раз пытался учить эту фабрику но забил всё-равно, скучно, что с паттернами и уж тем-более ООП не так? Мы же на C++ а не на C.
#299 #1078863
>>1078862
С паттернами всё отлично. Плохо то, что жава рабы их суют в каждую дыру не понимаю для чего какой паттерн нужен.
#300 #1078883
>>1078862
Слушай, добрый совет тебе, выброси нахуй эту гнигу, а лучше вообще сожги, чтоб другие не прочитали.
ООП патерны в С++ почти никогда не нужны, если ты не пишешь говно типа как на яве. Я сам прочитал несколько гниг gof и т.п про это говно и мне ниразу эта параша не пригодилась на работе и никто из нормальных людей это не использует.
#301 #1078894
>>1078770
Мне нужно из плюсов вызывать жаба код, вот в чем подвох.
Просто я знаю что этот жава код в итоге вызывает плюсы.
инсайдерская инфа 146%
Можете даже попробовать угадать сферу деятельности)
#302 #1078933
>>1078894

>Можете даже попробовать угадать сферу деятельности


Разработка под андроид.
#303 #1078939
>>1078933
Не нихуя)
#304 #1079049
Аноны, я лютейший ньюфаг, работаю погромистом на питоне и вообще не понимаю, как работает рантайм. То есть, если я захочу покласть в переменную строку с названием класса, а потом "создать" из этой строки объект - у меня это не получится?
#305 #1079062
>>1079049
Нет.
#306 #1079068
>>1079062
А почему? Объясни, пожалуйста, если не хочешь или сложно, скажи: в книжке Липпмана это будет разбираться? Я только начал просто. Если не будет - скинь что-нибудь про работу компилятора (в очень общих чертах), разумеется, если несложно.
#307 #1079136
>>1079068
Имена типов хранятся, но они... Сложные. Можно вытащить из типа строку типа такой (это std::string)
NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
Они сложные из-за того, что используется метапрограммироване и классы генерятся во время компиляции.

> скинь что-нибудь про работу компилятора (в очень общих чертах)


Очень тяжело рассказать про работку компилятора в очень общих чертах. Советую начать с первой ссылки в гугле по запросу how c++ compiler works
Советую забить на плюсы, они очень сложные, а профита тебе с них никакого не будет
#308 #1079164
>>1079136
Почему стоит забить?
#309 #1079174
>>1079164

>Почему стоит забить?


>они очень сложные, а профита тебе с них никакого не будет


А по поводу сабжа

>если я захочу покласть в переменную строку с названием класса, а потом "создать" из этой строки объект - у меня это не получится?


То что ты описал. Так работает dll. Только вызываются функции. С помощью dll непосредственно получить объект созданный в этом самой dll получить достаточно сложно. И насколько я понимаю тут уже зависит от платформы. Если бы не пайтон, а какой нибудь .net язык и шиндовс, то можно было бы Invoke использовать или тот же COM
#310 #1079179
Пацаны, а как правильно typedefить указатели на функцию. Поясните пожалуйста, будьте котиками.
#311 #1079185
>>1079179
https://stackoverflow.com/questions/4295432/typedef-function-pointer
Не забудь прокрутить вниз до std::function
#312 #1079223
>>1079049

>То есть, если я захочу покласть в переменную строку с названием класса, а потом "создать" из этой строки объект - у меня это не получится?


Если очень сильно приспичит, и ты готов использовать нестандартные расширения языка - это в целом возможно, только ты просираешь статическую типизацию (один из важнейших инструментов программирования на плюсах).
#313 #1079500
Почему так происходит? Кто знает? интрэсно
#314 #1079520
>>1079500
Перегрузка функции operator<<().
Во втором случае печатается значение указателя (адрес в памяти).
#315 #1079522
>>1079500
Попробуй p явно преобразовать к char*
Там какая-то проблема с самим cout

http://www.learncpp.com/cpp-tutorial/613-void-pointers/
#316 #1079524
>>1079500
Что по-твоему должен делать оператор вывода, видя перед собой указатель на void? Как он по-твоему должен догадаться о том, что там строка/число/структура?
#317 #1079532
>>1079500
Какой же С++ уебищный язык господи. Нет ничего лучше старого добротного FORTRAN.
#318 #1079543
>>1079532
Ну у него там как раз С. От крестов там только поток вывода
#319 #1079562
>>1078536

>С++11


>19/10/17

#320 #1079566
Почему не получается прилепить к std::filesystem::path дополнительный путь, получаемый через std::string_view, при помощи operator/()? string прилепляется нормально можно конечно string(string_view), но емана, мои лишние аллокации!!!
4 Кб, 489x77
#321 #1079568
Лаба по С++.
Аноны,проверьте пожалуйста,все ли сделал так.
Задание:
Для каждого 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");
}
4 Кб, 489x77
#321 #1079568
Лаба по С++.
Аноны,проверьте пожалуйста,все ли сделал так.
Задание:
Для каждого 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");
}
#322 #1079572
>>1079568
Все правильно, сдавай.
#323 #1079574
>>1079568
Залей на https://ideone.com/
Разметка сожрала знаки умножения. Но выглядит вроде правильно
#324 #1079577
>>1079568

>"Vvedite shag"


Проиграл с этого в голос.
Уже не первый раз замечаю у студентиков с лабами такую хуйню на транслите.
Вас блять что английскому не учат в ваших ПТУ? Этож пиздец, какой-то.
Покажи такой код кому-нибудь в реальной жизни вне лабы, люди же охуеют просто и засмеют сразу.
Пиздец неужели трудно выучить блять хотя бы элементарный уровень языка, чтобы придерживатсья правил установленных в мировом сообществе программирования?
#325 #1079581
>>1079577
Часто преподы не знают английский, либо просто требуют сдавать работы исключительно с транслитом
#326 #1079583
>>1079577
У некоторых вообще заставляют кириллицей писать в виндовую консольку.
#327 #1079584
>>1079566
Наверное - из-за отсутствия нужной перегрузки в языке.
#328 #1079586
>>1079577
Да тут дело ещё хуже. Предположим нужно сделать на русском. Но дело в том, что он не потрудился сделать LC_ALL и писать на русском. А начал городить транслит. У нас тут 2017 как бы utf уже стандарт. Транслин ненужен
9 Кб, 740x237
#329 #1079587
>>1079583
А шо не так?
#330 #1079588
>>1079584
В том то и дело, что её почему-то нету во всяком случае в спермо стд. При чем есть бумажка 2016 года, направленная наверное в комитет, не уверен, в которой запрашивается эта фича.
#331 #1079589
>>1079577
Лол.
Мой препод - тетка лет 70.
Она говорит инклюд матч,микрософт и лабалаторная.
#332 #1079590
>>1079587
А если кодировка файла не виндовая 12четатам, а человеческий utf-8?
83 Кб, 205x193
#333 #1079592
>>1079590
А тебя ебет какая у меня кодировка, свинопитек?
#334 #1079594
>>1079581
Если препод не знает английского и преподает С++, то можно смело нахуй слать такого долбоеба ибо ничему хорошму он не может научить хотя бы ввиду того, что 99% знаний о программирование находится в англоязычном формате.

>>1079586
А че LC_ALL то? Может хотя бы LC_LANG? Но в общем, даже если он укажет LC_ALL=ru_RU.UTF-8 то не факт что в системе будет установленна эта локаль. А инглишь поддерживает все, и тут 100% не проебешься.
#335 #1079601
>>1079592
Ебет, если твоя пораша запустится на моей консольке, с другой кодировкой.
#336 #1079603
>>1079594

>Если препод преподает С++


Не преподает. Там максимум сишечка и винапи.
#337 #1079604
>>1079601
С чего ты взял, говноглот, что кто-то разрешит тебе запускать мои клевые программы, да еще и из под прыщеговна?
#338 #1079608
>>1079604
Хорошо, что ты не разрешаешь запускать свое говно приличным людям. Но на всякий случай добавь туда комментарии "Не спермоглотам не запускать".
#339 #1079609
>>1079603

>Там максимум сишечка и винапи


Я тебе по секрету расскажу. Но расшарить winAPI не так и просто на нормальном уровне конечно же. Тем более winAPI оперирует уже с таким понятие как операционная система. И там уже нужно знать как оно работает и как там всё описывается.
#340 #1079611
>>1079608

>"Не спермоглотам не запускать".


Если там будет такой комментарий, тебе будет можно запускать.
#341 #1079613
>>1079609
Я говорил про то, что кресты не преподают.
А чего сложного в винапи? Появилась задача, гугли пример, уточняй что в нем происходит на msdn, перепиливай под свою задачу.
#342 #1079615
>>1079611
Нет, я же не спермоглот.
#343 #1079616
>>1079613
С таким успехом ничего сложного и в крестах нету
#344 #1079617
>>1079615
Докажи, что не спермоглот. Возьми в рот сперму и не глотай.
#345 #1079619
>>1079616
Так и есть.
#346 #1079621
>>1079617
Я думаю, для этого доказательства достаточно будет не брать сперму в рот.
#347 #1079625
>>1079621
А как ты узнаешь, что тебе не захочется проглотить сперму?
#348 #1079635
>>1079625
А к чему этот признак? По определению "спермоглот" занимается глотанием спермы, а не раздумьями "захочется или нет". Если не набирать её в рот, то и проглотить не получится. мы же взрослые крестовики, и не будем заниматься грязными хаками, в виде заливания спермы через нос?
#349 #1079702
>>1079588
http://en.cppreference.com/w/cpp/filesystem/path/append
http://en.cppreference.com/w/cpp/filesystem/path/path
Собственно, если у тебя прилепляется string, то у тебя вызывается конструктор path, а для конструктора есть нужная перегрузка. Выкладывай код, что-то здесь нечисто.
#350 #1079722
>>1079625
>>1079635
у кого что болит - тот о том и говорит. Вы оба спермоглота.
#351 #1079754
Сап, посаны. Подскажите пожалуйста, как получить Base64 из .png картинки? Или уж на то пошло, из любого бинарного файла.
#352 #1079798
>>1079603
У нас (в 2012) один препод пытался преподавать плюсы. Начал писать код на доске и обосрался. Объяснить я ему не смог, он ушёл в полную несознанку. Я к нему на пары больше не ходил.
294 Кб, 1907x867
#353 #1079813
Почему рандом на столько рандомный ?
#354 #1079815
>>1079813
Используется одинаковый сид, чтобы он был разным, надо его инициализировать, например, временем.
Вся суть курсохуесосов, что с вас взять. Шёл бы да книжку почитал.
#355 #1079832
Сап, аноны. До недавнего времени я кодил прошивки для всяких кортекс-М3 на C, но, в связи с тем, что один из мною любимых компиляторов (нет, не gcc), начал поддерживать С++14, я решил вкатиться. Вкатываться решил методом написания периферийной библиотечки, суть которой такова:
Есть модуль периферии/несколько идентичных модулей, к которому/которым относятся некие конфигурационные регистры, битовые поля в которых отвечают за некие настройки. Библиотека должна обеспечивать методы, модифицирующие эти поля, обеспечивая при этом максимальную защиту от дебила, сидящего за монитором, проверяя на этапе компиляции передаваемые параметры.
Делать это в рантайме, как в сишных библиотеках, поставляемых производителями, уныло и тупо.
В результате, пока что пришел к такому варианту:
Модули периферии объявляются как шаблоны классов с заблокированными конструкторами и статическими методами. Внутри класса объявляются 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);
}

В связи с этим хочу узнать мнение анонов, правилен ли такой подход?
#355 #1079832
Сап, аноны. До недавнего времени я кодил прошивки для всяких кортекс-М3 на C, но, в связи с тем, что один из мною любимых компиляторов (нет, не gcc), начал поддерживать С++14, я решил вкатиться. Вкатываться решил методом написания периферийной библиотечки, суть которой такова:
Есть модуль периферии/несколько идентичных модулей, к которому/которым относятся некие конфигурационные регистры, битовые поля в которых отвечают за некие настройки. Библиотека должна обеспечивать методы, модифицирующие эти поля, обеспечивая при этом максимальную защиту от дебила, сидящего за монитором, проверяя на этапе компиляции передаваемые параметры.
Делать это в рантайме, как в сишных библиотеках, поставляемых производителями, уныло и тупо.
В результате, пока что пришел к такому варианту:
Модули периферии объявляются как шаблоны классов с заблокированными конструкторами и статическими методами. Внутри класса объявляются 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);
}

В связи с этим хочу узнать мнение анонов, правилен ли такой подход?
#356 #1079835
>>1079813
Ты на крестах пишешь. Гспд. Ну ты хотя бы попытался заглянуть в стандартную библиотеку
http://www.cplusplus.com/reference/random/
#357 #1079838
>>1079832
Собственно где тут С++14?
Что значит правилен?
У тебя не код, а какое насилие шаблонов. И залей его куда нибудь. Читать невозможно.
Нахуя там namespace в начале? Чтобы точки потом можно было ставить?
21 Кб, 500x370
#358 #1079843
>>1079838

>библиотека


>нахуй неймспейс?

#359 #1079848
>>1079838
1. using, constexpr, вот это вот все.
2. Ну есть же какие-то правила хорошего тона, разве нет?
3. Что не так с шаблонами? https://pastebin.com/F6zJyE5K, https://pastebin.com/MFw32PkR
4. Чтобы отделить библиотеку от всего остального.
#360 #1079853
>>1079848
А. Пост твой не прочитал нормально.
Я наверное не могу оценивать. Но мне нравится код
#361 #1079869
>>1079702
#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;
}
}

Как-то так
#361 #1079869
>>1079702
#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;
}
}

Как-то так
#363 #1079871
>>1079754
https://ru.wikipedia.org/wiki/Base64

>Схема соответствия «символ — значение» в Base64


Читаешь побайтово из одного потока, прогоняешь его через энкодер, и выводишь в другой поток.
#364 #1079877
>>1079870
http://coliru.stacked-crooked.com/a/8256d1a5f54133f8
Ты про эту ошибку говоришь или про какую? ТЫ СВОЮ ОШИБКУ ЗАПОСТИШЬ БЛЯДЬ ИЛИ МНЕ НУЖНО КЛЕЩАМИ ТЕБЯ ЗА ЯЗЫК ТЯНУТЬ?
#365 #1079881
Вопрос к экспертам, с помощью только либы SDL2 можно написать приметивный , но красивый GUI, (кнопки, радиокнопки, чекбоксы, формы для ввода, выбор файла)?
#367 #1079960
>>1079877
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)'
#369 #1079986
>>1079813

>Почему рандом на столько рандомный ?


>на столько


Потому что готовься к ОГЭ.
#370 #1080051
>>1079813

>> #include <conio.h>


>> #include <time.h>


Говноед плес. Ты зацем со своим Цэ в терд крестов пришел. Дали ему в крестах рандомы с настраиваемыми генераторами и распределениями, нет, блять, хотим парашу с цэ жрать.
#371 #1080052
>>1080051

>Ты зацем со своим Цэ в терд крестов пришел.


кони-о это даже не Цэ
#372 #1080057
>>1080051
Только твоя параша из С++ работает в 1000 раз медленее обычного rand().
44 Кб, 678x242
#373 #1080064
>>1080057

> параша из С++ работает в 1000 раз медленее обычного rand().


Хули ты пиздишь?
https://stackoverflow.com/a/35359918
#374 #1080065
>>1080057
Даже если на 2 порядка, что не так. Но она хотя бы нормально работает.
#375 #1080105
>>1080057
Пруфы, неосилятор. Бенчмарки, ассемблерный код.
#376 #1080106
>>1079832
Код не читал, подход правильный.
#377 #1080112
>>1080105
Ладно, не пожалел почаса и потратил на написание бенчмарка.
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

Надеюсь вы там разберетесь как это скомпилировать. Я в хедере написал флаги.
#378 #1080113
>>1079985
То есть у шланга все работает? Придется на время смириться с виндопроблемами.
#379 #1080114
>>1080112
Сорян вот тут версия с thousand seperators для читабельности
https://pastebin.com/KqAqR3Pf
#380 #1080123
>>1080112
Среднее время мало о чем говорит, надо гистограмму.
#381 #1080124
>>1080112
Эм. Может ты не будешь им диапазон задавать. Понятно что при нормализации будет медленно. Делай вот так
random_device rd;
mt19937 gen(rd());
gen(); <- возвращает рандомное число.
#382 #1080136
>>1080124
Да так быстрее, вроде показывает 10 циклов avg, но там походу у меня баг с rdtsc, что-то циклы странно показывает. Сейчас нахожусь под виндой и компилирую mingw думаю может из-за этого.
#383 #1080144
>>1080136
Я конечно не эксперт. Но зачем ты натыкал атрибутов, если не используешь gcc. И вообще зачем тебе эти атрибуты тут.
Или это копипаст с интеловской документации просто?
#384 #1080149
>>1080124

> 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
#385 #1080151
>>1080149
Так и какой вывод из этого можно сделать?
#386 #1080153
>>1080151
Басни про скорость работы сишного генератора случайных чисел -- брехня?
Если честно, нет никакой разницы, 14 или 46, гораздо важнее качество распределения. Вот тут можно похоливарить. А заполнение кучей случайных чисел боттлнеком вряд ли станет, только если в монте-карло каком-нибудь очень гнойном.
#387 #1080155
>>1080144
Атрибуты что бы не дать копилятору удалить код во время оптимизации.

>>1080149
Да ты прав mt работает побыстрее rand. Мне теперь интересно настолько быстрее будет работать свой Mersenne Twister генератор.
#388 #1080157
>>1080155
Вот ради интереса боевой компилятор вместо 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
#389 #1080160
>>1080153

>Вот тут можно похоливарить


https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful
Уже похоливарено
#390 #1080162
>>1080155

>Атрибуты что бы не дать копилятору удалить код во время оптимизации.


Где-то удалить, а где-то запрещает инлайнить. Мне не понятно зачем это в контексте твоего кода?
#391 #1080164
>>1080157
Виноват, принёс не самый свежий. Исправляюсь.
$ 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 обуздать? Мне просто тоже стало интересно, насколько быстро можно сделать.
#392 #1080166
>>1080164
Слушай, ну впринципе можно со своим mt генератором на AVX и распалаллеленым твистером, но это уже задача посерьезней.
#393 #1080167
>>1080166
Присылай, затестим

$ 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
#393 #1080167
>>1080166
Присылай, затестим

$ 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
#394 #1080176
>>1080167
Лол, не. Это надо уже долго сидеть разбираться в тонкостях алгоритма, чтобы подстроить его под SIMD.
Но как говорит вики, есть реализации на SSE2 которые в 2 раза быстрее обычного, с учетом того, что SSE регистры 128 битные и оперируют за раз по 4 32х битных числа, то AVX c 256 битными регистрами теоритически может дать х4 прирост скорости без изменения алгоритма.
Вообще если дальше идти можно и на GPGPU запилить, и генирировать просто таблицу рандом чисел и потом просто идти по ней, это точно будет в десятки раз быстрее, чем даже C++ генератор.
#395 #1080188
Аноны, какие есть простые интуитивно программы, для создания приложений в оконном режиме?
#396 #1080189
>>1080188
Visual Studio
#397 #1080192
>>1080188
winForm. Не знаю завезли кресты в WPF.
А если тебе кроссплатформу, то попробуй Qt.
#398 #1080194
>>1080192

>то попробуй Qt


Легче недельку потратить на изучения шарпа и недельку на WPF, чем несколько лет дрочить Qt и всё равно писать глючную парашу.
#399 #1080217
Да мне для учебы. Проект не коммерческий.
#400 #1080219
Аноны, поясните, зачем нужен std::allocator_traits.

Для меня это выглядит как лишняя обертка над std::allocator. То есть вместо того , чтобы явно работать с std::allocator , я буду писать что-то типа:
std::allocator_traits<std::allocator<Type>> и потом уже вызывать методы allocator_traits.
И нахера?
#401 #1080238
Всегда надо сначала записать вводимый пользователем текст в строку, а потом переводить ее в массив чаров с использованием strcpy или можно сразу в него забить?
#402 #1080241
>>1080238
std::string это массивоподобный контейнер, вполне возможно, тебя он устроит.
#403 #1080247
>>1080241
Хочу просто понять указатели, поебаться с динамическим массивом чаров. Мне надо эту самую строку, которую введет пользователь, из string перевести в динамический массив. Что-то я запутался.
8 Кб, 392x280
#404 #1080248
Как-то так.
>>1080247-кун
#405 #1080250
>>1080248
char *sym = &str[0];
#406 #1080251
>>1080248
У вас тут сегфолт.
>>1080250
Отвратная идея.
#407 #1080254
>>1080247
Дело в том, что ты сейчас занимаешься С стайлом. Это не кресты. Ты можешь использовать метод c_str для того, чтобы получить из с++ строк std::string С строку которая char*.
Но зачем оно тебе нужно? Работая с C строками, ты работает с со стандартной библиотекой С, а значит тебе не в этот тред.
Ну и std::string в твоём понимании это динамический массив, но правильно это конечно же назвать контейнером.
#408 #1080258
>>1080254
Благодаря тебе кое-что прояснилось. Спасибо.
19 Кб, 446x346
#409 #1080259
>>1080251
Даже не знаю, чем она тебе не приглянулась.
#410 #1080261
>>1080259
Делаешь лишние предположения о реализации.
#411 #1080262
>>1080254
Проиграл с деба, советующего понять указатели, не используя указатели.
#412 #1080265
>>1080262
Можно изучать указатели, работая со string же, а не с *char.
#413 #1080266
>>1080262
Где ты видишь, чтобы я ему что-то советовал. Я ответил на его вопросы.

>Мне надо эту самую строку, которую введет пользователь, из string перевести в динамический массив


>Ты можешь использовать метод c_str для того

#414 #1080267
>>1080261
Что здесь лишнего?
#415 #1080269
>>1080267
Предположение, что в эту память можно что-то записывать.
#416 #1080272
>>1080269
Непрерывность строки гарантируется.
Чем тогда
pStr[2] = '@';
отличается от
str[2] = '@';
?
4 Кб, 213x68
#417 #1080277
>>1080261
А так тоже лишние предположения?
6 Кб, 435x180
#418 #1080278
Лучше расскажите как вы относитесь к такому способу изучения указателей
Считаю этот код практически произведением искусства и верх гибкости и универсальности и МОЩИ С++.
#419 #1080280
>>1080278
Это просто >>1080277 с заменой addressof на &
#420 #1080281
>>1080280
Да увидел уже. Делал это когда не было поста того. Но отвлёкся и прослоупочил.
9 Кб, 456x308
#421 #1080286
Всё таки не хочу перекатываться в С-тред. Хочу просто создать строку *char, занести в нее введенное пользователем значение и работать с ней дальше, используя С++.
Нашел код пикрелейтед, но он ругается на сишную getline. Че делать? Мозги уже кипят.
#422 #1080288
>>1080286
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 что хочешь
#423 #1080289
>>1080286
https://ideone.com/8KsfIq
Почитай уже вначале книжку, а потом мучайся.
#424 #1080291
>>1080286
Это под windows? getline это unix расширение, на крайняк можно использовать std::getline, а затем из std::string брать char\*
#425 #1080292
>>1080288

>char° c_str = str.c_str();


Только вот c_str() возвращает const char°
#426 #1080293
>>1080288

>Короче. Делай так.


А не. Не делай. Там const char*. Ща исправлю
#427 #1080294
>>1080291

>getline это unix расширение


Да вроде стандарт
http://www.cplusplus.com/reference/istream/istream/getline/
>>1080292
Есть std::string::data(), да только запись в этот буфер это undefined behavior. Вы заебали, прекратите ебать строку указателями, дрочеры чёртовы. Читайте сразу в буфер.
#428 #1080295
>>1080292
что мешает взять адрес первого эллемента строки и использовать его?
#429 #1080296
>>1080295
Прямые руки запрещают.
#430 #1080297
>>1080294
на пике не плюсовый, а сишный getline http://man7.org/linux/man-pages/man3/getline.3.html
5 Кб, 394x190
#431 #1080298
>>1080293
>>1080292

Короче можно так
Отвечаю. Ещё захочешь
#432 #1080299
>>1080295
Ничего, только вот тут параноики пишут >>1080261

Так или иначе, >>1080277 — официально рабочий способ.
#433 #1080300
>>1080298
Я в курсе, что так можно.
#434 #1080301
>>1080297
point taken
>>1080298
Дикий вырвиглазный костыльный пиздец, да ещё и не портируемый. Нормальный способ >>1080289
#435 #1080302
>>1080300
Ну я ему >>1080286
#436 #1080303
>>1080301

>Нормальный способ


И как потом работать с указателями?
#437 #1080304
>>1080301

> да ещё и не портируемый.


Что ты имеешь в виду?
#438 #1080305
>>1080301

>да ещё и не портируемый


В каком месте?
#439 #1080306
>>1080303
Как обычно. buffer это char*
>>1080305
Да нельзя в буфер строки писать, заебал. Он менеджится строкой, как ей вздумается. Придёт боженька и выебет тебя в жопу без самки.
#440 #1080307
>>1080306

>без самки


*без смазки
#441 #1080308
>>1080306

> Придёт боженька и выебет тебя в жопу


Аргумент, ничего не скажешь.

А реальные будут?
#443 #1080311
>>1080304
>>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.
#444 #1080312
>>1080311

> answered Jun 25 '09


Мда.
#445 #1080314
>>1080310
Посмотрел. Что должно мне придти в голову?
#446 #1080318
>>1080314
То есть ты хочешь сказать, что
str[0] всегда равно char ptr = &(str.begin());
Но str[1] не всегда будет равно prt[1]?
#447 #1080319
>>1080318
Я хочу сказать, что при некоторых (очень маловероятных) условиях &str[0]+n и &str[n] будут различаться. Кроме этого при других условиях c_str() и data() могут вернуть указатель на другой буфер (например, копию). Кроме этого я хочу сказать, что буфер может быть убит при модификации строки любым non-const методом. Кроме этого я хочу сказать, что синтаксис с нулевым элементом просто уродлив.
По совокупности показателей так делать нельзя. Это быдлокод.
#448 #1080320
>>1080319

>Я хочу сказать, что при некоторых (очень маловероятных) условиях &str[0]+n и &str[n] будут различаться. Кроме этого при других условиях c_str() и data() могут вернуть указатель на другой буфер (например, копию).


Назови эти условия.
P.S. Про то, что мы говорим про C++11+—эру упоминать дополнительно смысла нет, я думаю.

> Кроме этого я хочу сказать, что буфер может быть убит при модификации строки любым non-const методом.


Нет, любым не может.
#449 #1080321
>>1080319

>Это быдлокод


А использовать char* в крестах это нормально?
#450 #1080322
>>1080319
Это совершенно неважно в рамках обучения указателям. Так то конечно реализации могут быть разными, Small Buffer Optimization та же.
#451 #1080323
>>1080321
А как взаимодействовать с реальным миром? Винапи там, ядро линукса.
#452 #1080326
>>1080320
Ты делаешь очень много лишних допущений.
https://stackoverflow.com/questions/14290795/why-is-modifying-a-string-through-a-retrieved-pointer-to-its-data-not-allowed
Зачем ты придумываешь на ходу свой собственный манястандарт, конченный? Совсем необучаемый?
>>1080321
Да, вполне нормально. Указатели это не такая уж и редкая штука.
>>1080322

>Это совершенно неважно в рамках обучения указателям.


Нет, это не нормально в процессе обучения. Не надо учиться писать быдлокод, а потом переучиваться. Сизифов труд это необучаемость
#453 #1080330
>>1080326

>Ты делаешь очень много лишних допущений.


Всего 3 предложения из стандарта.

> https://stackoverflow.com/questions/14290795/why-is-modifying-a-string-through-a-retrieved-pointer-to-its-data-not-allowed


> 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()).



Сам себя переспорил, молодец.
#454 #1080331
>>1080326
По твоей же ссылке написано, что это легаси (за исключением модификации ссылки на пустую строку)
#455 #1080334
>>1080323

>А как взаимодействовать с реальным миром?


Хорошее замечание кстати. Но дело в том, что изначально был вопрос о том, как ввести строку из консольки и представить её в виде сишной строки.
Хотя стоит отметить, что если ты используешь winAPI, то ты используешь их затайпдейфиное чудо. Понятно, что за каким нибудь TCHAR скрывается char для ANSI и w_char для unicode. Но всё таки.
#456 #1080495
Пацантре, а где посмотреть как устроен <thread>
Не его .h файл, а именно сам код. Вот например если для шиндовса, то где посмотреть как оно winAPI юзает?
#457 #1080504
Двач, я что-то семантику перемещения понять не могу хотя и просмотрел уже всё что можно по этой теме, скажите хотя-бы, move semantics и perfect forwarding это одно и тоже или разное?
#458 #1080508
>>1080495
Где-нибудь в Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.11.25503/crt/src
#459 #1080537
>>1080504
Разное
забей на forward, пока не поймёшь что такое move
#460 #1080592
Работаю с winsock С++
Кто-нибудь объяснит, отчего может возникать ошибка 11004
WSANO_DATA?
Когда запускаю функцию в консольном приложении
hn = gethostbyaddr((char*)&IP, 16, AF_INET);
всё работает нормально. Но когда класс с этой же функцией использую в winapi, выдаёт такую ошибку. Ещё указывается, что hostent hn равняется nullptr, поэтому невозможно прочитать
hn->name, а именно это и надо.
#461 #1080609
>>1080592
Внимательно прочитай статью на 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-ссылка.

Вот теперь заживём, блядь.
#461 #1080609
>>1080592
Внимательно прочитай статью на 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-ссылка.

Вот теперь заживём, блядь.
#462 #1080614
Короче говоря, perfect forwarding - это название для упорных попыток устранить копирования и сохранить move semantics во всех ситуациях, включая шаблоны, которые только передают аргументы дальше по цепочке.
#463 #1080620
>>1080609

>Внимательно прочитай статью на MSDN и узнай из неё, что должно быть в IP



У меня всё по канонам.
IPAddr IP = inet_addr(xxx.xxx.xxx.xxx");
const struct hostent hn = new hostent;
hn = gethostbyaddr((char
)&IP, 16, AF_INET);

Я же сказал, что код не работает только в winapi-программе
#464 #1080621
>>1080609

>>Непрерывность строки гарантируется.


>В С++11 и далее.


Спасибо, я в курсе. Очевидные вещи про версию стандарта просто не стал писать.
#465 #1080626
>>1080609

>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 там на втором месте.
#466 #1080627
>>1080620
Какой-то ты ебанутый. У тебя память течёт, так как сначала ты создаёшь hostent, а потом просериваешь указатель на него.

Ебись с этими винапями сам, меня эти ебанутые винапи заебали. Отличий между консольным и WinAPI-кодом не знаю, та мне какую-то дичь впариваешь, консольная программа в блядовизуалке - это тоже WinAPI.
#467 #1080634
>>1080627
До этого я не выделял память, так что не из-за этого
#468 #1080639
>>1080609

>нет


Что нет это понятно каждому лол. Труднее сказать почему нет. Разъясни почему нет?
#469 #1080651
>>1080620
Навскидку - не та ширина чара?
#470 #1080653
>>1080620
На стэковерфлоу такой коммент:

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.
#471 #1080669
>>1080639
Он пишет в никуда - создал один объект (char), а указатель использует так, как будто объектов дохуя. Очевидный UB (по правилам использования указателей, не указывающих на созданные объекты). Что лежит в динамической памяти после ОДНОГО созданного char - лишь аллаху известно. >>1080250 - ненормально потому, что гарантий непрерывности строки до C++11 не было, и теоретически строка может быть сегментирована, и оператор[] эту сегментацию прячет только тогда, когда ты его применяешь к самой строке.
#472 #1080676
>>1075680
вот он прав >>1075791, в релиз билде уже на -O2 все символьники так едут, что проще и даже полезнее их не подключать. проще собирать корку/дамп и анально щпялиться в ассемблер. или заюзать чонить типа sxstrace
#473 #1080677
Мне нужно построить простейший график. Возможно ли это, используя одну лишь стандартную библиотеку? После непродолжительного поиска нашёл только сторонние приложения и обёртки, но не одной самобытной либы.
#474 #1080679
>>1080677
Увы нет. Именно только стандартной не обойдешься.
Используй gnuplot.
#475 #1080682
>>1080653

>Use getifaddrs() or similar function instead.


Спасибо, попробую
#476 #1080691
Как реализовать поиск наиболее часто повторяющегося элемента в массиве?
#477 #1080693
>>1080691
Без задней мысли.
#478 #1080710
>>1080691

>Как реализовать поиск наиболее часто повторяющегося элемента в массиве?


Что нибудь слышал о map?
#479 #1080758
Не гоните сразу ссаными тряпками, ньюфаня в треде, собственно вопрос в чём, в винде для создания банального интерфейса использовал windows forms а что на линухе? wxWidgets?
#480 #1080766
>>1080758
Xlib,GTK,Qt,wxWidgets
#481 #1080767
>>1080766
>>1080758
Но ты скорее хотел получить ответ Xlib.
#482 #1080768
>>1080766
>>1080767
Что для даунов больше подходит?
Нужно быстро набросать проект и забыть о нем навсегда
#483 #1080769
>>1080768

>Что для даунов больше подходит?


Java
#484 #1080770
>>1080768

>Нужно быстро набросать проект и забыть о нем навсегда


Ух не ту платформу ты выбрал. Пиши на java да. >>1080769
#485 #1080771
>>1080770

>Ух не ту платформу ты выбрал


В том то и дело что не выбирал
#486 #1080774
>>1080771
А что там от GUI нужно? Зависит от сложности самого интерфейса.
Думаю Qt тебе подойдёт. Накидаешь там кнопок в форму и забудешь как страшный сон
#487 #1080776
>>1080774

>Накидаешь там кнопок в форму


Это и надо было.
Спасибо.
#488 #1080993
Поясните за библиотеки. Зачем нужен .lib, почему одного .h недостаточно? Алсо, скажите где можно почитать об этом, желательно на русском
#489 #1080995
>>1080993
.lib - это много уже скомпилированных в объектный файл .cpp-шников
#490 #1080996
Только вкатываюсь, Серёжа, посоветуй чем парсить аргументы, что пришли с запуском. Самому писать и смотреть, что там в *argv[] мне пока ссыкотно, а нужны простые и gnu-сные уметь, так же значения по умолчанию и обязательные параметры. Чую, если буду писать велосипед остаток недели, сразу обосрусь и не будет радости.
#491 #1081028
>>1080677
Что такое "построить график"? Вывести в память массив байт-пикселей для заданной функции - запросто.
>>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
#492 #1081029
>>1080993
В .h у тебя должны храниться только прототипы того, что ты хочешь использовать. А вся их реализация хранится в cpp. Но для того, чтобы каждый раз не транслировать твой cpp в объектный код. Придумали lib. Статическая библиотека. По сути это просто тот же cpp только в объектом коде.
#493 #1081055
>>1081029
Т.е. lib это предварительно скомпилированный cpp?
Алсо, вопрос, в доках по сборке libcurl есть 2 варианта сборки: static и dll. В чем разница и какой выбрать?
#494 #1081056
>>1081055
Статический и динамический же.
Первый жирнее, но если ты передашь его на другой компьютер с той же архитектурой и операционной системой, он запустится.
Второй меньше. Но если ты передаешь его на другой комплуктер, а Vasyan_laba.dll передать забудешь, ничего не заработает. С другой стороны, зачем тебе статик, если ты ссылаешься, например, на директиксовую (или еще какуюраспространенную) библиотечку?
Уженешкольник
#495 #1081057
>>1081055
Заебал. Все равно нихуя не поймешь.
Иди учи как работает компиляция и линковка
#496 #1081060
>>1080996
boost::program_options
#497 #1081063
Добре, давно у вас не был. Читал изменения C++17. Если от 11 у меня мурашки по коже были, в 14 были интересные моменты, то в 17 вообще не понятно, что и зачем. Опять это ебучее метапрограммирование, костыли на костыли. Неужели нельзя без этого?
Вопрос от дилетанта, кресты давно не практикую, современные стандарты так не трогал вообще толком.
#498 #1081064
>>1080996
Берешь FSM генератор типа ragel ну или bison. .Забиваешь туда свою грамматику.
.Генируриешь парсер.
.Встраиваешь его в свою программу.
.Получаешь распарсенные аргементы.
.PROFIT???

Петушков с бустом не слушай, вообще лучше ничего из буста не используй никогда.
#499 #1081066
>>1080609

>Ясен хуй, либо твоё компилятор не поддерживает новый стандарт драфт, либо нужный номер стандарта не указал.


Оказывается есть в visual studio переключалка на крайний драфт ISO C++ Latest Draft Standard (/std:c++latest). Но это все равно не помогло, майки тормозят.
В чем разница между c++17 и Latest Draft? Второй это уже добавление фич из c++20?
#500 #1081070
>>1081055

>Т.е. lib это предварительно скомпилированный cpp?


Нет. lib - это архив с объектными файлами (.o или как оно там у вендозных) и ещё чем-то. Когда ты компилируешь файл, ты получаешь объектный файл.

>какой выбрать?


Любой.
>>1081063

>Неужели нельзя без этого?


Ты ещё спроси: "неужели нельзя без шаблонов". Можно, но тогда STL не сможет существовать.
>>1081066

>В чем разница между c++17 и Latest Draft?


НЕЕБУ.
#501 #1081071
Почему в VS 17 автоматически через клас визард не пишется прагма ванс и не добавляется в сипипипи файл инклюд с хедером на заголовочный на созданный только что клас???
#502 #1081072
>>1081063

> Опять это ебучее метапрограммирование, костыли на костыли. Неужели нельзя без этого?


В каком месте это костыли? Очень удобная штука, если разберешься.

Что в этом страшного?:
Символьные литералы UTF-8
Удаление некоторых устаревших типов и функций, например, таких как std::auto_ptr, std::random_shuffle или старых функциональных адаптеров
Библиотека файловой системы, основанная на boost::filesystem
Параллельные версии алгоритмов STL
Некоторые математические функции
#503 #1081073
>>1081071
Напиши им в багтрекер.
#504 #1081080
>>1081073
Если серьёзно, то class wizard реально не создаёт автоматически шапки дл конструктора, деструктора, прагма уанс итд
Это всё в VS17,

у меня одного так ?
#505 #1081082
>>1081080
Если серьёзно, то таки напиши им в багтрекер. Может они и предполагают такое поведение.

>не создаёт автоматически шапки дл конструктора, деструктора


Еще бы возможность галочками отмечать требуемые функции. И чтоб с семантиками копирования/перемещения.
#506 #1081084
>>1081057
Тащемта я и спрашиваю где об этом можно почитать
#507 #1081098
>>1081080
Походу у одного. У меня на VS17 всё перечисленное создаётся само. Ты добавляешь класс к проекту, или создаёшь отдельно?
#508 #1081099
>>1081098
А да, в этом проблема, спасибо
#509 #1081131
В MSVS 17 испортил файл ws2def.h и сохранил. Где найти в сети эти файлы или можно ли как-то восстановить?
#510 #1081134
>>1081131
Ну ты и васян. Это ты с winAPI сокетами ебался в ньюфаг треде?
Хз. Как восстановить.
https://github.com/stuta/Luajit-Tcp-Server/blob/master/c_include/windows/original/ws2def.h
Посмотри это то?
10 Кб, 480x360
#511 #1081143
#512 #1081157
>>1081134
Лол. До сих пор ебусь

>ссылка


не похоже совсем даже
#514 #1081311
>>1081060
не, нахуй его надо, этот буст.

>>1081028
мне надо что-нибудь с mit / bsd лицензией, гну это дно.
Тред утонул или удален.
Это копия, сохраненная 15 ноября 2017 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски