Вы видите копию треда, сохраненную 4 июня 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Ответы на все вопросы - http://en.cppreference.com/w/ http://www.cplusplus.com/reference/
Прошлый - https://2ch.hk/pr/res/961839.html (М)
Теги: кресты, cpp
Пора бы туда ситхов запилить
std::array<char, 100>
Все равно возвращает адрес локальной переменной.
"warning: address of local variable 'array' returned" "incompatible types in assignment of 'char*' to 'char[2]"
Никак, функция возвращает скалярное значение либо ничего. Она тебе должна 100 символов пихнуть в стек? Наркоман.
Каждому лектору - в жопу по вектору.
Куда делся ОП-стихописец?
neekaque
Кек
char (&GetArr())[100]
{
static char arr[100] = "Use std::array";
return arr;
}
void main()
{
char (&arr)[100] = GetArr(); // or auto& arr = GetArr();
}
char f(size_t n) {
string s=.......
return s[n];
}
int main() {
int N=...
string res;
for(auto i=0; i<N; i++) {
res += f(i);
}
return 0;
}
А там точно не надо && или &&& может быть?
Да, также забыл упомянуть, что не хочется использовать static и const хуету в функциях. Поэтому просто решил в качестве аргумента функции передавать массив, куда будет записана строка.
массив упрощается до указателя, и ты возвращаешь указатель на удаленную область. U N D E F I N E D B E H A V I O R
Этот тот уёбок, которому надо вернуть массив без указателей, зелёный. А я всего лишь контраллирую.
Ссылка на память в таких массивах константная, её нельзя переопределить. если вдруг до сих пор не понятно было
А там нельзя эту вашу парашу с && заебенить чтобы не было копирования лишнего и память прям в стеке вызывающего выделилась?
Можно. Там не надо её реализовывать для данной задачи. Компилятор протаскивает значение функции, дублировать не приходится.
http://ideone.com/jhnypk
Вау круто оптимизации 2017 год!
А в каких случаях нужно ее явно указывать? Ведь зачем-то ее придумали.
Ну да. Гугли конструктор перемещения.
Да что тут говорить. Пока модули и reflection не введут - нечего даже начинать пердуны старые, нашли что вводить в C++17, говноеды. "Си с классами" ковыряйте - и будет вам.
А?
Я даун. Буду учить.
Лучше объективно. Пользуйся кодблоком своим, если тебе норм.
Из альтернатив Eclipse, CLion, NetBeans.
>Лучше объективно
Ну что значит "объективно"? Мне интересно узнать, что я упускаю не пользуясь вышеперечисленными IDE.
Ими вообще никто не пользуется, и они никому нахуй не нужны. Под LOONIXом у тебя либо qtcreator, либо CLion, как меньше и зол джаваговна. А вообще, с божественной студией ничему не сравнится
Нет. Повторю ещё раз - я не какой-то сектант, мне никто не платил, чтобы IDE двигать. Если тебе норм - пользуюся кодблоком.
ты, поди, по ВИМУ угараешь? Есть такой подвид мудаков из каменного века, которые не любят студи.
Есть два стула, на одном тайпдефы точёные, на другом - кресты дрочёные.
java
Не знает.
Ну ладно
вопрос серьезный. вот объявили
class APA
{ тут всякие паблики, приваты
} APA;
что означает APA?
здаровча!
вопрос серьезный. вот объявили
class APA
{ тут всякие паблики, приваты
} (звездочка)APA;
что означает (звездочка)APA?
Сразу объявляется переменная-указатель на этот класс.
https://habrahabr.ru/post/185662/
Правильно ли я понял, что сначала вызывается оператор new, потом вызывается new как ключевое слово, который размещает объект в памяти, а уже потом вызывается конструктор. Алсо, как происходит это самое размещение объекта в памяти?
Вопрос туда же: зачем оператор new принимает параметр size, ведь мы же знаем размер объекта, для которого вызывается этот оператор
конструктор потелялся после оператора new
So? Мы то вызывает оператор new который внутри Yoba, а раз так, то мы можем просто внутри оператора использовать тот же самый sizeof:
class Yoba {
void operator new() {
return malloc(sizeof(Yoba));
//или вообще return malloc(sizeof(this));
}
};
у меня просто Java головного мозга
В зависимости от того, насколько автор программы идиот: либо компилятор GCC, либо -std=gnu++11.
>To convert an std::istream into a boolean, the compiler calls a member function called std::istream::operator void(). This returns a void pointer, which is in turn converted to a boolean (NULL becomes false, any other pointer becomes true). So in this case the compiler generates a call to std::cin.operator void(), just as if you had casted it explicitly such as (void) std::cin.
Конверсия в буль через птр... КТО ЭТО ПРИДУМАЛ?
};
>return malloc(sizeof(this))
Макакина вакаба сожрала твои звёздочки. Нельзя так людей пугать.
Оператор нью это чисто выделение памяти. new T (ака new expression) это оператор new + конструктор T.
Аллоцировать можешь как тебе нравится - хочешь маллоком, хочешь на своём линейном буффере с блекджеком и шлюхами.
{
};
struct B
{
A a;
};
OK
struct A;
struct B
{
A a;
};
struct A : vector<int>
{
};
Иди нахуй
Поясните
В первом случае кнопилятор сумел вычислить размер структуры А и поэтому сумел запихнуть его в объект Б.
Во втором случае компилятор не ебет, какой размер у структуры А во время объявления структуры Б. Компилятор лишь знает, что ты мамкой поклялся объявить когда-нить структуру А. Если поменяешь на указатель во втором случае - сработает.
Спасибо
Не очень, но к простоте выражения if(data) привыкаешь. Меня больше позабавило operator voidЗВЁЗДОЧКА.
>вызывается new как ключевое слово
>ключевое слово
>вызывается
Откуда вы лезете?
А, с хабрапараши. Вернись на парашу.
void test(Int x)
void test(int x)
Компилятор ведь обосрётся если на его платформе sizeof(Int)==sizeof(int)? Нужно писать #if sizeof(Int)==sizeof(int) для второй функции?
>Компилятор ведь обосрётся если на его платформе sizeof(Int)==sizeof(int)?
Обязательно обосрётся.
Я хочу сделать так
#define INT long long
void test(INT)
#if sizeof(int) != sizeof(INT)
void test(int)
#endif
Чтобы не нужно было писать INT(x) при вызове функции, та функция что принимает int это как хелпер для автоматического каста в больший тип, но интересно что будет если окажется что это одинаковые типы для компилятора
int и long long это всегда разные типы для компилятора.
Раньше по другому было нельзя. Гугли по safe bool idiom насчет того, почему просто operator bool не работает. Теперь-же есть explicit operator bool, и проблемы отпадают.
Скорее ты обосрёшься от полного отсутствия знаний.
>Оператор нью это чисто выделение памяти. new T (ака new expression) это оператор new + конструктор T.
Т.е. в любой записи по типу Foo *f = new Foo(); new является ключевым словом, которое уже вызывает оператор и конструктор по умолчанию?
А ещё убеждается, что при исключении в конструкторе память освобождается.
В статье есть ссылки на стандарт, открой и почитай.
В частности читни 3.7.4
Но вот, что я нашёл:
http://stackoverflow.com/questions/11016078/is-it-possible-to-create-a-function-dynamically-during-runtime-in-c
atexit([](){}), что не понятно? atexit принимает указатель на функцию, которая должна быть прописана в бинарнике. А std::function можно создать динамически, но как конвертировать её в С-функцию - не понятно.
http://ideone.com/ljYpUt
Сегфолтится. Проблема очевидно в разименовании указателя, который возвращает target(), но если убрать звёздочку - не компилится. Тип в <> неправильно написал?
А, только что прочитал, что target() может вернуть nullptr и сразу же забыл об этом и не проверил результат. Вопрос почему target() не работает ещё открыт.
class Human {
int health;
std::string name;
} person1;
или тоже самое
class Human {
int health;
std::string name;
};
Human person1;
Имеется необходимость создавать message box`ы. Использую для этих целей QMessageBox::warning(...).
И интересно мне вот что - можно ли как-нибудь запретить создание message box`а, если другой message box уже показан?
>А std::function можно создать динамически
Дело в том, что уже это нельзя. Единственная форма "создания" функций в плюсах - это тимплейты, а они должны быть инстанциированы во время компиляции. Ты никак не вызовешь тимплейт так, чтобы во время компиляции компилятор это не заметил - в программе будут только те функции, сигнатуры котоорых используются.
Если ты хочешь скомпилировать исходный код - это уже другое: >>972026
>>972261
Нет. Target не может сделать функцию из функтора (коим является лямбда), это невозможно.
>>972278
Ты въебал себе в ногу. C++ не сверяет типы. Правильное использование: http://en.cppreference.com/w/cpp/utility/functional/function/target
>>972293
>И интересно мне вот что - можно ли как-нибудь запретить создание message box`а, если другой message box уже показан?
Сделай свой класс/функцию, только который ты используешь и который разрешает только один инстанс (либо не даёт сконструировать объект, либо спинится в конструкторе, пока не разрушится предыдущий кумесагбокс, либо, если это функция, функция спинится в ожидании завершения других функций).
И если вдруг ты пойдёшь по пути компилирования на лету, то тебе придётся платформозависимо что-то вызывать - LoadLibrary, например. Ни один другой язык программирования не может сбацать тебе экспортные C-функции без компилирования в dynamic library и подгрузки оной, на одна ОС не даст этого сделать.
template<typename _Functor> _Functor target() noexcept;
/// @overload
template<typename _Functor> const _Functor target() const noexcept;
И никаких тебе С-функций. Почему плюсы дают тебе выстрелить себе в ногу - неизвестно. Можешь поизучать реализацию, она вся в файле functional твоего компилятора.
Нужно чтобы пользователь библиотеки мог передать лямбду вместо того чтобы каждый раз прописывать статическую функцию и передавать её адрес. А мне эту лямбду нужно завернуть в другую (то есть нужен захват [&]) и поставить конечную лямбду как колбек, atexit для примера.
Ну или хотя бы даже пускай прописывает статическую функцию в С-стиле, только я всё равно не могу обернуть её в другую функцию.
Например как хотелось бы
void yoba(std::function<void(int)> callback)
{
int x = 10;
std::atexit( [=] () { callback(x); } );
}
или хотя бы так
static void callback(int x) {} // всё как в С, никаких лямбд
int x = 10;
std::atexit( [=] () { callback(x); } );
>поставить конечную лямбду как колбек
Лямбда - копируемый объект (код в образе + память в объекте), функция - это кусок кода по некоторому фиксированному адресу и кусок памяти по некоторому фиксированному адресу.
Если тебе очень приспичит, ты можешь сделать функцию-обёртку, которая будет принимать либо все лямбды (код должен быть доступен пользователю), либо лямбды только одного типа (но зато их можно будет складывать в список).
Функцию эту регистрируешь атекситом и наслаждаешься костылём.
https://ideone.com/lep9aV
Можешь завести стек и складывать в него все зарегенные колбеки.
>А мне эту лямбду нужно завернуть в другую (то есть нужен захват [&]) и поставить конечную лямбду как колбек, atexit для примера.
Забудь. atexit() принимает указатели на функции. Лямбда с нетривиальным захватом не превращается в указатель на функцию.
Скачал 15 версию, запускаю - и программа ни на что не реагирует, просто нажимаю на любые кнопки - не реагирует, и звук такой противный виндосовский. как ошибка какая-то
Тот самый момент, когда ты настолько профнепригоден, что даже студию поставить не можешь
>>972341
Установил, и теперь вот такая проблема, на пике.
Это пиздец. У меня задание - сделать простой текстовый квест на условиях. Я его сделал, пытаюсь компилировать - и такая хуйня.
При создании проекта выбирал консольное приложение, пустой проект. НИкаких библиотек не ставил.
http://stackoverflow.com/questions/1775865/preventing-console-window-from-closing-on-visual-studio-c-c-console-applicatio
Нагуглил это - не помогло. Гуглил что неправильно проект создал - не помогло.
Помогите пожалуйста, умоляю, может есть какая другая IDE с поддержкой кириллицы?
QtCreator.
>и такая хуйня.
Саемшит, брув. Запускаю порграмму, возвращаюсь в студию, а там эта хуйня висит. По-моему так и не поправил.
https://forums.xamarin.com/discussion/89755/how-to-make-visual-studio-not-to-rebuild-project-on-re-run - одинокий гребец
http://stackoverflow.com/questions/2646858/visual-studio-2010-isnt-building-before-a-run-when-there-are-code-changes - а вот это может помочь. Вспоминаю это.
В реализации уже подглядел (там хитро), а где это в стандарте найти?
Нашёл.
Конкретно эта ошибка - один из многочисленных багов в студии. Студия - это не кресты, это студия.
В том, что в какой-то момент студия начинает предлагать пересобрать проект после каждого запуска, и при этом ничего не клмпилирует и не линкует, только один файлик какой-то обновляет. Читай ссылку на СО, там у людей в точности то же.
>>972407
Ты не смог, но ты пытался. Попробуй -O3. Команды матчишь мапом? Есть перфект хэш, вроде: даёшь набор ключей, и он минимизирует линейный поиск по вёдрам.
Оу, и ещё: http://en.cppreference.com/w/cpp/io/ios_base/sync_with_stdio . Если ты из входа читаешь, это важно.
И -funroll-loops попробуй.
Это такая шутка? Ты не можешь просто нажать да?
std::function это типа shared_ptr: почти всегда (за исключением размера лямбды ≤ 1-2 sizeof(void*)) динамическое выделение памяти и подсчёт ссылок.
Подскажите, пожалуйста, хорошую (не обязательно популярную) библиотеку для работы с асинхронным IO (файловые операции и сетевые сокеты обязательно), можно даже на Цэ.
Коллбеки лежат в четырёх unordered_map<string, function> и в зависимости от контекста вызова и количества аргументов выбирается одна из мап и вызываеется функция _callbacks.find(name).second(arg)
Такие названия функций из-за того что шаблоны и перегрузка функций не работают с function<void(...)> и function<...(void)>
На 3 создание функции, эквивалетное sub sub_name { ... }
Работает со скоростью света, но как оказалось обернуть function ни во что нельзя, и чтобы пользоваться этим нужно лезть в самые внутренности интерпретатора, которые никто кроме меня не понимает
>>972430
И как быть, может указатели на std::function хранить?
>И как быть, может указатели на std::function хранить?
Чтобы ещё из-за одного уровня indirection больше тормозило?
Очевидный boost::asio (годные гайды ищи сам, их вроде не существует)
У тебя там delete[] в деструкторе вызывается для обычных указателей, не на динамическую память. Конечно же ошибка
error: 'quick_exit' is not a member of 'std'
ЧТО ЕТО ЗА НАХУЙ?!
У меня кровь из глаз полилась. Это бложик фемо-спортсменки-программистки на ютубе? WTF?!
либо nullptr пусть пишет
теребонькнул
Надеюсь на то, что уже сгорела.
Скажем так, delete[] и должен вызываться для обычных указателей - указатели, с которыми работает delete[], ничем не отличаются от указателей, с коротыми работает delete.
Кроме......
Можете не отвечать, если кому пригодится
http://www.prog.org.ru/index.php?topic=27216.msg196943#msg196943
Бамп
Это же Qt, скомпилится где угодно.
Gflags
Yoba::Yoba()
{
_id = _lastid++;
#ifndef MULTIPLICITY
if(_id > 0)
throw ...
#endif
}
как-то не очень выглядит по-моему, но ничего другого в голову не приходит
> Как грамотно запретить создание второго объекта класса при соответсвующем дефайне?
Синглтон?
Бочку?
Городить дефайны внутри конструкторов крайне грязно и выдаёт плохой вкус к коду.
Лучше напиши отдельный синглтон-класс и отдельный просто-класс. Дефайном определяй тип класса.
Как-то так:
//defines.hpp
#ifdef MULTIPLICITY
#define Yoba MultiYoba
#else
#define Yoba SingleYoba
#endif
//main.cpp
Yoba* yoba = new Yoba();
Т.е. в коде создание класса будет чистым, без мусора, а весь мусор будет скрыт в отдельный файл.
Блядь, за полчаса даже никто не обосрал меня за то, что я использовал дефайны вместо тайпдефов? Цепепетред, ты меня разочаровал.
MultiYoba это неплохая идея кстати. Я через #ifndef просто прятал ряд методов которые не нужны в однопоточном приложении, а можно же просто наследовать в класс Multi и добавить эти методы туда.
Да тут препроцессор вообще не нужен. Можно просто сделать вроде
class MultiYoba : public Yoba
MultiYoba::test()
{
pthread_set_context();
Yoba::test();
}
а базовый класс вообще не трогать
const bool MULTIPLICITY=true;
Yoba::Yoba()
{
_id = _lastid++;
if(MULTIPLICITY && _id > 0)
throw ...
}
Чо сложного-то?
Так бы и сказал. С какого фига то, что может навредить программе, управляется из компилятора, кстати?
Так же все делают? Единственное, что мне не понравилось - это когда библиотека собирается с одними дефайнами, которые меняют код, а приложение, с котором линкуется библиотека, компилирует заголовки библиотеки с другими дефайнами - никаких ошибок компиляции нет, только сегфолты в рантайме.
>Так же все делают?
Ни разу не видел такого. Всё то, от чего зависит корректность программы, должно быть в программе.
Иногда пишут объфвления констант перед инклудом, чтобы в инклуде была нужная константа - эта практика лучше.
Все паттерны - это рантайм. Зачем ему лишний оверхед?
Ну используй фабрику или фабричный метод, например:
class Yoba {
public:
static std::unique_ptr<Yoba> create();
private:
Yoba();
};
std::unique_ptr<Yoba> Yoba::create() {
#ifndef MULTIPLE_INSTANCES
return std::unique_ptr<Yoba>(new Yoba());
#else
static std::atomic<bool> instanceExists(false);
bool expectedExists = false;
if (instanceExists.compare_exchange_strong(expectedExists, true, std::memory_order_acq_rel, std::memory_order_seq_cst)) {
return std::unique_ptr<Yoba>(new Yoba());
}
#endif
}
Тебе нужно прописать пути включений файлов, смотри в настройках препроцессора, если я не ошибаюсь. Если это к тому же не header-only библиотека, тогда тебе нужно в путях поиска линковщика добавить путь к библиотеке (самому .lib файлу) и добавить в список линкуемых библиотек ее (соотвественно my_static_lib.lib)
Это header-only library.
Как-то ебануто выглядит прописывать в путях включения путь к проекту
Если пути включения прописать всё заебись работает
Хм, а относительные пути не поддерживаются? По идее должны, но тут точно ничего сказать не могу.
ООООООООО, слушай, я догадался.
https://github.com/gabime/spdlog/blob/master/include/spdlog/spdlog.h
Включение в угловых скобках. Это допустимо только тогда, когда хеадер в папках поиска. Когда ты добавляешь пути инклудов, ты расширяешь жтот список, и всё работает.
Если ты этого не сделал, то если инклуд находится в папке "проекта" в папке H и хочет включиьт инклуд из отй же папки, то в нём должно быть не
#include "H/fuck.h" - это означает "H/H/fuck.h", так как это путь относительно этого инклуда, а
#include "fuck.h".
virtual string to_string() const
{
if(!_loaded) { // нельзя менять поля в const
_loaded = true;
load()
}
...
}
mutable
Ты - последняя надежда.
Нигде не смог найти инфы как это сделать и вообще можно ли так.
Нужно в один датагрид визуалка 2010 засунуть 2 и более таблиц, чтобы они отображались как одна посредством связей как в ацессах, при нажатии на какую-то строку.
Пробовал через запросы, указывал несколько таблиц, заполнял коллекции - либо отображалась одна таблица, либо совсем ломалось.
Возможно ли такое и как это сделать?
Попробуй загуглить "c++ forms datagridview несколько таблиц", там вроде достаточно ссылок с возможными решениями.
Сам я не помогу - не шарю.
Дак в том-то и дело, что все уже прогуглено.
Из подобного выдает все онли для шарпа.
Пытался переписать код от шарпа - не смог, одни ошибки.
Если ты всё же хочешь получить какую-то помощь, нужно дать больше информации. В формах ты шарящего вряд ли тут найдёшь. Если не боишься, можешь проект кинуть, наработки, что пытался делать.
Я остановился на том, что прописал путь во включения.
Метод to_string должен один раз подгрузить ресурсы при том что он const.
Поле mutable bool _loaded вроде работает
Не забудь про thread safety.
Стоит добавить в шапку этот сайт, как по мне.
Не думаю. Что бы на них работать нужно быть оче жестким спецом, а как для хобби кресты самое то, я щитаю.
работаю крестовым сеньором-помидором, но сижу, в основном, в ридонли.
Если я сделаю так
string S;
while ( getline(in,S))
{
}
У меня будет считываться строка таблицы или строка ячейки?
Ты бинарную кашу считаешь, а не строки и таблицы.
пишу под эмбедед на плюсах
тред чуть менее, чем полностью состоит из легко-прогугливаемых вопросов от школьников и вкатывальщиков. поэтому r-only
Открой текстовым редактором вроде Notepad++ и посмотри, что ты читаешь.
Тебе может помочь OLE Automation ебучий кошмар, нирикамендую или какая-нибудь либа примеров не знаю
> Если у меня в вордовском доке таблица, и мне нужно считывание строки,
Binary office formats specification.
XML office formats specification.
Вся суть плюсов:
std::string str = "Hello";
const char* str_c = str.c_str();
printf("%s\n", str_c);
str += "Dude";
printf("%s\n", str_c);
Такой Оохуенный const, что второй раз будет напечатано HelloDude. Ебучий язык
Вы морально не готовы к крестам.
http://stackoverflow.com/questions/2156305/double-const-declaration
Я в курсах про константный указатель на не константные данные, и не константный указатель на константные данные. Просто нахуй у меня бомбит от этого ебанутого дизайна, ебучие байтоебы, лучше бы константные строки сделали с другим модификатором.
Соответственно, еще такой вопрос:
Если я хочу написать свой класс исключения, который наследуется от std::runtime_error, но содержит еще дополнительную информацию - номер строки, имя файла, имя функции и тд. Я определяю конструктор так:
BaseException(const char msg, int line, const char file, const char function) :
std::runtime_error(msg), m_line(line), m_file(file), m_function(function), m_exceptionType("BaseException") {}
Пока все ок, но я еще хочу написать свою функцию what(); которая вернет одну const char которая является конкатенацией std::runtime_error::what() и моих полей(m_function, m_file и тд). Как это сделать? Если я просто создам строку внутри функции и верну s.c_srt() то у меня будет хуйня, т.к. объект на стеке и после выхода он наебнется. Получается, единственный варик - создавать еще одно дополнительное поле в классе моего исключения?
Написал хуйню, ничерта не понимая - виноват язык. Следущий
да
Есть задача, которая подразумевает считывание чисел из файла. Если создавать буфер и ifstream'ом туда пихать, а затем засовывать в массив, то все работает хорошо. Если же использовать fgets, считывая по символу и формируя строку с числом, которая потом вновь оказывается в массиве – программа ломается на одном из тестов (содержание тестов неизвестно).
Есть предположения/мысли, что я мог не учесть, забыть и так далее? Считывание на известных тестах работает правильно.
если есть вариант считать даблы из файла каким-нибудь еще более быстрым способом, то будет вообще здорово.
А если захочешь соединять поля во what(), придётся делать ещё одно поле, потому что результат контатации строк тоже где-то надо хранить
Щас я вселюсь в птичку, и узнаю, что там внутри этих тестов и твоего кода.
Ну серьезно, телепаты в отпуске.
>А если захочешь соединять поля во what(), придётся делать ещё одно поле, потому что результат контатации строк тоже где-то надо хранить
Так на пике же не так?или это такой тонкий подъеб?
template<typename T, void f(T)> myallocator: public std::allocator<T>
И вот, по ходу дела нарываюсь на rebind:
template<typename Tp1> struct rebind{
typedef myallocator<Tp1,(???)> other;
}
И что это, ебать? Затребовали создать то же самое, но с другим названием параметра шаблона, заебись! Ну так а мне что ставить на месте (???) ?
При создании объекта как 2 аргумент шаблона передаётся указатель на функцию void f(T). В rebind в typedef вроде как должна использоваться void f(Tp1). Но хуй там, мы уже передали в параметр шаблона void f(T).
Получается, требование создания rebind в таком виде делает невозможным использование нонтайп параметров, зависимых от тайп параметров, без этой херни нихуя не работает.
Что за долбаебы писали STL?
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
The pointer obtained from c_str() may be invalidated by:
- Passing a non-const reference to the string to any standard library function, or
- Calling non-const member functions on the string, excluding operator[], at(), front(), back(), begin(), rbegin(), end() and rend().
Что тебе непонятно?
>Что за долбаебы писали STL
Причем тут шаблоны и стл? Стл писал математик из мгу, поэтому они такие и хуевые. А по шаблонам есть книги Александреску и Вундервурда где на 1к+ страниц все подробно разъяснено почему так, а не иначе. После прочтения, сможешь запускать программы на этапе компиляции, ибо шаблоны полны по тьюрингу
> После прочтения, сможешь запускать программы на этапе компиляции, ибо шаблоны полны по тьюрингу
Брайнфук тоже полон. Только на нём не напишешь нихуя полезного. Как и на шаблонах.
Буфферизация такая ;)
При том, что в STL посрать негде, везде напиханы ебучие шаблоны, и уж если они их использовали, то обязаны были сделать все юзер френдли. Эти уебки блять пишут СТАНДАРТНУЮ библиотеку, а не васянский высер (тогда я бы понял), при этом обоссываясь на каждом шагу и говнокодя гнилые костыли которые разваливаются к хуям при первом пуке
Оно не юзабельно, еще что сказать?
Зачем на этапе компиляции исполнять, ты поехавший? Вместо динамического бинарника 8кб тащить С++ тулчейн - охуеть
в файле обычные даблы в формате 1.2342, судя по тем тестам, которые у меня есть. В каждой строке n штук, строк также n.
Мне нужно сделать NxN матрицу из них. Длину одного числа я не знаю заранее (может быть 1.0, а может 121.77).
Есть вариант с ifstream, но хотелось бы чего-нибудь побыстрее.
>Зачем на этапе компиляции исполнять
Потому что можносовсем отупели со своими байтами, уже в сарказм не могут. То, что так можно делать, как бе намекает, что шаблоны - кривой высер
Чем числа в строке разделены, пробелами?
Если да, то читаешь строку из файла
std::string buf;
std::getline(stream, buf);
Инициализируешь этой строкой строковый поток
std::stringstream ss{buf}
Читаешь из строкового буфера числа
while (!ss.eof())
{
float i;
ss >> i;
}
да, пробелами. Мне нужен максимально быстрый вариант, собственно поэтому пришел сюда.
Этот самый быстрый или есть еще круче?
>или есть еще круче
обычный scanf же быстрее
http://stackoverflow.com/questions/1042110/using-scanf-in-c-programs-is-faster-than-using-cin
с fscanf выполняется 12.953 секунд в лучшем случае, с stringstream слишком долго выходит.
Пока что лучший результат получается с ifstream с записью в буфер – 12.713, а потом преобразованием с помощью stod. Это граница или можно еще лучше?
твой c_str вообще может указывать на незанятую память, так как приконкатенации возможен реаллок.
Бабка надвое скказала. Изначально cin/cout/cerr не буферизуются вообще, так как авторы стандарта предполагали возможность использовать iostream вместе с stdio.h.
Но у поциента не cin, у него считывание из файла, и там такой инхронизации нет. Прочитай свой ответ до конца.
http://cpp.sh/5ao2f - что за магия тут происходит? Получается делать return std::move() бесмысленно потому что это поведение по умолчанию?
Точнее даже круче, потому что объект просто создаётся в main.
https://pastebin.com/7iawqUSx
Unbranched-версия обычно быстрее на 5-10%, хотя в некоторых случаях Branched-версия вырывается вперёд. Кто может пояснить, почему так? В каких случаях лучше использовать какую версию?
То что у тебя происходит называется RVO и оно более эффективно так как полностью исключается вызов move-конструктора. Стандарт напрямую разрешает компилятору такие оптимизации, даже если move-конструктор имеет сайдэффекты (и такая оптимизация поломает твою программу). В стандарте это упоминается как copy elision (более широкий случай который кроме move-конструктора покрывает еще и copy-конструктор). Если ты нормальный парень и твои move-конструкторы не имеют сайдэффектов, то писать return std::move() нет смысла - просто возвращаешь значение и компилятор или оптимизирует с помощью RVO или вызовет move-конструктор. Использование return std::move() может принудительно вызвать конструктор (если его вызов необходим ради сайдэффектов), но тут наверное от компилятора зависит. Я не думаю что есть что-то что запрещает хитрожопому компилятору просто проигнорировать вызов std::move() в таком случае, хотя хуй знает на самом деле.
Заебали с платиновыми вопросами. На SO объяснили всё уже 100 раз.
Посмотрел ассемблерный листинг. Branched-версия генерирует cmp+jbe, Unbranched-версия - cmova и call по QWORD PTR. Кто может пояснить по хардкору за подобное? Говорят, cmov* многократно быстрее, но есть ли где-нибудь полное разжёвывание по полочкам?
Я пока посмотрел на SO, там говорят что надо везде писать return value. Сделал так у себя и посмотрел что с конструкторами происходит. Обнаружилось что если сделать так
return create_object().modify();
то вызывается конструктор копирования, а если так
Object result = create_object();
result.modify();
return result;
то вызывается только стандартный конструктор и только один раз (внутри create_object). Вторая конструкция правильная.
modify() возвращает *this если не понятно
>>974657
Аноны, помогите. Если просто добавить в класс еще одно поле, то энивей его надо инициализировать в конструкторе, т.к. what() имеет модификатор const и модифицировать строку я уже не могу. Офк можно просто создать свой метод, а не юзать what(), но можно ли как-то канонически написать свое исключение?
Например добавь const поле в класс, а в what() сделай не const ссылку на него (что-то типа std::string& s = const_cast<std::string&>(this->message);) и через эту ссылку измени.
https://github.com/theanonym/libyoba-perl
Всего ушло около 3 недель и 2500 строк, осталось ещё добавить интеграцию с некоторыми модулями вроде AnyEvent, добавить поддержку событий для лучшей связи с интерпретатором
Заебись название
А что там читать-то?
Если какая-то абстракция предусматривает явное указание начала и конца работы с ней (выделение/освобождение памяти, открытие/закрытие файла или сокета, монопольный захват/освобождение устройства), то вызов начала работы с ней должен быть в конструкторе, а конца - в деструкторе класса-обёртки.
Оно зависит от ABI.
В Itanium C++ ABI RTTI устроен довольно просто, информация об иерархии классов "закодирована" в std::type_info (в наследниках от него). https://itanium-cxx-abi.github.io/cxx-abi/abi.html
В MSABI посложнее, но тоже давно отревершено, нагуглишь легко.
А, чёрт. Зачем столько одинаковых аббревиатур? Я так годное место работы чуть не просрал, перепутав STL с SFML.
Что-то у тебя с документацией скудновато, как я посмотрю. Хотя бы Doxygen для приличия влипил (@briedf @param @return и вся хуйня), потом это сложнее будет документировать, ИМХО.
Как писать на С++ по windows( формы и т.д.)? что читать(какие средства разработки)?
qt
Анон, читаю книгу Страуструпа - Программирование. Принципы и практика использования C++, и чет как-то мне не понятно, это перевод наш косячный, или такая книга и есть.
Стандартную библиотеку предлагают в книге скачать, д.к. она не работает, что бы я не делал. Функция sort() вообще как-то по странному вызывается. В задачах текст написан так, что я не понимаю, что от меня хотят. И это только начало. Кто читал? Скажите, дальше в таком же духе будет? Может есть книги покачественней? Понимаю, что книга от создателя языка, но уже многовато косяков.
Читай это.
http://www.learncpp.com/
Автор все топики обновляет, объясняет доходчиво.
Правда на ангельском.
Мне, как новичку в крестах, заходит на заебись.
Потом уже сам буду какие-то книги искать.
У меня есть настроенный доксиген, генерирует index.html и прочие страницы, но как его на github.io залить кто-нибудь знает?
Создать сает на Github pages и залить туды.
Тоже учу кресты по нему. Косяков многовато, но я мазохист и мне нравится разбираться, почему не работает то или иное. По поводу sort() это косяк нового издания, он есть и в оригинале. Чтобы работало, нужно, во-первых, прописать #include <algorithm>, во-вторых, писать так: sort(v.begin(), v.end()), где v - вектор.
По поводу говно "библиотеки", которую Страуструп пихает в начале std_lib_facilities.h, скажу что у меня она тоже не работает. Если тебе нужны векторы, то пиши #include <vector>, правда не забудь включить поддержку стандарта c++11 в своем компиляторе.
Кто платная? Книга? Ссылка на перевод есть в шапке.
Гхм, нахуя? Каков будет результат запихивания в один шаблон, по-твоему?
Вангую что ты скачал старую библиотеку, а тебе нудна новая .тоже с ней ебся, пока не погуглил на стаковерфлов. Вобщем, гугл в помощ
Да, я тоже смог разобраться с сортировкой. С одной стороны, нахуй такие издания книг. С другой стороны, пока найдешь, почему это говно не работает, узнаешь овердохуя.
Как проверить на равенство 2 действительных чилса
Вот кусок кода который нужно исправить
while( a>=x1 ) ;
printf("--------------------\n" );
printf("\n" ); printf("\n" );
} ;
Скину 50р на тел. ответившему, больше нет на карте
Так, получилось залить доксиген https://theanonym.github.io/libyoba-perl/annotated.html
Можете посмеяться над моим английским, серьёзные ошибки неплохо бы исправить пока
wxWidgets
int f(int n, int a, int b) {
if (n > b) return 0;
if (a <= n && n <= b) return 1;
return f(2 n + 1, a, b) + f(2 n + 2, a, b);
}
1. Какие рекурсивные вызовы будут сделаны при запуске f(0, 7, 13)?
2.Что вернет вызов f(0, 1000000000, 123456789)?
3.Чему равно возвращаемое значение f(0, a, b) в общем случае?
MyStruct(){}
~MyStruct(){}
int v;
};
MyStruct a[10000000];
На ассемблерном уровне - будет ли у нас вызван конструктор миллион раз, даже если он пустой, или нет?
Зависит от опций компиляции. C -O2/3 скорее всего не будет.
Понятно, что конструктор пустой и ничего не будет инициализировано. Но будут ли вызовы конструктора вообще?
блядь блядь блядь блядь блядь блядь блядь блядь блядь блядь блядь блядь блядь
>>975625
1. Прочти свой код и выполни его без помощи компутера.
2. Не знаю.
3. Не знаю.
4. Иди нахуй со своей домашкой.
>>975665
Бабушка надвое сказала. Компилятор волен делать всё, что угодно, и конструкторы он может вызывать, а может и не вызывать, если видимое поведение не меняется (сторонние эффекты в конструкторе к видимому поведению не относятся). То есть, если у тебя в конструкторе только вызов какой-то функции, которая на состояние объектов (cin/cout и т.д. не в счёт) не влияет - компилятор может вобще не вызывать конструктор.
>>975718
struct node {
T payload;
vector<node*> edges;
} - если направленный. Если ненаправленный - чуть сложнее.
>Там инта в инициализации не хватает, если про это.
Вот именно. На кой ляд вообще нужны эти списки, в которых можно указывать не все члены? Пердолинг такого же рода, как и дефолтные аргументы - специально нужно ранжировать аргументы по вероятности их использования.
>>975737
Есть альтернатива? Инбифо bitset.
Он просто взял рандомную строку из твоей программы и подписал
> Хаха.
> Ну вы и убогие все же.
Нахуй на такое вестись?
Про bitset - это тоже шутка, знаешь ли. В высокоуровневом языке использовать bitset - это охуевшим быть.
Так что ты тоже повёлся.
>>975773
В этот раз без оскорблений, в следующий раз будьте внимательнее.
http://cpp.sh/2lcb
Понятно. Можешь сходить пожаловаться к C-богам. Мы тут только лабы первокурам решаем.
Братишка, спроси у своих сокурсников. Никому не интересно ваши лабы решать. Кроме того, тут кроме меня и пары троллей, никого нет.
Я прошу только помощь с алгоритмом.
>>975813
Имеется дерево, у каждой вершины есть имя. Хочется провести поиск по этим вершинам и отобрать только те, которые имеют определенное название. То есть получить новое дерево-результат. Но, возможно, из дерева результата придется еще раз выбрать подходящие уже под другой шаблон вершины.
Так если результаты складываются в новое дерево, в чём проблема потом по нему искать?
Есть у меня исходное дерево. Я закидываю его в дерево-ответ. В случае если ни одного запроса не пришло, выдано будет оно. Теперь я хочу искать по этому дереву. Но результаты будут складываться в него же. Причем хотелось бы удалить старые ссылки, но как разобрать, что результат нового поиска, а что старого?
>>975820
Это не принципиально, как по мне.
Так, я чет задумался, что это вроде и есть это, пошел погуглил. Это и есть тот обход которым я пользуюсь.
И каждый раз создавать новое дерево? И как это реализовать то? У меня это все в классе выполняется, где дерево-ответ является свойством объекта. Хотя возможно если завести новое дерево-буфер, перед всем шоу его очистить, туда перекинуть ответы, а потом дереву-результату присвоить дерево-буфер, то все будет хорошо. Вот так видимо сделать можно.
Что-то типа этого я и говорил. Хотя идея создавать дерево-буфер внутри функции поиска несколько облегчит код, спасибо.
Блядь, как вы все заебали сюда писать всякой хуйнёй.
Лаба не конпилируется, двач, памаги!!1
MSVS показал нипанятное акошко, двач, памаги!
Идите нахуй.
Зашёл в бинарник - там страна ассемблера, "source not available". Обычно хватает прожать несколько раз shift-f11, если будет реагировать вообще.
ты в глаза долбишься или куда?
тебе английским по чёрному написано, что сырцы на бинарник в дебаг метаинфе не залинкованы: открывай стек, смотри, где ты находишься (какая DLL или либа) и перекомпиливай её с PDB. либо же у тебя визуалка PDB не видит. откда такие дауны вылазят?
Да эти макаки в студии не могут найти эти ключи.
А без студии хелло ворд не напишут.
Тру стори.
Сейчас приходится под прыщами Valgrind-ом пользоватся, но проект требуют профилировать и в шинде (от чего я в тупике).
Сейчас набежит местный школьник и начнёт боготворить MSVS и обвинять тебя в использовании vim.
callgrind, cachegrind
ещё один аутист: он говорит о том, что школьники не найдут нужный флаг в msvc, а ты vim впихиваешь зачем-то
в msvc 2017 встроена поддержка cmake. импортишь и профилируешь прямо из визуалки.
второй вариант для эстетов -- попердолится и запустить сборку с cmake, но с визуальным компилятором (включив нужные флаги чтобы метаинфа была). и уже потом аттачиться к приложению и профилировать его визуалкой.
ты меня запомнил!
>>975731
Вообщем нашел ответ сам.
Если твой класс/структура - POD, то конструктор вызван не будет, более того - он даже не будет сгенерирован.
Если класс не является POD, в нём есть хотя бы один член с конструктором - то вместо пустого конструктора твоего класса, будет сгенерен конструктор, который вызывает конструкторы всех мемберов.
>>975680
Вон из треда, долбоеб, не хотел тебе отвечать, потому что ты даун, но всё же покормлю. Твои кукареки и "выебоны" про ассемблерный листинг - полная хуйня. Листинг никогда не ответит на вопрос о стандарте.
Студент, тебе что, на паре препод показал как смотреть сгенеренный код и теперь выебываешься на бордах, да?
мона, только он может уебанско выглядеть на маленьком экране
>либо ебаться с компиляцией.
Это в плюсовом проекте норма, а если используются хидер-онли библиотеки можно вообще взять и завендорить их себе в код, и забыть вообще.
*для каждой структуры. Надо проснуться.
Я видимо непонятно выразился. Для обхода массива используют обычный цикл с итератором, у меня же, этот обход реализовать заметно сложнее, поэтому хочется отдельную функцию. Но как сделать так, чтобы то действие, которое при обходе массива указывается в фигурных скобках цикла, тоже передавалось в функцию обхода.
Что?
>Листинг никогда не ответит на вопрос о стандарте.
Цитирую твой вопрос, кусок дебила:
> На ассемблерном уровне - будет ли у нас вызван конструктор миллион раз
ни слова про стандарт.
Теперь иди на хуй.
Родили уже QML с кривыми компонентами. Особенно пиздатая фича вышла в 5.8 (которую в 5.8.1 поправили, вроде как) - кэкирование компонентов, грузишь такой правки - оп, а их нихуя и нету, оказывается.
Пишу свой сервис для винды, он должен использовать .dll для работы с камерой. Пока это консольное приложение - все отлично работает, но если переделать на WinService, то будет немедленно выкидывать с Error:1053, при попытке запустить сервис. Если закоментировать методы из .dll, то сервис регистрируется нормально, но если добавить хоть что-то из нее - неудача. Может надо как-то специфично подключать .dll при написания сервиса или что? Почему все работает в консольном варианте?
Сап, почему при использовании свитча выполнение красной скобки игнорируется? Без свитча все работает
Уже не актуально, проблема была в правах доступа.
>>976323
а ещё в 5.8 запилили oauth2 (https://doc.qt.io/qt-5/qtnetworkauth-index.html), только с ним можно делать только get запросы. для post надо выковыривать из инстанса bearer, вставлять его в заголовки ручками в network manager и только потом делать запрос
Ну ты для начала с языком программирования определись. Начал мешанину причем из стандартной библиотеки c и stl.
Вообще эта хуйня у тебя не должна компилироваться, потому что объявление переменных в switch-case недопустимо (если только они не ограничиваются областью видимости внутри конкретного case), например. такое можно:
switch (a) {
case 1: {
int x = 0;
printf("%d", x);
break;
}
case 2: ... ;
}
А вот так нельзя:
switch (a) {
case 1:
int x = 0;
printf("%d", x);
break;
case 2: ... ;
}
>A: Ни один язык не идеален, но по совокупности киллер-фич C++ оставляет все остальные языки позади. Вот основные три:
>Мощь
Блядь, проиграл. Ладно если бы под этим словом понималась скорость, но она пунктом выше.
То ли ты хочешь сделать своб функцию обхода массива, то ли ты хочешь структуру. Охуительная история.
Напиши минимальный код, по которому видно задачу и проблему.
Родина дала нам if else switch case .
Похоже на UB выше в коде.
> Очередной петоно-дебил не понимает, что с прямым доступом к памяти заведомо можно реализовать любую другую фичу из любого языка
Тьюринг-полные у нас даже НАМы и Brainfuck-и.
Вместо мощи можно написать про метапрограммирование и SFINAE.
я про само слово. МОЩЬ. МОЩНЫЙ язык программирования.
Ну реализуй мне честный, не консервативный, GC. Интересно, как тебе тут "прямой доступ к памяти" поможет отличить указатели от данных.
https://pastebin.com/0Z4siSd9
Что нужно сделать, чтобы каждый раз не писать этот for, а только конкретное действие?
Нужно объявить Tree_node инстансом тайпкласса Traversable и реализовать для него какую-нибудь функцию из Traversable, например, foldr
Ну или сделай так https://pastebin.com/nvRYJf33 и используй foreach-loop
доопредели там begin/end для const Tree&
И у тебя в Worker принимается зачем-то по значению
Господа, помогите начинающему
Код
#include <iostream>
#include <cstring>
/ run this program using the console pauser or add your own getch, system("pause") or input loop /
int TestAr() {
char chararray[50];
printf("%s", chararray);
strcpy(chararray, "test test test");
printf("%s", chararray);
TestAr();
}
int main(int argc, char argv) {
TestAr();
return 0;
}
Среда Dev C++ Всё работает.
Как выделяется память для массива chararray[50]? Раньше я думал, что она статически выделена в функции и уже есть в экзешнике, экзешник загружается в память и память под этот массив уже выделена в функции, ещё до её вызова. Но, поебавшись с указателями пришел к выводу, что всё не так просто. Что происходит при последующем рекурсивном вызове этой функции?
Я раньше байтоебством не занимался.
push rbp //заталкивает в стек "это указатель на адрес базового сегмента текущего стекового кадра"
mov rbp, rsp //копирует адрес базового сегмента текущего стекового кадра в "указатель на вершину текущего стекового кадра"
sub rsp, 64 //вычитает из "указатель на вершину текущего стекового кадра" 64, т.е. указатель начинает указывать на адрес, расположенный на 64 адресных единицы ранее.
lea rax, [rbp-64] //помещает в регистр rax адрес [rbp-64], как я понял равный rsp, потому что из rsp уже вычли, а в rbp находится значение rsp до вычитания
mov rsi, rax //перемещает полученный ранее адрес в регистр смещения
mov edi, OFFSET FLAT:.LC0 //хуйня какая-то не гуглится
mov eax, 0 //затирает регистр еах нулем
call printf
Из всего вышесказанного вытекает нижеследующее: память под массив выделяется из стека каждый раз при вызове функции? Именно поэтому через некоторое время работы программа завершается с сообщением segmentation fault - стек залетает на программный код. Я правильно всё понял?
Если Я сейчас это сделаю, прост сразу интересуюсь. я сделаю динамический массив через *chararray=new char[50]; то будет расходоваться память из кучи и программа просто начнет жрать память?
https://pastebin.com/ej31QGGz
>>976894
спасибо,
а других способов нет? просто мне нужно пока что как-то без этого реализовать
//Создайте метод GetString(), который обеспечит доступ к хранящейся строке.
//С помощью cout и метода GetString() распечатайте строку объекта str
ОшибкаC3867"MyString::GetString": нестандартный синтаксис; используйте "&", чтобы создать указатель на член
я так пробовал вот что вышло, что это значит хз
>>976875
>>976869
>>976846
>>976839
Всё работает, выпадает потому что стек заканчивается. Когда объявляю массив через new, то завершается через 43000 рекурсивных вызовов независимо от размера массива, когда статическим массивом, то чем больше массив - тем меньше итераций, очевидно быстрее жрется стек. Исправьте, пожалуйста, если я не прав.
В микроконтроллерах использование памяти: программный код, стек и куча такое же или отличается?
Что такое Traversable?
>>976819
Оооотлично.
void Tree_node::apply(void( ЗВЕЗДА f)(&Tree_node)){
for(auto &node: Down){
f(Down);
}
}
.........
huyacknut(&Tree_node node){
node.payload=0xFFF;
}
.........
int main() {
Tree_node ldkjf;
......
ldkjf.apply(&huyacknut);
}
> Что такое Traversable?
http://hackage.haskell.org/package/base/docs/Data-Traversable.html#t:Traversable
>void Tree_node::apply
Для этого есть std::for_each. C++ не Java, тут поощряются freestanding-, а не member-функции
>int TestAr() {
>\tchar chararray[50];
>\tprintf("%s", chararray);
Использование неинициализированной памяти, undefined behaviour.
Компилятор вообще не обязан выделять место под chararray, так как заведомо известно, что в нём будет, и вместо этого может подставлять адрес строки из экзешника в каждый вызов printf.
>Раньше я думал, что она статически выделена в функции и уже есть в экзешнике
Выделяется на стеке на каждый вызов. Если напишешь static - будет выделяться на стеке один раз, перед вызовом main.
>Что происходит при последующем рекурсивном вызове этой функции?
Заканчивается место на стеке и хуяк.
>>976910
>когда статическим массивом, то чем больше массив - тем меньше итераций, очевидно быстрее жрется стек.
Ты путаешь static с локальной переменной (выделяется на стеке)
>Ты путаешь static
Я понял про что ты, но до этого еще не дошел. Я не правильно употребил термин "статическим" - здесь это значит только то, что он выделен не из динамической памяти, а объявлен заранее.
>Использование неинициализированной памяти, undefined behaviour.
Это было сделано, чтобы посмотреть, а не один ли массив будет использоваться для всех вызовов. В оконечном тесте уже убрал строку.
>Выделяется на стеке на каждый вызов. Если напишешь static - будет выделяться на стеке один раз, перед вызовом main.
И тогда все вызовы функции будут фактически оперировать с одним и тем же массивом, постоянно висящим в памяти, но видимым только из этой функции - я правильно понял?
>Это было сделано, чтобы посмотреть, а не один ли массив будет использоваться для всех вызовов.
Как проверить, выделяет ли компилятор память или нет:
- в int main выводишь адрес любой глобальной переменной ( %p в printf, & перед соотв. аргументом)
- делаешь фиксированное число вызовов (статично хранишь число, чтобы контроллировать глубину рекурсии)
- после достижения предельной глубины выводишь адрес той же глобальной переменной.
Потом делаешь такой же код, но в нём делаешь что-то посложнее, чем printf, чтобы компилятор подумал, что память выделять таки надо. Если разница между двумя адресами увеличилась - значит, компилятор экономит память в первом случае.
>И тогда все вызовы функции будут фактически оперировать с одним и тем же массивом, постоянно висящим в памяти, но видимым только из этой функции - я правильно понял?
Да.
Ну и как мне написать инициализацию массива-члена? Голову сломал.
>>976953
Если тебе нужен конструктор из базового класса, он должен быть либо протектед, либо публик. Если это не так, исправь это.
когда пишут:
Создайте глобальную функцию
Хуй Hui(Хуй, Хуй);
которая принимает два объекта класса Хуйпо значению и
возвращает объект класса Хуй,
как её в итоге в мейне вызывать?
так ?
Хуй h;
h.Hui(...); // но какой тгда тут смысл, надо было тогда через this писать
или так
h = Hui(...); // но тогда ошибка
Поясните кому не лень< плиз.
gdb говорит следующее
https://clbin.com/N3rzrw.png
Раньше все работало, но я в этом месте вроде как map, заменил на vector. Вот весь код
User.cpp https://pastebin.com/nyuwaQay
Tree.h https://pastebin.com/qR2bpW8s
Server.cpp https://pastebin.com/Cc2X6QUh в нем, в 37 строке и происходит что-то непонятное
Объявление структуры Tree_node происходит в ашнике, описание методов класса в файле класса, остальных функций в Server.cpp, там же лежит мейн.
Канеш проще, только я хочу сделать наиболее простым путём. Какого ляда C++ считает, что список инициализаций - это список присваиваний? Бесит.
Прошу прощения. В проблемной строке не
Top_node->Down[Top_node -> Down.size()] = &Construction_tree(Simbol_, file);
А
Top_node->Down[Top_node -> Down.size()] = Construction_tree(Simbol_, file);
Нет амперсанда. Это я не ту версию показал, выхлоп ждб такой
https://clbin.com/p0fXIU.png
Жадным можно.
эта херня появилась после того, как я сделал виртуальным 1 из методов класса, что это вообще?
хотя это между собой не связано..
>прочитал книг 6 по паттернам
> GoF
Как ты не заснул? Я засыпаю на второй странице чтения этого.
Я программист уже 4 года профессионально.
Программирую на руби. На досуге увлекаюсь Erlang, Clojure, C/C++. На руби уже надело, в основном рутина, ничего интересного. Хочется думать и нести радость людям написав какой нибудь там автопилот например.
Подскажи, требуются ли в рашке программисты на C/C++ или это уже утопия и все дрочат на go/ruby/php ?
Аналитически или численно? Фгугл.
Точнее: перебором с O(n). Если дашь ссылку на судью, я тебе сбацаю.
>>977460
Симулируй работу парикмахера и прихода/ухода всех этих идиотов. Натурально: берёшь и релизовываешь конечный автомат (состояние содержит текущее время, очередь на это время с фасонами) по условию задачи, больше ничего не надо.
ifstream file(_name, ios::binary);
компилятор компиляет только когда _name - char, а мне нужно, чтобы WCHAR (wchar_t, как я понял это одно и тоже) неужели у красноглазых нет юникода в путях?
Нашел на стековерфлов как там кто-то что-то скачал и собрал и вообще руками всё конвертирует в чар и доволен. Но я не верю, что там нет готового.
Это, как следует из названия, минимальный порт GNU-тулз на Windows. Оно не стремится имитировать POSIX-окружения. Для последнего есть Cygwin. И WSL.
Короче, если ты так хочешь utf8 везде, посмотри в сторону nowide. http://cppcms.com/files/nowide/html/index.html
Оно есть в отдельной от boost форме.
и нихуя не понимаю.
Анон, покажи как писать Web сервисы на крестах в продашоне
Хочу нагнуть golang-ёбов для этого мне нужна сила плюс и мудрость двоща
too fat
С чем связана это сраная ошибка? Нигде нормальной инфы нет.
VS 2015
Хуйню он сморозил, вот тебе подробности.
Я придумал за O(m logn) решение, где m - количество выговоров. Просто эмуляция начальника на дереве поиска. Можно парой эвристик ускорить, но в общем случае без ограничений на ответ будет медленно работать.
ещё-один-анон
Animal zoo[]={Animal(),Cat(),Dog()}
А надо так:
Animal* zoo[]={new Animal(),new Cat(),new Dog()}
Это разные объекты, они занимают разное количество памяти.
У тебя, например, базовый объект 8 байт весит, а наследникам ещё int добавили, стало 12.
Выделение памяти под массивы происходит "под линейку" тебе надо 100 объектов Animal, она тебе и выделила эти 800 байт. Понятно, что запихнуть в i слот Dog или Cat не получится.
У указателей же постоянный размер 4-8 байт в зависимости от компилятора. Во втором случае ты выделяешь память на 3 указателя, те уже в свою очередь ссылаются на реальную память, а там уже объекты могут сколько хочешь весить.
Потому что это не Java
Вот две функции. Считывание дерева из файла и его удаление. Почему-то команда delete Top_node, где Top_node это указатель созданный через new в другой функции, на вершину не хочет работать и падает с ошибкой памяти. Не знаю, в чем ошибка.
valgrind
Да, нужна какая-то программа, на которой это всё падает. И файлы с примерами, если есть.
Тут магов нет, никто с первого взгляда рандомный код не умеет по полочкам расставлять.
И там должен быть файл с лицензией, точнее, с уведомлением, что ты передаёшь код в публичное достояние.
Есть класс, допустим, classType. В нем, кроме всего прочего, есть конструктор копирования.
В maine есть объекты classType a,b. Где-то задаются параметры объекта a, после чего я пишу b=a. Почему в этом случае конструктор копирования не вызывается, а при classType c=a вызывается?
https://pastebin.com/3jXs6fKc вот мейн, проблемная строчка там (Server.cpp)
https://pastebin.com/rW8Tswsi вот ашник, там и объявляется структура Tree_node (Tree.h)
чтобы все работало нужен еще этот файл, который стоить назвать User.cpp https://pastebin.com/9fMg1eKP
https://pastebin.com/6Ttddnb4 вот проблемный файл. Назвать нужно Base.txt
Вся беда в процедуре удаления дерева, которое создавалось конструкцией нью. В этой функции есть отладочный вывод, который показывает, что вроде как ни одного делита не выполняется, но функция завершается несколько раз, кроме самого последнего. Как такое возмжно я не понимаю
int main()
{
Tree_node Top;
Cleaner(&Top)
}
void Cleaner (Tree_node * Top_node)
{
delete Top_node;
}
О, вот и ответ. Спасибо тебе, анон, пускай ты и пидор.
Кстати вопрос. Я вот получил указатель на память. Почему я не могу удалить память по указателю?
А ну да. Мне из функции возвращается указатель, а я из него достаю объект и помещаю в статическую память. Все, понял, осознал.
>>977894
Это, кстати, не я.
>>977896
Но сегодня вы опоздали.
Хуическая.
Можно, наверное, называть автоматической. Не совсем корректно, но сойдёт.
Вкину годный линк для всех. Обсоски ничего не могу ответить про продакшн программирование на крсетах
https://github.com/fffaraz/awesome-cpp
Бляди бля
Жаль.
Вот допустим, я написал .dll, функции из которого локальные и статические переменные точно свои для каждого процесса я хочу использовать в нескольких работающих одновременно процессах (допустим, их очень много). В таком случае, если несколько процессов, использующих эту .dll работают одновременно, то для каждого процесса в его виртуальную память (далее ВП) загружается своя копия .dll, и при создании каждого процесса из исполняемого файла загрузчик вписывает адреса вызова функций в секцию с таблицей импорта? Или загрузчик достаточно умён, чтобы использовать единожды загруженную .dll между несколькими процессами? Или такое верно только для системных .dll, а для пользовательских - только MMF в отдельном гигабайте ВП?
Там хитро. Решение основывается на поиске минимального значения, при котором программистов можно накачать. Накачку следует рассматривать отдельно - как косвенную и как прямую. Для каждого числа выговоров есть число программистов, которое будет накачано только косвенно. Необходимое число прямых накачек ненакачанных программистов вычисляется, и если оно больше числа пассивных накачек - перебор продолжается.
Перебор можно выполнять не линейно, а двоичным поиском, а если всё свести в одну формулу, можно упростить вычисление (но это непринципиально). Можно было бы решить уравнение, но нужно решать его либо в даблах (и тогда хрен знает, правильно или нет), либо округление вверх как-то учитывать. Так что двоичный перебор проще.
Одна и та же, а потом механизм copy-on-write.
Всё бы ничего, но идея, которая стоит за решением, не понятна.
Например,
>и если оно больше числа пассивных накачек - перебор продолжается
откуда следует это?
И вот если я оценю минимальное и максимальное количество выговоров какой-то эвристикой, то как делать перебор между этими значениями? Выходит уравнение с 200к неизвестными, не совсем ложится под понятие перебора.
>откуда следует это?
Могу доказать теорему о том, что если выполняется упомянутое условие (число необходимых прямых меньше= числа пассивных), то оно выполняется для всех больших чисел.
>И вот если я оценю минимальное и максимальное количество выговоров какой-то эвристикой
Минимальное - это 1. Максимальное - это тупо 200000, для двоичного поиска это не важно, число итераций - 18 (262144=2^18).
>как делать перебор между этими значениями?
Двоичный поиск, блет. Значения отсортированы по критерию выполнимости искомого условия - для всех значений начиная с некоторого оно выполняется.
Пиши на почту, если хочешь.
Не понял. Я, кстати, другой анон. У меня жопа не горит задачу решить, просто хочу понять.
>Могу доказать теорему о том, что если выполняется упомянутое условие (число необходимых прямых меньше= числа пассивных), то оно выполняется для всех больших чисел.
Я воспринял эту строку как "Я могу доказать теорему, что если это условие выполняется, то оно выполняется"
>Минимальное - это 1. Максимальное - это тупо 200000, для двоичного поиска это не важно, число итераций - 18 (262144=2^18).
Ок. Это я понял.
>Двоичный поиск, блет. Значения отсортированы по критерию выполнимости искомого условия - для всех значений начиная с некоторого оно выполняется.
Вот это я не понял. Пусть я отсортирую всех программистов по убыванию производительности. Это ведь имелось в виду? Если нет, то прошу пояснить. И у меня на текущей итерации n выговоров. Что дальше происходит?
>Я воспринял эту строку как "Я могу доказать теорему, что если это условие выполняется, то оно выполняется"
Если условие выполняется для X, то оно выполняется для любого числа больше X.
> И у меня на текущей итерации n выговоров. Что дальше происходит?
n выговоров - это пассивные выговоры. Что ты делаешь дальше:
- число ненакачанных = число - n*y
- у ненакачанных одинаковый уровень накачки. Тебе нужно накачать оставшихся прямыми выговорами с эффектом y-x
- как накачать оставшихся только прямыми выговорами (т.е. без косвенной части, мы её исключили) - поймёшь сам, если нарисуешь лестницу.
- если ты не можешь накачать оставшихся с помощью n выговоров, поиск продолжается.
Поиск начинаешь со 100000. Если накачка взоможна, перемещаешься на половину диапазона влево (т.е. можно лучше). Если невозможна - на половину диапазона вправо. Это двоичный поиск.
>>978093
Чот я ипал.
>/temp/compiling/source.c:1:20: fatal error: iostream: No such file or directory
>#include <iostream>
> ^
>compilation terminated.
Что это за C++, если в нём iostream нету?
Минимальное - это 1. Максимальное - это тупо 200000, для двоичного поиска это не важно, число итераций - 18 (262144=2^18).
Хотя, эту часть я тоже не понял. Я думал, что перебор по ответу, но это перебор по программистам, по которым кричали/не кричали, видимо.
>>978105
Ну вот тут основной вопрос, как перебирать. Потому что сам по себе перебор в лоб - это в худшем случае количество итераций в районе 10^9. То есть разгонять тех, кто больше всех нуждается по очереди. Например, берём программиста, которому нужно со скоростью а (максимальная среди всех) работать, накачиваем его на a - (x-y), возвращаем обратно в очередь с приоритетом, берём следующего с максимумом. И пока следующий прогер не будет пассивными разгонами уходить в минус.
>Что это за C++, если в нём iostream нету?
Видимо, это C.
> Я думал, что перебор по ответу,
Ты можешь накачать всех программистов за 200000 выговоров: y>1. Можно точнее, но не нужно.
>Ну вот тут основной вопрос, как перебирать.
Двоичный, мать его в сраку, поиск, по отсортированному, якорь им в ебало, значениям числа выговоров. Я уже всё разжевал, осталось только головой подумать.
Ё, там не 200к выговоров. На каждого чувака может быть больше одного. Т.к. нам нужно накачивать на числа до 10^9, то и число выговоров может быть близко к этому числу. Ну запилить на 100кк выговоров пример можно не напрягаясь. А значит, что по способу выше я не смогу позволить себе даже одну итерацию сделать.
Всё таки это олимпиадная задача, а не энтерпрайз параша, которая нас всех ждёт. Можно было бы хотя бы попытаться объяснить.
>На каждого чувака может быть больше одного.
Количество чуваков < 200000, y>=1. То, что x и y могут быть большими - не важно ВООБЩЕ.
Даже если бы оно было бы 10^9 - это 30 итераций вместо 18, в каждой из которых я делаю фиксированное число вычислений.
>Всё таки это олимпиадная задача, а не энтерпрайз параша, которая нас всех ждёт. Можно было бы хотя бы попытаться объяснить.
Залупанцу надо задачки преподу сдать, и он этот тред читает. Я и так же объяснил, как мог, чтобы и вы тоже подумали.
Ещё раз. Делишь влияние выговоров на косвенное влияние и на прямое. В каждом наборе выговоров есть некоторое число заведомо накачанных дебилов - они находятся в начале.
- Ты перебираешь число косвенных выговоров (т.е. выговаривают всех, кроме тех, кто в начале и сам будет въёбывать) - n.
- число тех, кого не накачали n косвенных выговоров = число дебилов - n*y (элементарно)
- у ненакачанных одинаковый уровень косвенной накачки, поэтому ты вычитаешь его и ищешь число необходимых прямых накачек эффектом y-x
- как накачать оставшихся только прямыми выговорами (т.е. без косвенной части, мы её исключили) - поймёшь сам, если нарисуешь лестницу от 1 до числа ненакачанных
- двоичный поиск продолжается с учётом того, можешь накачать оставшихся с помощью n выговоров (т.е. прямых накачек нужно больше, чем косвенных) или нет.
Разумеется, я могу разжевать ещё сильнее, но это уже неинтересно.
Или вообще T?
В общем то это и есть симплекс метод. Главное правильно определиться с тем что есть что.
>Что есть за тип T[][] ?
Это ни хрена не тип. T[][6] - это тип. T[][6][5] - это тип. T[] - это тип. *T[] - это тип. А T[][] - это не тип.
Yes. You are right.
And you forgot to check the missed article "a" error before the "language" word.
At so, what a language.
Where are you all?
нет, what language. артикль "a" лишний.
at so - это ващпе пушка. не стоит переводить комбинации частиц и местоимений с русского на английский дословно. с высокой вероятностью результат будет бессмысленный.
В некоторых фильмах слышал, говорили At so... как аналог well, типа "И так.." в контексте продолжения мысли.
Может конечно и померещелось.
Понятно.
У меня ебанутая задача из плюсового приложения вызывать сишные функции одной билиотеки, причем сишная библиотека дохуя сложная в плане своих типов... (Вложенные структуры, указатели на массивы и прочее.)
Заебался я уже этот врапер делать, но свою библиотеку писать - сроки проебать.
не самое уместное употребление fluent. при использовании fluent + %language% обычно речь идёт о том, что кто то говорит или пишет на чистом %имяязыка%, но не использует чистый %имяязыка% для %цель%.
We don't.
I work in a Russian company..
Early we used broken English but now we decided to use pure Russian.
Это прилогательное означает "свободно владеющий", "свбодный", и обычно сочетается только с понятием уровня владения чего либо в таком контексте.
Даже по русски криво говорить "Я использую беглый английский в своих комментах".
Таки да.
Какая часть "broken english" тебе непонятна? :3
>>978190
>ну несмотря на некорректность его мысль бы поняли.
Ну уж нет. Корректность - это хорошо, даже если всем похуй.
Где бы только ее взять.
И так, уже нашел человек пять англоговорящих из разных стран, но поговорить из-за часовых поясов и работы обычно нормально не выходит.
У меня еще норм.
Я хоть о спряжении глагола забочусь.
Некоторые у нас вообще писали.
I want look result in next week.
Вроде и понятно самим рускоговорящим, но когда так пишешь иностанцем, зачастую они могут тебя реально не понять, и следует серия переспросов - когда, что именно и зачем.
Спать надо просто.
Я понял, как решать. Не понял только, как тот хитрый критерий применять, но остального достаточно для решения задачи.
А не, всио понял.
один из них потомок другого и используя указатели каждого из них динамически выделяется массив элементов потомка
нужно вызвать метод, выводящий строку на экран,
но проблема в первом массиве, где указатель базового типа, а элементы потомка, там только для первого элемента создается объект типа потомка, немогу понять почему так и как это разрулить
https://pastebin.com/30g8Y1Pq
http://ideone.com/NojQrn
Что тут не так? Вроде всё, как задумано.
В общем случае, так нельзя делать. Это всё работает только потому, что объекты одинакового размера.
у меня на этой строчке
pShapes.WhereAmI();
после второй итерации цикла выходит такое:
почему то в массиве pShapes только в первом элементе создается объект типа Rect и я не могу понять почему
Exception thrown: read access violation.
pShapes-> was nullptr.
If there is a handler for this exception, the program may be safely continued.
Там всё нормально создаётся. Выведи в консоль sizeof(Shape) и sizeof(Rect). После этого хорошенько подумой, что ты сделал не так. После этого спрашивай дальше.
вот с твоим кодом, что получается,
а в pShapes[0] есть объек Rect
а в pShapes[1] уже нет (я хз почему)
и поскольку это вызов по объекту, то вызывается метод для объекта Rect и вылезает ошибка, потому что объекта нету
насчет sizeof, ну да, я понимаю, что дочерний класс занимает 24 байта, а не 8, как базовый, но это ж мне ничего не дает, я ведь просто вызываю метод, выводящий строку на экран, я не манипулирую никак с данными..
ну окей, это образщение к данным
но в данном конкретном случае мне не важно сколько памяти занимает объект массива
проблема-то не в этом
ведь у меня указатель базового класса на динамически выделенный массив элементов дочернего
я ж пишу
Shape* pShapes = new Rect[10]
дайте мне десять элементов типа рект и направьте на первый элемент указатель типа базового класса
если у меня есть базовый класс A и дочерний B
как можно проинициализировать
B b();
A p = &b;//по идее так можно делать, если A базовый для B, но
знаю, что можно так,
A p = new B;
но мне нужно, чтобы именно для объекта b направить этот указатель, что бы потом через него вызывать виртуальный метод
когда я пишу так:
A p = &b;
мне пишут: a value of type B()()" cannot be used to initialize entity of type "A*"
почему, если это указатель на базовый для объекта b тип???
У меня есть класс clas_name, при объявлении которого нужно указывать аргументы.
clas_name object(4, 4, 1, 8);//например
И мне надо сделать массив таких объектов с одинаковыми аргументами, как?
Бля, ну я пытался. Абу пидор.
std::vector<Foo> thousand_foos(1000, Foo(42));
я вообще С# + JS мидл под АSP, вкатился вайти в 27, вот уже 3 года работаю, вышел на норм зп. и т.д., а ща перебрался на на еще более коровые задачи, и удаляюсь от веба.
Но все это время по ночам под одеялкой кодал на сях под STM-ки прошивочки для всякой хоббийной и не очень поеботы, даже заработать успел малех. Ща понимаю что Шарпы оче ограничивают вендой, а мои хоббийные проектики требуют реализации уже во всяких эмбедед вариантах под линупсами. Какие-то простые вещи делал на сях в консольке, но уже тесновато. В общем, ща взялся учить плюсы, но одолевает сомнение небольше -
по факту мне нужно как низкоуровневый контроль регистров/ножек железяки, так и некоторые ГУИйовины пилить. И понимаю что должно быть все кроссплатформененько. Исходя из этого в прикладном варианте вижу Qt решением своих проблем, но показалось что для нормального кодинга на Qt стоит довольно существенно освоится в плюсах.
Собственно вопрос - насколько С++ для моих задач лучший выбор инвестиций времени? Не будет ли достаточно Пайтона? Есть ли какие-то другие сильвер-буллеты для косплатформенной разработки низкосреде,
скорееуровневых апликух для всякий этих IoT?
Я в состоянии только первокурам помочь лабы решать)))
Не совсем понятно, чем ты там занимаешься. Если для настолок нужно что-то кросплатформенное, то можно смело перекатываться в JVM-языки, тысячи их: Java, Groovy, Scala, Kotlin, JPython. В многие ARM чипы встроены интерпретаторы JVM-кода, должно достаточно быстро работать.
Если ты там что-то для слабых железяк пишешь, то скорее всего у тебя будет только C, если повезёт, то C++.
>Комрады, вопрос -
>я вообще С# + JS мидл под АSP,
>ко ко ко
Так бы и сказал, что ты петушок.
>вкатился вайти в 27, вот уже 3 года работаю, вышел на норм зп.
Всегда удивляли такие. Можно поинтересоваться, а что ты делал до 27? Писюн малафил и смотрел аниме? А потом БАЦ такой "надо стать ойтешнеком))". А потом и получаются говнокодеры.
Начинать учить программирование надо с первого класса, а как только закончишь 9 классов, в 15 лет идти джуном.
> и т.д., а ща перебрался на на еще более коровые задачи, и удаляюсь от веба.
>Но все это время по ночам под одеялкой кодал на сях под STM-ки прошивочки для всякой хоббийной и не очень поеботы, даже заработать успел малех. Ща понимаю что Шарпы оче ограничивают вендой, а мои хоббийные проектики требуют реализации уже во всяких эмбедед вариантах под линупсами. Какие-то простые вещи делал на сях в консольке, но уже тесновато. В общем, ща взялся учить плюсы, но одолевает сомнение небольше -
>по факту мне нужно как низкоуровневый контроль регистров/ножек железяки, так и некоторые ГУИйовины пилить. И понимаю что должно быть все кроссплатформененько. Исходя из этого в прикладном варианте вижу Qt решением своих проблем, но показалось что для нормального кодинга на Qt стоит довольно существенно освоится в плюсах.
МК только на С прогают(и немного на асме), ты че. Qt это ж на виндовс, а не мк.
>Собственно вопрос - насколько С++ для моих задач лучший выбор инвестиций времени? Не будет ли достаточно Пайтона? Есть ли какие-то другие сильвер-буллеты для косплатформенной разработки низкосреде,
А Пайтона под мк и нет, лол. Только С, только хардкор. Хотя с++ в любом случае тебе будет полезно, так как:
1)он подвид си и в си ты тоже повысишь скилл;
2)сможешь писать совместимое с мк по для компьютера, ведь с++ компилятор и си поддерживает
> скорееуровневых апликух для всякий этих IoT?
А вообще, этим в /ra/ занимаются, там есть треды посвящённые МК, ПЛИС, и arm.
Писал под ARMы 4е, до этого под 8-бит контроллеры, ща под RPi пробую писать, т.е. под ARM и линь. Какого-то платформоспецифичного кода не планирую, по факту просто хочу универсальности. JVM смущает, хотя то это сейчас это вин не отрицаю. Но настолько радикально менять экосистему не хотел-бы. Все таки плюсы или пайтон скорее просто дополнят мой "портфель" навыков для винды и откроют двери в линь.
>Так бы и сказал, что ты петушок.
Так ты ж сам все сказал за себя, чо мне клаву топтать лишний раз.
>Можно поинтересоваться, а что ты делал до 27
Чего тебе горит-то? В том числе кодил, но на тех позициях где кодить было скорее просто полезно чем необходимо, а основными задачами были писать всякие xslt карты конвертации, cmd скприпты и прочее околоайти. А потом манагерил нескольких вонабидевелоперов. Проблемы начали тогда когда я понял что мне приятнее самому в коде колупаться чем манагерить, и тогда решил вкатиться по полной, подтянул забытое и пошел джунить за хлеб с ЗП с пары кусков баксов на пару сотен. А ща вернулся на х2 от того со скольки уходил. В общем, нехуй всех судить по одному посту, признак быдла.
>МК только на С прогают(и немного на асме), ты че. Qt это ж на виндовс.
Штобля? Под что компилятор в asm напишут, на том и прогают. Под те же STM-ки из коробки есть либы и под С и под Плюсы. Под другие мелкие железяки встраивают интерпретаторы Lua, порой Пайтон, а иногда даже JS. Но да, C как бы стандарт де-факто.
По поводу Кьюта под Винду это ты что-то в лужу перданул. Видна там только одна из 3ти (или более) целевых осей.
>А Пайтона под мк и нет, лол. Только С, только хардкор.
Я ж говорю - мне ща более в системное/эмбед программирование нужно влиться. Хуй на МК, там все понятно, и моих С там хватает.
>в 15 лет идти джуном.
Анука скажи что ты джуном ебашишь с 15ти?
Ну и типа не влился до первой малафьи - не кодер?
Футаким снобом быть.
Платиновый нуфажий вопрос:
На вижуалке17 поставил Incrediбил (повелся, на рекламу), начал собирать через него и пизданулся стандартный сборщик.
Можно ли его быстренько выпилить и откатить это все или проще уже переустановить?
>>978435
Насколько низкоуровневый. Вообще, под микроконтроллеры, а частности ARM'овские имееются множество библиотек начиная с тех, которые просто предоставляют тебе доступ к регистрам, а дальше ты уже сам решаешь что как и когда выставить (то есть тут с даташитом придется очень плотно работать, потому что наебать самого себя шанс очень велик), емнип CMSIS назвается, есть и по-проще, например STM standard peripheral library, которая позволяет тебе с наименьшими усилиями конфигурировать все свое имущество. Для петухов, которые даже в это не смогли сделали отдельную штуку, называется mbed. Ну, и, естественно, к этому всему добру можно еще прихуячить какую-то RTOS, например FreeRTOS или eCos.
Конкретно по микроконтроллерам и крестам, все нормально будет, только вот не стоит увлекаться динамической аллокацией памяти, потому что можно ее охуительно фрагментировать и будет очень весело. Лучше использовать пулы или статику.
На микроконтроллерах, естественно, никакого Qt нет и быть не может, зато есть немного гуевских ПЛАТНЫХ библиотек, конечно же, на Цэ.
Касательно embed-а, то тут, мне кажется, что тебе бы для начала освоиться, как собрать дистриб Linux, не используя готовое решение, то есть ядро, дрова по необходимости, гуй и прочее говно, а потому уже в этот самый embed и влазить, потому что, очень много чего там делается на линуксе. Конечно, не стоит отметать WinCE, но тут проще на шарпах будет, я так думаю.
Однако, я, например, на работе пилил софтину для пульта управления, все говно вертелось на линуксе (не голом, конечно же, но софта там было минимум тайловый менеджер окон, базовы набор дров, необходимые либы и собственно софтина), с учетом того, что клаву туда подключить было нереально, то заморачиваться по поводу других каких-то штук я не видел смысла.
> на работе пилил софтину для пульта управления, все говно вертелось на линуксе
Вот это как раз примерный пул моих задач.
По поводу МК, еще раз повторюсь - хуй с ними, там мне чистых С за глаза хватает. Ну как чистых - через HAL либы, конечно.
Хочу вкатится именно с недосистемное кроссплатформенное проганье. По факту - слушать порты, обрабатывать-валидировать ввод, преопразовывать данные, отправлять по сети/на другие поры, мигать лампочками, слушать кнопочки. Ну и GUI для мониторига статуса, вывода логов.
>но мне нужно, чтобы именно для объекта b направить этот указатель, что бы потом через него вызывать виртуальный метод
Напиши по-русски без речевых ошибок, и я отвечу.
>>978344
>Собственно вопрос - насколько С++ для моих задач лучший выбор инвестиций времени?
Зависит от того, сколько ты готов ебаться с ними. В институте учил только C, в последние полгода пытаюсь с нуля запилить для себя что-то в Qt.
Если научишься быстро гуглить, проблем никаких. Но вот, например, вот это ты хрен нагуглишь, пока сам не столкнёшься: http://doc.qt.io/qt-5/implicit-sharing.html .
Когда инициализируешь POD-класс со вложенными классами, можно пользоваться aggregate initialization из C. Когда пишешь то же самое в аргументе для vector<T>::emplace_back() - это уже не катит, так как это уже не инициализация, и один в один скопированное выражение уже даёт ошибку: по правилам каждая пара фигурных скобок должна раскрываться во что-то одно, да и агрегатного конструктора вообще нет, он неявный.
Олсо, в QT есть QML, так что жабаскрип пригодится.
Если ты хочешь, чтобы твой софт вертелся под управлением разных микроконтроллеров, например MSP, STM32, AVR, прочих ARM и т.д., то, если повезет, то адаптировать модули для работы с периферией ты будешь от серии микроконтроллеров к серии (не стоит думать, что если у тебя микроконтроллер на ядре ARM, то и периферия там одинаковая, производители стандарты периферийных устройств на хую вертели, поэтому у разных производителей встроенная периферия, как правило, разная), а в случае богомерзких AVR тебе придется менять модули от микроконтроллера к микроконтроллеру, потому что, возьмем те же ATmega8 и ATmega88 - вроде бы индексы похожие, а на деле в регистрах пиздос, поэтому конвертирование софта с одного ан другой приносит гемор, а в случае, когда настройки/ввод-вывод не были вынесены в отдельные процедуры, так полная жопа.
На микроконтроллерах переносимость связана с написанием полнейшей дичи. Подумай сто раз, нужно ли тебе это и для каких целей. Может гораздо проще все делать на готовом решении, например RPi или Odroid (кстати, вторым мое увожение, потому что, в отличие от первых, смогли-таки завезти нормальные дрова на видео-ускоритель)
>Но вот, например, вот это ты хрен нагуглишь, пока сам не столкнёшься: http://doc.qt.io/qt-5/implicit-sharing.html .
>Когда инициализируешь POD-класс со вложенными классами, можно пользоваться aggregate initialization из C. Когда пишешь то же самое в аргументе для vector<T>::emplace_back() - это уже не катит, так как это уже не инициализация, и один в один скопированное выражение уже даёт ошибку: по правилам каждая пара фигурных скобок должна раскрываться во что-то одно, да и агрегатного конструктора вообще нет, он неявный.
Это я к тому, что есть множество незначительных проблем, которые ясным умом не понять, так как стандарт писал не ты.
Да что ж такое:) Как бы еще подчеркнуть что МК для меня сейчас не на повестке дня?
>На микроконтроллерах переносимость связана с написанием полнейшей дичи.
Да, видел я код написанный для того чтобы компилится под разные версии AVR - это ебанный mess и #IFDEF-ов и тысячей вариаций одного и того же кода. И мне оно нахуй не надо -
Мне хватает семейства STM-ов, для который большинство перефирии +- причесали для однотипного использования. Так что часть МК для меня пока закрыта, и нужно закрыть часть по написанию эмбедового "бэкенда" который будет данные с этих контроллеров собирать и давать пользователю это все мониторить/менеджерить. ПОтому и Линукс, потому и Qt
Да, на QML смотрю облизываясь, но боюсь браться не разобравшись в кишках C++, дабы не остаться на уровне формошлепа под линупс.
>> на QML смотрю облизываясь
Уж сколько лет прошло с его появления, так и остается багованным говнищем. Хотя для мелокоподелок его за глаза, а вот полноценное приложение только лишь на QML я бы писать не стал, разве что фронт-енд.
ну я его даже и не рассматриваю как основу для приложения, и удивлен что кто-то рассматривает.
По сути это удобная хуйня для написания вьюхи с вкраплениями бизнес логики. Конечно вся логика должна быть вынесена в плюсы.
>А Пайтона под мк и нет, лол. Только С, только хардкор.
>Я ж говорю - мне ща более в системное/эмбед программирование нужно влиться. Хуй на МК, там все понятно, и моих С там хватает.
Лол што? Микроконтроллеры это и есть Embedded, STM, AVR, PIC это мк, ну ARM ещё. Что в твоём понимании embedded, раз это не мк?
Это тоже эмбед, да. Но в системное проганье то что ты описал не входит. Потому говоря "системное/эмбед" проганье я подразумеваю не или/или а некторый стык этих двух областей.
Но а по поводу того что сейчас понимается под embedded - посмею тебя удивить, но это прежде всего код под Linux в тех или иных его масштабах, под специфичное железо, влючая написание дров и конфигурирование этого железа под линь. И как самый мозговыносящий момент - в качестве сборки линя для всяких железяк типа баркод-сканера или POS терминала сейчас поразительно часто предпочитают Android, и разработка под Андроид тоже очень часто стала подразумеватся под embedded.
А голый кодинг под МК уже чуть ли не архаика и прерогатива аutomotive сегмента, куда набирают С-макак да, странно слышать на 500-1000 уе без шанса роста. Но то уже офтоп
>И как самый мозговыносящий момент - в качестве сборки линя для всяких железяк типа баркод-сканера или POS терминала сейчас поразительно часто предпочитают Android, и разработка под Андроид тоже очень часто стала подразумеватся под embedded.
Т.е. андроид применяется не только в телефонах, но и в промышленности?
>А голый кодинг под МК уже чуть ли не архаика и прерогатива аutomotive сегмента, куда набирают С-макак да, странно слышать на 500-1000 уе без шанса роста. Но то уже офтоп
Я походу это. Учусь на автоматчика и мы писали на С на мк AVR. У преподавателя такая же работа.
>Т.е. андроид применяется не только в телефонах, но и в промышленности?
Прикинь) Потому не теряй времени и копай в линукс, будешь ценным "кадром". На проганье МК слишком много дедов сидит, на копеечные ЗП.
> чусь на автоматчика
Если уж нравится носом в регистрах зарываться, то учи Пролог, ПЛИС, и т.д. Там хоть ЗП со среднепрограммистскими равняются. Но стартовать все равно сложно - порог вхождения не низкий.
Мне все время казалось, что ведроиду не место в индустрии. Там уже плотно сидят WinCE и Linux.
То, что в ведроиде зачастую могут валиться приложения в самый неподходящий момент, да и вообще создан он был не для этого. Цена ошибки высокая, особенно когда она проявляется в нарушении рабочего цикла уже у клиента, так что тут только WinCE и Linux, ИМХО.
Касательно C++ с Qt под андроидом - тут тоже своих косяков хватает. Кроме них придется в любом случае ебаться с JNI, чтобы получать права доступа и прочее, прочее... Не проще ли тогда сразу использовать Java, вместо плясок с бубном, и в итоге получив кучу говна идущего впридачу с Qt?!
В критических местах "индустрии" и обычному линю не место, только всякие RTOS, только хардкор.
Но таких мест не так много, на самом деле. А в остальных удобство разработки, тайм-ту-маркет, нличие поддержки и экосистемы куда важнее стабильности оказывается. Да и той стабильности что есть - за глаза хватает.
>Напиши по-русски без речевых ошибок, и я отвечу.
Посредством объекта b и указателя p вызовите виртуальную функцию WhereAmI() класса A
То есть, тебе нужно вызвать метод объекта А по отношению к Б вместо правильного метода, так?
Ты должен делать это изнутри.
class A {
virtual void huy();
}
class B : class A {
void oldHuy() {
A::huy();
}
}
Сделать это снаружи ты не можешь. Методы для того и делают виртуальными, чтобы вызывались самые близки пол дереву наследования версии, и делают это в том числе потому, что методы базы могут быть несовместимы с предком.
Поправочка:
class A {
virtual void huy(){cin<<'fuck';}
}
class B : class A {
virtual void huy(){cin<<'beach';}
void oldHuy() {
A::huy();
}
}
На то они виртуальные, что знают, к какому классу принадлежат.
> Не могу найти в интернете ман по валгринду на русском.
Без мана не можешь написать
valgrind ./kokoko
(./kokoko - это твой бинарник) ?
Оооооооох... Уже скучаю по сишечке.
>>978749
Можешь не продолжать. Я получил ответ на свой вопрос и дополнил его.
>>978752
Тебя забыл спросить. А, нет, не забыл, просто иди нахуй.
Запускал так, просто ждб запускатся просто по имени файла.
Вот пишет мне волгринд, что я использую неициализированную перменную структуры, но при этом ее значение правильное. Как я могу посмотреть еще что-нибудь?
>я использую неициализированную перменную структуры, но при этом ее значение правильное
В смысле?
> Как я могу посмотреть еще что-нибудь?
Что конкретно?
>В смысле?
https://clbin.com/RCh7Uy.png
>Что конкретно?
Вообще что угодно. Любая информация, которая может помочь понять в чем дело.
Program received signal SIGSEGV, Segmentation fault.
0x0000000000401ef4 in Off_base (Top_node=0x0, file=...) at Server.cpp:62
62 int S = Top_node -> IsAHum_;
Вот, что пишет gdb.
https://clbin.com/IayfF0.png
А вот, что выдает валгринд. Память нигде выше не освобождается, выделяется только в одном месте через нью и после проблемной функции освобождается.
Код ты нам, конечно, не покажешь.
Кусок проблемного кода https://pastebin.com/36GstaA8 Проблема в первом вызове IsAHum_
Вся функция целиком https://pastebin.com/c7K2XA6S
Вот ашник (Tree.h) https://pastebin.com/LYY2RZf4
Вот реализация класса, проблемная функция не оттуда, но возможно, что он при проходе как-то влияет на дерево (User.cpp) https://pastebin.com/2KV0sbVk
Ну так я и не понимаю, что не так в этой безобидной строке.
>>978865
В добавок, вот пример файла, подаваемого на вход, назвать Base.txt https://pastebin.com/aw8wgYy2
Скинь архивом с именами файлов.
После каждого запуска программы, выходной файл нужно обновлять(он по совместительству является входным) до того, что я скинул в пастбине.
Да, понятно. past ebin превратил \n в \r\n
Поэтому надо кидать архивом, чтобы ничего не портилось.
>Любая информация, которая может помочь понять в чем дело.
В предпоследней строке тебе valgrind говорит, что ещё можно сделать.
Хотя я подумал, можно было догадаться по жалобе на строку в цикле.
Неинициализированную память выделил vector. Скорее всего, ты лезешь за границы инициализированного в ней.
auto t2 = std::async(test);
return t1.get() == 0 && t2.get() == 0;
Почему только один тред запускается? Нет времени по докам лазить
std::async(std::launch::async, test)
Кстати, отличный сервис, можно установить зависимости, собрать проект и запустить тесты https://travis-ci.org/theanonym/libyoba-perl/builds/225310958
и будет собираться автоматически после каждого коммита
В кишках С++ ты хуй разберёшься.
http://stackoverflow.com/questions/98650/what-is-the-strict-aliasing-rule
Если вкратце, то это правило означает то, что от приведения типов указателей твой брат умрёт.
t1.get() != 0
С тем же самым говном пришел на двач сейчас и даже тут ответов нет
Вы видите копию треда, сохраненную 4 июня 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.