Это копия, сохраненная 15 ноября 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Ответы на все вопросы — http://en.cppreference.com/w/ http://www.cplusplus.com/reference/
Прошлый — >>1074841 (OP)
Как учить кресты, если я даун аутист с icq 70?
Кто шапку на гите держит? Там
>го философия построена на минимальном ограничении программиста в выборе методов и инструментов простреливания ноги решения задачи.
зачеркивание у "простреливания ноги" походу проебалось
Если ты такие вопросы задаешь, ты не просто ньюфаг ты еще вообще дух блять, которому надо бы почитать книжку по основам С++.
Пока ты не пишешь ничего сложнее лабораторок в универе - низачем.
Спасибо анон, но сама идея алгоритмов мне понятна, проблема в том, что я не могу их закодить на плюсах. Особенно ломают мой мозг структуры, ссылающиеся сами на себя.
Тоже хотел его написать, статью про связный список читай или в книге С.Прата есть разбор, как написать структуру очередь. Называется, что то типа: Моделирование очереди
Я хочу не научиться просто реализовывать стек или списки, а разобраться с указателями и структурами, потому что дальше придётся именно с ними работать, а не с этими структурами данных.
Они не ссылаются сами на себя. Это один объект какого-то класса ссылается на другой объект этого же класса. Как в камере хранения среди всякого хлама лежала бы бумажка с номером другой камеры хранения с похожим набором хлама.
Тогда читай обычную книгу по крестам, например в шапке есть книга липпмана для ньюфагов. Думаю, после нее все будет понятно.
Спасибо, анон.
Каким образом это можно организовать? Ну, ясен хуй через стек указателей на функцию, но каким конкретно образом реализовать?
Вот что это должно значить? Указатель на функцию это же void, не? В чём я обсираюсь?
Идентификаторы убери, вот тебе и тип.
std::list<void()(sf::Image &)> fn_list;
fn_list.emplace_back(...);
//
for (auto && ptr : fn_list) (ptr)(image);
ну както так чтоле, можешь в класс обернуть
void(ЗВЕЗДАЧКА)(sf::Image &)
Ну уж не воид звёдочка, блядь. Твой вопрос подобен вот этому:
>Какого типа будет указатель на int?
>>int *pt
>Да не в этом вопрос. Какого типа будет указатель на этот инт?
Да вот такого и будет, блядь! Статическая типизация - не хуй моржовый, вызвать через указатель на функцию ты можешь функции с одной и той же сигнатурой (возвр. тип и аргументы), и это часть типа указателя.
Одна std-приблуда, ради упрощения роботы с другой std-приблудой. Могут пройти туда, где им самое месть.
>Какова типа будет указатель на эту функцию?
std::add_pointer_t<void°(size_t, char const° s)>
Я о
struct A{
void operator() () {/что-то/}
}
Я как понимаю потом это можно вызывать в коде как
A a;
a(); вызов функционального объекта.
Вопрос в том, зачем это вообще нужно, если можно просто использовать функции? Какой профит от функциональных объектов? Типа передавать их можно как параметры не зная сигнатуры вызова? Потому что обычные функции тоже можно в виде параметров передавать.
Лямбды, например
>их можно как параметры не зная сигнатуры вызова
Как же их тогда вызывать-то, не зная сигнатуры?
>Потому что обычные функции тоже можно в виде параметров передавать.
Нельзя.
Или функции высшего порядка — жалкая имитация объектов.
Есть оконное приложение. В нём есть поле ввода текста и кнопка. При нажатии на кнопку из поля считывается IP-адрес.
https://pastebin.com/NGSM0Fyk
Затем этот IP передаётся в конструктор, который определён вот так:
https://pastebin.com/1tjHxzLi
Функция findMAC() работает нормально, а вот findName()
(//найти доменное имя) - нет.
https://pastebin.com/VkN3LzGG
Пишет, что LPHOSTENT hn = nullptr;
Раньше findName была определена вот так:
https://pastebin.com/uBzba0iE и выдавала то же самое.
ИЧСХ, в консольном приложении всё работает нормально.
Что я делаю не так?
Нет, void* это указатель на результат, возвращаемый функцией. Так понятно?
Зато компилируемая и оптимизируемая.
>>1081677
>Типа передавать их можно как параметры не зная сигнатуры вызова?
Нет. Можно передавать их в шаблоны, которые инстанциируются для каждого типа функциональных объектов, и если опустить шаблонные параметры (пользуясь автоматической дедукцией), то выглядит это, как функциональное программирование, ведь снаружи не видно увеличения размера скомпилированного кода.
>>1081679
Это будет ОДНО состояние.
Я просто предпологаю, что дело в особенностях С++. Потомучто куда-то как-то странно теряются данные
И об этом тоже думаю, но решения проблемы не вижу
>Функция findMAC() работает нормально, а вот findName()
>
WSAStartup сделан? Что возвращает сама функция (код ошибки)?
WSAGetLastError что возвращает? попробуй обратный dns для хоста, с которым тестишь, дёрнуть через сосноль, вернёт ли что-нибудь?
Лол. Я который день пытаюсь узнать почему nullptr
На мсдн написано: удалённый комп найден, но не удаётся считать данные в структуру хостент, если обобщённо
Я тебе еще в прошлом треде писал, проверь ширину char. Наверняка у тебя тупо мусор в строке, типа "1 9 2 . 1 6 "... или подобная поебень с вопросиками. Которую ты скармливаешь винапи, она думает что это типа "http://1 9 2 . 1 6 ...com", пытается его резолвнуть через DNS и закономерно обламывается.
А что это вообще за хуйня? Как оно может работать? Если у хостера на одном айпи два сайта (acmecorp.com и honestahmed.com), какое имя он выдаст? А если учесть обилие CDN.
Алсо, из MSDN:
[gethostbyaddr is no longer recommended for use as of Windows Sockets 2. Instead, use getnameinfo.]
Отнюдь. Я проверял через messagebox, что доходит до функции findName(). Там IP нормально доходит
Консольное приложение работает норм. Я ищу доменные имена компов в локальной сети
>DWORD IP = inet_addr(Info.IP_address);
>gethostbyaddr((LPSTR)&IP, ...
Может я чего-то не понимаю в этой жизни. Но разве ты тут не кастишь dword к строке?
okay, попробуем иначе
какие могут быть причины неудачи считывания данных в структуру хостент?
+ мусор в строке(как уже подмечалось)
- не инициализирована сама структура?
- указатель на ложный адрес?
- неправильный формат данных?
#include <iostream>
using namespace std;
int main()
{
MEMORYSTATUSEX statex;
statex.dwLength = sizeof(statex);
GlobalMemoryStatusEx(&statex);
cout << "Physical RAM => " << (float)statex.ullTotalPhys / 1073741824 << endl;
}
Объясните, что тут происходит? MEMORYSTATUSEX, как я понял, это структура, которая хранит инфу о памяти. А что такое statex? Дальше тоже ничего не понимаю, кроме вывода размера ОЗУ в гигабайтах.
>мусор в строке
Завтра на работе проверю с помощью strlen()
>не инициализирована сама структура
Так она инициализируются с помощью gethostbyaddr()
>неправильный формат данных
Быть может
>указатель на ложный адрес
Ты о чём?
Работает не трогай.
Че там непонятного то?
-ex значит расширенная версия чего-либо.
statex - расширенная версия stat, то есть статов.
1073741824 очевидное 1024*1024.
MEMORYSTATUSEX structure
Contains information about the current state of both physical and virtual memory, including extended memory. The GlobalMemoryStatusEx function stores information in this structure.
мог бы захардкодить айпи в обход гуя и таким образом проверить, влияет ли форма ввода на запрос
она может инициализироваться позже, а в момент запроса быть nullptr(сорян, не держу пасту перед глазами, чекни assert'ом ее мож)
формат данных также не должен зависеть от гуя(хардкод для теста, или как ты там выводишь)
и я имел ввиду оператор взятия адреса, который может брать совсем не то, что нужно
Какие простенькие проекты на гитхабе глянуть как примеры использования?
Проверю завтра. Я проверял с помощью messagebox. Айпи передаётся вроде норм, но чекну тип передаваемых данных. Завтра отпишусь
Я еще раз повторяю, у тебя DWORD (грубо говоря int32_t), когда ты вызываешь inet_addr, у тебя в него попадает упакованный в 4 байта IPv4, например 192.168.1.1 превратиться 0x0101A8C0.
Далее, LPSTR это грубо говоря char*. Охуеть, что по твоему делает (LPSTR)&IP? Ты берешь адрес переменной IP в памяти, например при тестовом запуске у меня это 0x0032FBEC. И УТВЕРЖДАЕШЬ КОМПИЛЯТОРУ ЧТО У ТЕБЯ ТАМ НЕ ИНТ, А СТРОКА БЛЖАД. И передаешь ее первым аргументом в функцию. Функция честно пытается распарсить мусор, который там лежит, что в моем запуске выглядит как AЁ\x1\x1MMMMM и так до ближайшего \0 символа, пытается заресолвить эту строку через DNS как http адрес и обламывается. И че тут непонятного то? Пиздуй с такими кастами (LPSTR)&IP нахуй в C-тред а лучше вон из профессии.
Если ты чего-то не понимаешь, это не означает, что это не правильно. Я передаю в inet_addr() айпи в сетевом формате, он преобразовывает его в целое число. А потом это число передаю в gethostbyaddr(), но там первый параметр строковый.
Короче, завтра приведу в порядок типы и отпишусь
Ну да, есть такое
Там есть удобный pacman. И все работает из коробки
>шindoшs7 жи + cygwin
Зачем, если есть зонд10 + WSL?
> во всем цивилизованном мире deprecated и только в msdn no longer recommended
Это по смыслу одно и то же.
>Нельзя.
Можно. Передать в параметре указатель на эту функцию.
>Как же их тогда вызывать-то, не зная сигнатуры?
Не вызвать, а передать. Просто берёшь созданный объект и передаёшь его. А в случаи указателей на функцию тебе нужно создать такой указатель, который бы удовлетворял сигнатуре функции на которую он ссылается
Спс, поржал
Напомнило историю, как из ядра линукса пытались выпилить какую то блочную хуергу лет 10.
>во всем цивилизованном мире deprecated и только в msdn no longer recommended
http://whatis.techtarget.com/definition/deprecated
> In IT, deprecation means that although something is available or allowed, it is not recommended
какой-то игродел бомбанул от того, что нужно использовать тред, и поэтому winapi это плохо. охуительные истории
okay, пусть так, спасибо за просвещение
беда в менталитете прост скорее всего в моем
- устарело, знач устарело, нах это говно мамонта трогать, мы же не лохи, да?
- не рекомендовано? эт кто там такой умный? да у меня асе работает, ЧЯДНТ?
отличия заметны, надеюсь
winapi это действительно пиздец. Я сам пишу часто на чистом С под апи линукса, и если сравнивать винапи и линукс апи это не то что даже небо и земля, это просто земля и космос. Ибо хуже АПИ чем винапи я нигде не видел еще. Там без преувеличения хуево абсолютно все. Даже их code style это полнейший тотальный нечитабельный пиздец.
Ох лол.
Это троллинг такой?
А ну ка приведи код для линукс апи ох лол ох лол создающий формочку с кнопкой и текстом.
Мудак что ли совсем? Какая нахуй формочка блять? Ты сука иди нахуй в JS тред со своими пидарскими формочками. У ядра нету никаких формочек хуермочек для пидоров.
>api линукса
Не, ну если сравнивать winapi и отсутсвие api то отсутствие конечно выигрывает.
Ммм интересно эти дегенераты вообще программисты или залетные аутисты вкатывальщики 500кк/наносекунда?
Двачую. Нашли какой то api линукса, лол. Ведь всем известно, что в линухе придерживаются политики "no stable api nonsense"
>Можно. Передать в параметре указатель на эту функцию.
Но не функцию.
>Не вызвать, а передать
А нахрена нужны функциональные объекты, если в последствии их не вызывать?
>И УТВЕРЖДАЕШЬ КОМПИЛЯТОРУ ЧТО У ТЕБЯ ТАМ НЕ ИНТ, А СТРОКА БЛЖАД. И передаешь ее первым аргументом в функцию. Функция честно пытается распарсить мусор, который там лежит,
Невинной душе позволительно не знать, что таким образом винда действительно принимает инт32.
>>1081899
nullptr у него потому, блядь, что запрос ошибку вернул, а ошибку он даже на MSDN не посмотрел.
>Просто берёшь созданный объект и передаёшь его. А в случаи указателей на функцию тебе нужно создать такой указатель, который бы удовлетворял сигнатуре функции на которую он ссылается
Что ты за хуйню пишешь? Не можешь ты передать функциональный объект, это не самостоятельный тип. Все самые полезные функции, принимающие функциональные объекты - это шаблоны, которые инстанциируются для каждого типа, который ты в них передаёшь - то есть, барабанная дробь, "создают" сигнатуру, под которую подходит метод operator() объекта.
>Не можешь ты передать ЛЮБОЙ функциональный объект
Ну, то есть, в лучшем случае ты напишешь функцию, которая принимает std::function<pizda(huynya)>, то есть, объект должен иметь оператор() с заранее известной сигнатурой.
Вот есть форма ввода и кнопка:
https://pastebin.com/NGSM0Fyk
1.Если я забиваю в поле ввода N-значную С-строку, GetWindowText() сохраняет её в массив IPstr.
2.Я чекнул длину IPstr после ввода. strlen() возвращает кол-во символов без '\0', то есть только кол-во введённых. Но вместо этого он возвращал кол-во символов N+1.
3.C помощью прохода циклом for, я выяснил, что текст из формы записывается в IPstr ВНЕЗАПНО не IPstr[0], а с
IPstr[1].
4. Таким образом, в конструктор класса computer я передаю
&IPstr[1] и всё работает.
Бля, я понимаю, что это говнокод в кубе. И я даже не знаю почему это происходит. Имеет ли значение, что в свойствах проекта я изменил кодировку c Unicode на многобайтовую.
Короче, спасибо большое всем кто вчера вечером помогал
>nullptr у него потому, блядь, что запрос ошибку вернул, а ошибку он даже на MSDN не посмотрел
вчера раз 5 пояснил, что посмотрел. И хули ты тут сагаешь?
>Невинной душе позволительно не знать, что таким образом винда действительно принимает инт32.
Схуяли? Там принимается строка, а не хэндл.
Ну ты же нихуя не знаешь и ниразу не видел в глаза линукс и его апи и кукарекаешь тут?
Stable api nonsense - только про дрова же, а не интерфейс ядра с миром.
У меня есть (на самом деле нет, но хотелось бы) массив объектов. Ключи - int, значения - объекты моего класса.
В процессе работы происходит цикл, в котором каждый объект класса выполняет операцию и получает результат, который он должен куда-то записать. Мне кажется хорошей идеей записывать результат вместо текущего ключа объекта.
Как это реализовать? Контейнеры желательно stl или qt
В PHP всё было проще, пара операций, а в С++ я уже пол дня долблюсь
В stl есть MAP. Это типа массив в виде хеш-таблиц как в ПХП. Т.е. ключом может быть всё что угодно
Спасибо. У меня был косяк в том, что я, по пхп-привычке, пытался изменить ключ multimap, Как только я перестал это делать и начал изменять значение, то всё заработало.
Тэкс. Отсортировать multimap из коробки нельзя. Ладно, окда, напишим алгоритмик.
Функциональный объект
struct A{
void operator() () {/что-то/}
}
Создаёшь его экземпляр как A a;
И передаешь этот a куда тебе угодно.
Может лучше отдельным вектором из пар ключа с указателем на объекты?
Что же с тобой тогда будет, если ты попробуешь какой-нибудь функциональный язык?
У тебя все функции в программе - это воид()? Ответ через глобальные переменные возвращаешь? 1/10 за смехуёчки.
Знатно пригорело. То ли еще будет
Я понял, там указатель на массив байтов, это тот шизик сам придумал LPSTR, а чо, указатель же? На байтики? Значит можно писать.
void t( std::vector<float> _in ) {}
Все элементы копируются, как я понимаю.
Норм ли это или есть более подходящий для таких целей дизайн?
Рановато тебе с твоим скилом писать игровые движки.
А глобальные объекты можно сделать в виде указателя и инициализировать потом.
Можно и так, но ещё лучше будет сделать глобальный объект, конструктором которого будет содержимое StartUp, a деструктором - содержимое ShutDown. Так ты исключаешь один источник багов.
Пока делаю так:
//шаблон абстрактного манагера manager.h
#pragma once
template <typename T>
class Manager
{
public:
static T& Instance()
{
static T s;
return s;
}
virtual void StartUp() final
{
std::cout << " Starting manager: " << typeid(T).name() << "..." << std::endl;
OnStartUp();
std::cout << " Manager [" << typeid(T).name() << "] is started." << std::endl;
};
virtual void ShutDown() final
{
std::cout << " Stopping manager: " << typeid(T).name() << "..." << std::endl;
OnShutDown();
std::cout << " Manager [" << typeid(T).name() << "] is stopped." << std::endl;
};
protected:
Manager() = default;
~Manager() = default;
virtual void OnStartUp() = 0;
virtual void OnShutDown() = 0;
private:
Manager(Manager const&) = delete;
Manager& operator=(Manager const&) = delete;
};
//объявление конкретного манагера inputmanager.h
#pragma once
#include "manager.h"
namespace ENGINE
{
class InputManager : public Manager<InputManager>
{
public:
private:
virtual void OnStartUp() override;
virtual void OnShutDown() override;
};
}
extern ENGINE::InputManager input;
//Реализация конкретного манагера inputmanager.cpp
#include "inputmanager.h"
#include "graphicsmanager.h"
using namespace std;
ENGINE::InputManager input;
void ENGINE::InputManager::OnStartUp()
{
auto window = graphics.window;
//glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);
glfwSetKeyCallback(window, key_callback);
glfwSetCursorPosCallback(window, cursor_position_callback);
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
//glfwSetInputMode(window, GLFW_STICKY_MOUSE_BUTTONS, 1);
glfwSetMouseButtonCallback(window, mouse_button_callback);
glfwSetScrollCallback(window, scroll_callback);
}
void ENGINE::InputManager::OnShutDown()
{
//пока хз что здесь может понадобиться
}
>>1082934
>Рановато тебе с твоим скилом писать игровые движки.
Разве это может меня остановить?
Пока делаю так:
//шаблон абстрактного манагера manager.h
#pragma once
template <typename T>
class Manager
{
public:
static T& Instance()
{
static T s;
return s;
}
virtual void StartUp() final
{
std::cout << " Starting manager: " << typeid(T).name() << "..." << std::endl;
OnStartUp();
std::cout << " Manager [" << typeid(T).name() << "] is started." << std::endl;
};
virtual void ShutDown() final
{
std::cout << " Stopping manager: " << typeid(T).name() << "..." << std::endl;
OnShutDown();
std::cout << " Manager [" << typeid(T).name() << "] is stopped." << std::endl;
};
protected:
Manager() = default;
~Manager() = default;
virtual void OnStartUp() = 0;
virtual void OnShutDown() = 0;
private:
Manager(Manager const&) = delete;
Manager& operator=(Manager const&) = delete;
};
//объявление конкретного манагера inputmanager.h
#pragma once
#include "manager.h"
namespace ENGINE
{
class InputManager : public Manager<InputManager>
{
public:
private:
virtual void OnStartUp() override;
virtual void OnShutDown() override;
};
}
extern ENGINE::InputManager input;
//Реализация конкретного манагера inputmanager.cpp
#include "inputmanager.h"
#include "graphicsmanager.h"
using namespace std;
ENGINE::InputManager input;
void ENGINE::InputManager::OnStartUp()
{
auto window = graphics.window;
//glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);
glfwSetKeyCallback(window, key_callback);
glfwSetCursorPosCallback(window, cursor_position_callback);
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
//glfwSetInputMode(window, GLFW_STICKY_MOUSE_BUTTONS, 1);
glfwSetMouseButtonCallback(window, mouse_button_callback);
glfwSetScrollCallback(window, scroll_callback);
}
void ENGINE::InputManager::OnShutDown()
{
//пока хз что здесь может понадобиться
}
>>1082934
>Рановато тебе с твоим скилом писать игровые движки.
Разве это может меня остановить?
Есть, называется Dependency Injection.
Выглядит примерно так
#include "di.hpp"
namespace di = boost::di;
...
auto injector = di::make_injector(di::bind<IScene>.to<Scene2D>(), di::bind<IComponent>.to<Component2D>())
View2D view = injector.create<View>();
Суть в том, что оно само пройдется по зависимостям и создаст экземпляры классов в правильном порядке.
Ну да, есть немножко. Но так то все понятно. Если без спецсимволов почти чистый англюсик.
make injector
bind IScene to Scene2D
bind IComponent to Component2D
injector.create View
Алсо нам не видно откуда ты кукарекаешь и как решаешь подобную задачу (порядок инициализации типа глобальных объектов)
Ну там по идее вообще 5 функций должно быть.
Но ты видимо сам не понял что криво что-то откуда то скопипастил ибо выражение >di::bind<IScene>.
Не скомпилируется.
Да, как по твоему конструкторы копирования работают?
Копипастил из своего тестового проекта, где с этим говном разбираюсь, компилируется и работает, не понял о чем ты.
Хорошо, как ты объяснись тогда что это?
>bind<IScene>
Экземляр объекта или тип?
Если бы это был экземпляр то там бы стояли круглые скобки в конце, а если тип, то как ты из него методы вызываешь?
Да не, все работает, вот перепроверил
https://wandbox.org/permlink/wHhM6f5WT7IbzBYt
Объяснять как работает магия буста внутри не берусь.
http://eel.is/c++draft/class.access
> its name can be used only by members and friends of the class in which it is declared.
Как видишь, про экземпляры ни слова, только про классы. private - это защита только от пользователя кода, а не от автора кода.
{
public:
explicit FileNotFoundException(std::string_view filename) : _filename(filename) {};
virtual ~FileNotFoundException() throw () {}
virtual const char* what() const throw () {
return ("File " + _filename + " not found.").c_str();
}
protected:
std::string _filename;
};
>error C2512: 'std::runtime_error': no appropriate default constructor available
Как это унаследовать, то?
Блин, вот зачем ему нужен этот глупый конструктор?
explicit FileNotFoundException(std::string_view filename) : _filename(filename), std::runtime_error("") {};
>Объяснять как работает магия буста внутри не берусь.
Вся суть С++ макак. Не могут объяснит ькак работает их язык. лол.
А ну да, так то любой питонист или яваскриптер, естественно, сразу же объяснит все внутренности пакетов, которые он скачал с npm и дергает. Ору с дегенерата.
Ору с дегенерата ""пишущего"" на С++ и равняющегося на явасриптеров и питунхонов.
С++ - БУДУЩИЕ УЖЕ ЗДЕСЬ!
В доках написано: "The value returned by sqlite3_column_type() is only meaningful if no automatic type conversions have occurred for the value in question. After a type conversion, the result of calling sqlite3_column_type() is undefined, though harmless.". Что-то я не осилил момент про авто конверсию типов. Когда она происходит? Короче, взываю к вам, всезнающие аноны.
Кажется, тут речь идет про автоконверсию внутри sql. https://sqlite.org/datatype3.html#affinity
Да, это так. Проблема в чем? Срать я хотел на байтики, просто беру и пишу на плюсах как на яве.
Как-то ты странно logger используешь в main.
Ты в курсе что буст это всег лишь библиотека написанная в рамках синтаксический правил языка С++? И там нету никаких специальных конструкций меняющих синтаксис, не входящих в стандарт языка.
А ты не в состоянии пояснить за синтаксическую конструкцию языка, на котором ты пишешь.
Судя по всему, я понял в чем твоя проблема, походу Visual Studio использует устаревший стандарт и не может собрать без так необходимых тебе скобочек.
То, что это работает в современном компиляторе, показано по ссылке выше.
Он не ребенок и сам может вывести, что bind<IWindow> и bind<IWindow>() - один и тот же (структура).
>буст это всег лишь библиотека написанная в рамках синтаксический правил языка
Разницу между использованием буста и переписыванием всего буста с обоснованием не понимаешь?
> Visual Studio
>твоя проблема
>не может собрать
Лол, не поверишь но у меня этого говна даже нету на компьютере.
Я хоть и давно не пишу на С++, но знаю его достаточно хорошо, чтобы понимать синтаксис не вставляя его в IDE и т.п.
И вот такое выражение myclass<T> считается типом, а myclass<T>() является созданием нового инстанса этого класса. А вот что означает myclass<T>.foo() я не представляю, ибо это выглядит как доступ к методу типа, что является бессмыслицей. А вот myclass<T>().foo() выглядит вполне легитимно.
Но ты даже этого не знаешь, и не можешь объяснить как работает то, что ты используешь в своем хеловорде. Грубо говоря ты не знаешь базовый синтаксис языка.
Если бы тебе задали такой вопрос на собеседовании, ты бы конечно не ответил на него и тебе бы сказали - Мы вам перезвоним...
Вот я и говорю на что во-первых с++ уебищный язык потому, что превратился в язык типа write only, ибо разобрать что-то что там наговнокодили на шаблонах в том же бусте или просто васян-либе если и реально то довольно тяжко и очень муторно, поэтмоу и на нем только пишут, без предусматривания возможности чтения программы.
Во-вторых, новое поколение макак даже языка не знает, что демонстрирует пример выше и не понимает основных синтаксических конструкций, что я вполне понимаю, ибо разбираться в том, что там наковнокодили в новых стандартах поехавшие из комитета, которые решили ухудшить и окончательно доебать язык, который и без того bad by design.
Думаю ( и очень надеюсь ) С++ умрет через пару десятков лет окончательно, ибо кому нужна максимальная производительность, они как и писали на С так и пишут. А кому это не важно пишут на нормальных языках с изначально хорошим дизайном. Даже возьми тот же питон ( хоть я и не считаю это хорошим языком, но точно лучше с++), который очень сильно используется в дата саенсе, где критические по производительности модули написаны на С и просто вызываются из питона.
В общем-то от с++ отказались уже все нормальные люди, которые не повязанны на нем легаси кодом.
> Visual Studio
>твоя проблема
>не может собрать
Лол, не поверишь но у меня этого говна даже нету на компьютере.
Я хоть и давно не пишу на С++, но знаю его достаточно хорошо, чтобы понимать синтаксис не вставляя его в IDE и т.п.
И вот такое выражение myclass<T> считается типом, а myclass<T>() является созданием нового инстанса этого класса. А вот что означает myclass<T>.foo() я не представляю, ибо это выглядит как доступ к методу типа, что является бессмыслицей. А вот myclass<T>().foo() выглядит вполне легитимно.
Но ты даже этого не знаешь, и не можешь объяснить как работает то, что ты используешь в своем хеловорде. Грубо говоря ты не знаешь базовый синтаксис языка.
Если бы тебе задали такой вопрос на собеседовании, ты бы конечно не ответил на него и тебе бы сказали - Мы вам перезвоним...
Вот я и говорю на что во-первых с++ уебищный язык потому, что превратился в язык типа write only, ибо разобрать что-то что там наговнокодили на шаблонах в том же бусте или просто васян-либе если и реально то довольно тяжко и очень муторно, поэтмоу и на нем только пишут, без предусматривания возможности чтения программы.
Во-вторых, новое поколение макак даже языка не знает, что демонстрирует пример выше и не понимает основных синтаксических конструкций, что я вполне понимаю, ибо разбираться в том, что там наковнокодили в новых стандартах поехавшие из комитета, которые решили ухудшить и окончательно доебать язык, который и без того bad by design.
Думаю ( и очень надеюсь ) С++ умрет через пару десятков лет окончательно, ибо кому нужна максимальная производительность, они как и писали на С так и пишут. А кому это не важно пишут на нормальных языках с изначально хорошим дизайном. Даже возьми тот же питон ( хоть я и не считаю это хорошим языком, но точно лучше с++), который очень сильно используется в дата саенсе, где критические по производительности модули написаны на С и просто вызываются из питона.
В общем-то от с++ отказались уже все нормальные люди, которые не повязанны на нем легаси кодом.
Я понимаю, что ты решил троллить тупостью, но никакого write only в указанном примере и близко нет, наоборот, он максимально прозрачен, и ты можешь его настроить как угодно под свои синглтоны. Напоминаю, что я этот пример предложил как простейшую замену говнокоду, где глобальные инстансы всяких ресурсменеджеров инициализируются в неопределенном порядке. Эту проблему DI полностью устраняет, записью буквально в одну строчку. Ты же доебываешься до сраной реализации, в которой я могу тебя отправить лишь к авторам буста, поскольку я упомянул, что мои познания в языке ниже, чем у авторов буста. Если они могут сделать автовывод типа без скобочек, значит они могут. Я же показал пример простого использования сложной библиотеки, а ты требуешь чтобы я описал реализацию этой библиотеки. Как работает - тут все совершенно очевидно, make_injector принимает гребаный тип, а что и как в этом типе выводится - это детали реализации, которые никого не ебут в данном случае, все что нам надо сделать в этом простейшем примере - декларативно описать, какому твоему интерфейсу соответствует какая твоя реализация, и вызвать соответствующий метод. Все, как в твоем любимом пайтоне.
> Он не ребенок и сам может вывести, что bind<IWindow> и bind<IWindow>() - один и тот же (структура).
Ебать дебил.
>>1083086
В C++14 завезли шаблонные переменные. http://en.cppreference.com/w/cpp/language/variable_template
опенгл должен быть норм, если его правильно использовать.
> доебываешься до сраной реализации
Ну ты и дегенерат. Я 10 раз писал постами выше, про синтаксическую конструкцию аля foo<T>.bar(), которую ты объяснить не можешь и это не относится к бусту это относится к СИНТАКСИСУ языка, а не к реализации. Сука какой же ты тупой олень, тебе не на с++ писать надо, а вообще программировать нельзя.
>>1083134
>В C++14 завезли шаблонные переменные
Вот это многое объясняет, благодарствую.
А дебил выше, судя по всему, даже не утруждал себя в изучении уже ненового стандарта, зато кукарекать начал.
Какой же ты даун, тебе уже раза три ответили, что можно писать синтаксическую конструкцию как foo<T>.bar(), так и foo<T>().bar(), потому что это вообще никого не ебет, это внутренняя реализация библиотеки, по сути её DSL. Ладно, заканчиваю кормить зеленого.
>можно писать синтаксическую конструкцию как foo<T>.bar(), так и foo<T>().bar()
Поциэнт с синдромом дауна, до сих пор не понял в чем отличие, хотя ему даже ссылку на описание привезли.
И пустой строкой не стоит инициализировать, там не просто так нет конструктора по умолчанию, там должно быть осмысленное сообщение об ошибке
В том вызове make-shared разницы и нет. Погоди, ты реально считаешь, что там вызывается какой-то метод?
До этого он и сам догадается.
>можно писать синтаксическую конструкцию как foo<T>.bar(), так и foo<T>().bar(), потому что это вообще никого не ебет, это внутренняя реализация библиотеки, по сути её DSL
Боже, какой дибил. Ты серьезно?
А по существу нечего сказать? На stackoverflow одни printf и itoa. При этом мне желательно обойтись как раз без этих вещей. Я только не могу понять, почему элементы в массивах имеют такое значение.
Видишь ли, гнида, я по существу говорю только людям, которые сами работали. Ты сюда какой-то выблев принёс, который из хуя высосал, мне в нём разбираться не по масти. Ищи лучше, мразь, раз уж сам написать такую простую вещь не в силах. Это крест твой, творог подзалупный.
Я правильно понимаю, что С++ это С с ООП?
Может быть ты программист?
Кроме ООП, С++ обрёл ещё и капельку функционального программирования и STL. А так - да.
Дальше сам, добрый человек. Ключевые слова я тебе дал, теперь попотей, поищи, как твой тип передавать, тем более что ты, сука, даже не удосужился его в своём вопросе упомянуть.
https://www.codeproject.com/Articles/66244/Marshaling-with-C-Chapter-Marshaling-Simple-Type
>пук
Аргументы будут? То, что это работает, и соответствует документации библиотеки, приведено по ссылке выше.
С с ООП это Си-с-классами
В хуй мне нужны ключевые слова по ссылкам, на которых я сто раз был? Одни, блядь, целые трактаты про marshalling выдают, другие про какой-то interop загоняют, третьи вообще предлагают пересесть на c++/cli. Мне нужно передать объект, либо хитровыебанный массив, назад скорее всего вернуть только хитровыебанный массив.
>If an exception is thrown, there are no effects (strong exception guarantee)
Про возможные типы выбрасываемых исключений ничего.
А что может выкинуться, кроме std::bad_alloc / std::invalid_argument ?
inb4: ничего.
> на которых я сто раз был?
И чё, не попёрло? Тогда вон из профессии.
> Мне нужно передать объект
Класс это не только данные, но и тесно связанные алгоритмы. Как ты их передавать собрался, холоп? Придумывай как абстрагироваться до данных. Ты справишься.
Лол, тебе поебать на байтики, но когда-нибудь байтики выебут тебя
Да, только libastral подключи.
Есть 3 класса.
QtGuiApplication1
selector
bot_V_0
Если я пытаюсь добавить #include "bot_V_0.h" в "selector.h", то получаю пик 1.
Если пытаюсь добавить #include "bot_V_0.h" в "selector.cpp", то сначала всё норм, но потом, после реализации какой-либо функции, я получаю пик 2
То же самое, но с большим успехом касается и включения "bot_V_0.h" в "QtGuiApplication1.h" - пидорасит, а при включении в "QtGuiApplication1.cpp" работает и позволяет создавать объекты bot_V_0 и использовать функции.
У "bot_V_0.h" есть только одно включение #include "QtGuiApplication1.h". Везде есть #pragma once
Что я делаю не так?
>А что может выкинуться, кроме std::bad_alloc / std::invalid_argument ?
Всё, что может выкинуть конструктор T.
Неинициализированная переменная = неопределенное поведение = может быть любое значение. Всегда ваш, сегфолт.
Первое равенство с натяжкой верное (если ты читаешь оттуда значение), а вот потуги манек как-то описать поведение при UB (любое значение, сегфолт и т.д.) смешны.
>Делаешь так, чтобы нам не хотелось помочь тебе.
После твоих слов решил ещё покопаться и выявить косяк. Создал новый проект, полностью пустой из трёх классов
QtGuiApplication2
С1
С2
Начал потихоньку его нагружать.
Сделал включения классов C1 и C2 в QtGuiApplication2, а класса QtGuiApplication2 в каждый из них.
Идентичный косяк появился при следующем шаге - объявлении в классе С1 указателя на экземпляр класса QtGuiApplication2;
Листинг класса с косяком:
#pragma once
#include "QtGuiApplication2.h"
class C1
{
private:
QtGuiApplication2 * mainpr;
public:
C1();
~C1();
};
Почему так нельзя? Как тогда передать указатель на объект?
>Сделал включения классов C1 и C2 в QtGuiApplication2, а класса QtGuiApplication2 в каждый из них.
Ну вроде очевидно в чем косяк, не? Перед C1 и C2 сделай форвард вида: class QtGuiApplication2 ;
Ещё раз: UB это неопределённое поведение. Вообще неопределённое. Никак. А не "считывание случайного значения".
Если бы ты был рядом я бы тебе отсосал.
Ты аутист. Формально там будет то значение, которое там было до этого. А это может быть много чего. Фрейм прошлого вызова какой-то функции. Кусок системы. Трамплин. Дебажный филлер. ASLR.
Я рад тому, что ты понял, что анон, которому ты отвечал, шутил.
>>1083380
Это не тред твоей любимой ОС, это тред С++. Если компилятор видит использование неинициализированной переменной, он может хоть тебе в тапки нассать без предупреждения, и это не шутки - есть оптимизации, которые анализируют код, и на основе предположения о его правильности меняют его на эквивалентный.
>Если компилятор видит использование неинициализированной переменной, он может хоть тебе в тапки нассать без предупреждения
Я ровно это и написал. А вот что там окажется по этому адресу, уже определяется не стандартом с++, а внешними факторами, некоторые из которых я упомянул - реализация фреймов, реализация ос.
Компилятор в том числе может породить код, который никогда не прочтёт то, что там написано.
Тебя никто и не кормит, толстячок.
Забей, в армейке тебя будут достаточно заебывать. Лучше на месте сориентируйся, если время будет, попроси чтоб книжку какую прислали.
>как-то договориться чтобы был доступ к компьютеру
Да. Вас спрашивают, кто умеет в компы, ты вызываешься, и потом жалеешь об этом. Потому что придется быть секретарем всей части, а обычные обязанности никто не отменял.
Класс не как абстрактную структуру данных, а как нечто, наследованное от Object. Какая, в жопу, абстракция?
Прогай в уме, лол.
Попросись в десонт, там много прогают.
>Одни, блядь, целые трактаты про marshalling выдают, другие про какой-то interop загоняют, третьи вообще предлагают пересесть на c++/cli.
И что тебя смущает? Именно этим и надо заниматься.
Через маршалинг и интероп, а можно на c++/cli. Ну или скачай ReactOS и перепиши весь WinAPI.
Официальной бесплатностью. Впрочем может для студентов есть варианты и получше.
Есть метод getData:
...
struct Data
{
...
}
...
Data arr[10];
...
...
Data getData(int i)
{
...
return arr;
}
Этот return как бы должен вернуть a по ссылке, или же он вернёт временную структуру Data, скопировав её содержимое из a?
Твоя функция возвращает один экземпляр Data.
Там больше зависит от того, что ставить. Если добавить UWP, Кородовы и прочие ASP.NET, выйдет дохера.
Только что поставил чистую установку, выбрав Desktop development with C++, без C# даже. Заняла 2 гига. Может еще в других папках что-то. Поверь, у меня SSD всего 120ГБ, из них 10 свободно, я бы заметил если бы она не влезла.
Сап плючаны, решил тут забацать небольшую игрушку на OpenGL, на MVSN17, и немного прифигел с того, что подключение к студии идёт через анус жопы сидалищного мозоля прямой кишки пердака. При этом я помню как приходилось трахаться с такой элементарщиной в 2007 и прочих версиях. Неужели в дваксемнадцатом не смогли придумать нормальной подключелки пакетов по типу npm например?
Отбой, я ковырнул эти файлы, нашел пути к ехе, А почему такой вес? типа чтобы с нета не качать
Я хз что ты там качаешь, я только что ставил скачав один файл vs_Community.exe весом 1Мб. Ей богу, ставим студию всем двачем.
Ну вот, и хорошо, я вот тоже пару файликов скачаю, а что нужно докачается
Можно, непонятно правда зачем, заняло 10 минут с гуглением.
1. В инсталляторе студии ставишь NuGet Packet Manager
2. В студии заходишь в меню Tools - Nuget Packet Manger - Manage Packages for solution
3. В Nuget packet manager ищешь через browse и ставишь два пакета: freeglut и glew.
4. Компилируешь пример и запускаешь, идешь пить шамапнское.
5. обламываешься, видишь что не слинковалось, и либо разбираешься по человечески с либами, либо как советуют в инете, ставишь третий пакет с зондами - nupengl.core
Я из-за такой хуйни купил новый ССД под систему.
До VS жил на почётном олдфаге на 60гб, обновился на 512гб, на всякий случай.
По идее только если 24/7 сборку на нем гонять. Ну и большие ССД делаются по худшим технологиям, поэтому портятся быстрее.
Но я бы советовал тогда уж в строну пакетов SDL2, SDL2-image смотреть.
>А все равно ссд раз в три года менять нужно вроде
Мой на 60 жил уже 7 лет и чувствовал себя неплохо. Я бы сидел на нём ещё лет 7 спокойно.
А по поводу замены - зайди в hw там тебе всё подробно расскажут, но вообще, менять смысла нет, потому что ресурс даже хуёвого ССД - просто безумен.
Ооо, зайду
Много. У меня 1.8.
массив? строка?
>Сумма цифр числа без операций деления и умножения
>Сумма цифр числа
>Сумма
Попробуй операцию сложения
Preg_replace("", "+");
Да я пошутил.
Число в строку
Строку в массив с ковертацией символов в числа
Суммируешь массив
Если верить >>1083747, то 2017 весит меньше, чем 2015 только для плюсов в минимальной версии.
>>1083762
Ясен хуясен, это установщик. Есть интернет-установщик, весит пару мегабайт.
>>1083780
ССД нужно менять один раз в хуй знает, сколько лет, если только тебе не крайне не повезло с моделью (баг в прошивке или езё гавно какое).
>>1083788
Скажи потом, заработало оно или нет. Похоже на то, что СДК для 8.1 она ставит обязательно, а для 10 - необязательно. Но вот VC тебе по-моему нужен, это же компилятор.
>>1083871
С очень большой вероятностью - нет. Результат будет отличаться в последних знаках.
>>1083895
Не охуел ли ты? Считывай число из cin посимвольно, посимвольно переводи в числа и складывай, где тут деление?
Давно занимался, сейчас уже не могу привести ту библиотеку что мне подошла, к сожалению.
В хистори браузера отыскал только https://www.codeproject.com/articles/42504/excelformat-library
Но я помню что пришёл к выводу, что придётся работать стандартными средствами Microsoft. И с ними и работал.
Почему за boost могут сразу прописать по ебалу?
Наоборот, за прописывание по ебалу могут сразу в boost.
Продолжительность склада
Срок хранения.
Молодец, гуглить научился, иди перед мамкой похвастайся, а вопрос был в другом.
>Молодец, гуглить научился, иди перед мамкой похвастайся
Ну ты не расстраивайся так, я думаю, ты ещё сможешь выучить инглиш.
А я вроде нахуй тебя давно послал. Тупость тупого школьника читать не интересно.
>Тупость тупого школьника читать не интересно.
Никому не интересно читать твою тупость — это тебя так расстраивает?
Тупой школьник, ты настолько туп, что даже не догадался посмотреть в вышедший некоторое время назад перевод стандарта C++?
Едришкины шишки, какого там нигде нет уведомления, что пробная версия. Бесплатно, говорили они, аналог Express'a, думал я.
Так я уже давно скачал и посмотрел его, просто от делать нечего продолжаю слать нахуй малолетних деградантов. Да и в очередной раз убедился что в этой параше смысла спрашивать нет никакого.
Там и написано бесплатно ебин. Сейчас бы считать что твое фейкомыло кому то интересно.
Что ты хочешь от дегенератов переводящих стандарт?
Возник вопрос с объявлением и использованием шаблона.
Если объявлять как на первом пике и как пишут в сети, то получается пик 2. Как это делать правильно? Пробовал пик 3 - проблема с таким объявлением очевидна
1. Ты не можешь выносить реализацию шаблонных методов в .cpp. Все должно быть в .h.
2. typename T доступен только в том типе, в префиксе которого он определен, в данном случае genotype. Родительский тип о нем никогда ничего не узнает.
1. Можешь. Просто определение надо писать полностью
template <typename T> void bot_V_0::orgy(int child) { / ... / }
>1. Ты не можешь выносить реализацию шаблонных методов в .cpp. Все должно быть в .h.
Это понятно. Но я и произвожу определение шаблонных методов и их реализацию только в .h - пик 1. Но при этом получаю пик 2 в .cpp, хотя там я ничего не успел сделать.
Анон, почему --f() не компилируется, а f() - 1 корректно? Почему оператор -- применим только к l-value?
В чем отличия f(a++) и f(a); ++a; ?
У меня win7x64 помогите
Хорош.
>Если объявлять как на первом пике и как пишут в сети, то получается пик 2.
ты сообщение компилятора скажешь или нет мать твою
Не, он говорит что иди нахуй из треда с этой ересью.
> ::CoInitialize(NULL);
?
Код взял из примера для VS с этой страницы http://proginfo.ru/excel/
Так как это не стандарт, в любой момент в либах может что-то поменяться, и это сломает пользовательский код
Глобальное пространство имен?
https://stackoverflow.com/questions/4269034/what-is-the-meaning-of-prepended-double-colon ну первая ж ссылка в гугле, чего у него не спросить?
Спасибо, просто не силен в английском
Отчего же? Ошибка доступа к файлу установщика, вполне может помочь.
Где где а тут точно их нету
>Почему оператор -- применим только к l-value?
Потому что -- это =- . Это оператор, который присваивает значение. Ты не можешь присвоить зачение временному значению, стандарт запретил. Ты можешь сделать это только в том случае, если забиндишь rvalue-ссылку к этому значению (т.е. сделаешь его лвалью).
Но ты можешь переопределить оператор для классов: http://coliru.stacked-crooked.com/a/cb9d26b17f83c51f
и там делать то, что угодно, если сигнатуру правильную сделаешь.
>В чем отличия f(a++) и f(a); ++a; ?
В том, что если стандарт так решил, что результат a++ для интегральных типов - это временное значение (прежнее), а не лвалью. Соответственно, если f(a++) никогда не зарезолвится в f(int &a).
Из за ссылочных типов. В цпп всегда все из за ссылок.
struct StackElement {
Value value;
StackElement next;
};
struct Stack {
StackElement head;
};
Stack createStack()
{
return new Stack();
}
Подскажите, пожалуйста, что означает Stack createStack()? Где об этом можно почитать? Потому что также видел, что данный приём используется и в реализации двоичных деревьев.
Самое главное ж пропустил - в Stack *createStack() нужен указатель и мне не понятно, как именно он работает.
Это значение, у которого нет места хранения. Если функция не возвращает ссылку, она может вернуть только временное значение.
>>1084419
createStack - это фабрика. new возвращает указатель на созданный объект. Что именно ты хочешь узнать? Вместо лишней функции можно передавать аргументы конструктору или вызывать new самому, в этом примере совершенно лишняя функция.
*
Я хочу узнать, что значит конструкция <название структуры> <название функции>, а также
<название структуры> *<название функции>. Просто нигде не могу найти инфы про этот момент.
Я не знаю почему, но двачу не нравится звёздочка. Я имел в виду: <название структуры> "символ звёздочка"<название функции> и <название структуры> "символ звёздочка""символ звёздочка"<название функции>
Да, но речь не об этом.
>Это значение, у которого нет места хранения
Как нет место хранения? А где оно хранится? В пустоте над стеком парит?
Ты прикалываешься? Это функция, возвращающая указатель.
>>1084448
Два самых примитивных варианта:
- в регистре
- хуй знает где и может перемещаться
Ещё вопросы?
>>1084454
Фабрика это, блядь, ФАБРИКА. new используют тогда, когда нужно создать не автоматический объект, а объект в динамическо памяти, который нужно самому потом удалить. Конкретно в этом случае createStack - бесполезная функция.
Не знаешь, что такое new - пиздуй книгу читать.
>Это значение, у которого нет места хранения. Если функция не возвращает ссылку, она может вернуть только временное значение.
Можно более формально это объяснить?
Насколько более формально? Попробую.
http://eel.is/c++draft/basic.lval#1.2 - в современном стандарте временное значение, у которого нет места хранения - это prvalue.
http://eel.is/c++draft/expr.call#11
Вкратце: если функция возвращает не ссылку, то места хранения у возвращаемого значения нет, и оно обязательно prvalue.
>Напишите функцию Base const D1BaseToD2Base( Base const base ), которая преобразует указатель типа Base на объект типа D3, который ссылается на экземпляр Base, соответствующий D1, в указатель, ссылающийся на экземпляр Base соответствующий D2.
Пояснение: нам дали Base на объект типа D3. Надо вернуть указатель типа Base ссылающийся на D2. У D3 два экземпляра Base. Один в D1, другой в D2. Изначально указатель ссылается на Base в D1, а надо получить ссылающийся на Base в D2. При этом оба указателя будут ссылаться куда-то внутри D3.
Я написал такой код, но у меня нихуя не работает: https://ideone.com/9NeDah
Написал дерево наследования и расположениее объектов в памяти: [Base][D1][Base][B2][D3], но мне все равно непонятно, как сдвигать указатель.
в /rf, аватарка. А еще себя тру-программистом называл.
1) Не нужно использовать статик_каст для спуска вниз по дереву наследования, это небезопасно. Если ты принимаешь указатель на D3, то отрази это в сигнатуре.
2) Тряси своего препода, блядь!
3) https://ideone.com/trdjrM
4) Конкретно этот пример вообще ничего не показывает. Какой ты указатель не приведи к указателю на D2, он будет печатать одно и то же. Чтобы проиллюстрировать правильность выбора базы, ты должен хранить в базе что-то, и в наследниках сохранять идентифицирующее значение.
Но дело в том, что сигнатура функции не Base const star foo(D3 const star d3), а D1BaseToD2Base( Base const star base ), и то, что в D3 содержится два объекта Base, усложняет приведение.
Я тебе уже скинул рабочий код, ты имеешь что-то против этого?
>Но дело в том, что сигнатура функции не Base const star foo(D3 const star d3), а D1BaseToD2Base( Base const star base )
Нассы человеку, который требует то, что ты пишешь, именно с такой сигнатурой, на ебальник. Если ты хочешь писать качественный код, приводить типы указателей вниз по дереву наследования без dynamic_cast или своей собственной системы хранения типов нельзя.
И уж ТЕМ БОЛЕЕ нельзя делать так в том случае, когда база может быть включена больше одного раза. То есть, не тебе просто нахуй это не нужно, так как указатель на базу из указателья на D3 можно получить двумя способами.
Быть может, ты получишь высшую оценку, если объяснишь это преподу.
> указатель на базу из указателья на D3 можно получить двумя способами.
И, ЧСХ, он будет разный в зависимости от того, какой способ ты использовал.
>Я тебе уже скинул рабочий код, ты имеешь что-то против этого?
Имеет принимающая система, которая требует указатель на конст Base. Моя последняя попытка такая: https://ideone.com/yFl17T
Мне кажется, это вообще нельзя решить без вычисления смещений внутри объекта и обращения к сырым данным, зная, как конкретные компиляторы собирают объект.
Уебывай нахуй, пидрила, и говно своё забери. У тебя должно быть 4 каста - два вниз и два наверх, обмазывайся этим сам.
https://ideone.com/YgXUzh
Иногда заглядываю в этот тред и почти всегда проигрываю с аутизма местных дебичей.
Проиграй над тем, что ты не можешь увидеть проблемы этого кода.
Так и выглядит известный object slicing?
Ребята, возникла задача, в ходе которой надо будет исходные, ну, например, 10 чисел надо будет разбивать на различные группы, а потом с этими группами проводить определенные действия, ну точнее придется обращаться к элементам этих групп. И я не очень понимаю, какой структурой воспользоваться для этого, лол.
Разбиений будет не больше чем количество чисел.
Я же не мудак, чтобы тратить свое время на головоломки в виде говнокода на с++.
Алсо, на сколько я помню, есть известная проблема с такими stl функциями и итераторами, они вроде считаются как декларация новой функции а не вызов, что-то такое. Хз в общем не хочу заморачиваться даже об этом ибо дропнул с++ уже давно и пишу на норм языке.
Сори, возможно, это действительно даунские вопросы, но я нигде не могу найти на них ответы. Последний: что тогда означает данный кусок кода - https://pastebin.com/fdS74B5X . Зачем нужны 2 указателя, можно ли обойтись без них? А если есть возможность указать такому долбоёбу, как я, где про это всё можно почитать, лучше не тратьте своё время и именно так и сделайте. Сори за аутизм, я правда не специально.
>уже давно и пишу на норм языке
Зачем же ты на нем пишешь? Думаешь, кому-то нужны твои проекты? Хочешь заработать денег, найти жену-жируху, обмазаться кредитами, жиреть, стареть и растить спиногрызов?
Ты мог бы изучать метапрограммирование шаблонов, отличия auto от decltype, свертку ссылок, решать головоломки, изучать проблемы множественного и виртуального наследования, но вместо этого ты выбрал унылую жизнь нормалфага.
а ты выбрал бесполезное задротство. мог бы с таким же успехом какашки по высоте раскладывать.
Скорее, по Common Lisp'у.
А нахуя тратить время на изъебы с хуевым языком, когда можно тоже самое сделать гораздо быстрее и понятней на нормальном?
Пишу на С, радуюсь жизни. Что надо на коленке на лобать пишу на питоне. Угараю по функциональщине в свободное время.
Две очевидны: запись в *last и инкремент не того в --e.end(), а еще две?
Ёпт, я даже не знаю, тебе не книга о языке нужна, тебе нужна книга об алгоритмах.
https://www.google.ru/search?q=керниган+практика+программирования
Именно как реализовывать алгоритмы я понимаю, а вот как записать это на плюсах - у меня проблемы. Просто в вузе всё преподаётся крайне хуёво, а спрос большой. Извини, что мучаю тебя такой херью, но просто уже не знаю, что делать, ибо дальше будет только хуже.
Не переживай, со временем вникнешь.
А 2 указателя - на правого и левого сына каждого узла дерева, логично же. Если я правильно твой вопрос понял
По поводу визуализации вот:
https://neerc.ifmo.ru/wiki/index.php?title=Дерево_поиска,_наивная_реализация
мб станет понятнее.
>есть известная проблема с такими stl функциями и итераторами, они вроде считаются как декларация новой функции а не вызов
При чем здесь stl и Most vexing parse?
>Выбирает язык вместо предметной области
>Гордится что пишет на голом С
А ты ведь не слишком умен?
Типа такого:
//somecalss.h
class SomeClass
{
public:
void SomeMethod();
private:
int someProperty;
}
//someclass.cpp
void Serve()
{
someProperty = 0;
}
void SomeClass::SomeMethod()
{
Serve();
}
В общем, как писать код со всякими инкапсуляциями, и не засорять пространство имен класса?
Точнее тут не инкапсуляция, а извлечение метода, только не внося его в объявление класса.
Делаешь статичные члены и публичный статичный метод.
Олсо, с какого дерева упал для того, чтобы пытаться изменить нестатичный член класса из самосотятельной функции?
>Думает, что предметная область не зависит от языка.
>Гордится что ест говно на С++.
А ты ведь не слишком умен?
>когда можно тоже самое сделать гораздо быстрее
Гуй на си пишется особенно быстро и понятно.
>Могу предположить, что он спрашивал про указатель на указатель.
Именно. А вообще эта учёба бред какой-то: ничего не объясняют, но кучу задач с двухнедельным дедлайном дают. В чём смысл такой учёбы, если для большинства это просто "посмотрели, что-то сделали и забыли".
>GNOME тому пример.
Ты под gtk пробовал кодить? Там по сравнению с Qt для сравнимого функционала надо раз в 10 текста писать. Поэтому в гноме сейчас сплошной js, а за пределами редхата обычно сразу берут питон, валу или кресты, чтобы с gobject дела не иметь.
>Qt
Так куте это даже не С++ практически.
>js
Так все уже пишут на JS гуи, даже куте уже давно перешла на QML. Потому что поняли что с++ это днище полнейшее.
Реально в современном мире нет ниоднйо причины писать на С++, когда есть Go и Java для серверных приложух, и есть JS и т.п для гуи и есть питон для всего остального.
>. В чём смысл такой учёбы, если для большинства это просто "посмотрели, что-то сделали и забыли".
Подними жопу с насиженного и пойди к начальникам, скажи им всё это. То, какая будет учёба, зависит от тебя.
>Именно.
Указатель на указатель нужен потому, что очень часто тебе нужно не только узел найти, но и перенаправить ссылку на него. То есть, ссылка на узел из предка - это его логическая часть.
>Реально в современном мире нет ниоднйо причины писать на С++
Главная причина писать на плюсах - необходимость работы с большими объемами бинарных данных, обычно с медиа контентом. Воспроизведение, редактирование, вот это вот всё. Ну и игры.
>Так куте это даже не С++ практически.
По историческим причинам. Сейчас можно то же самое сделать препроцессора: http://www.copperspice.com/
>даже куте уже давно перешла на QML
Не перешла и не перейдет, потому что на обычных QWidget все еще проще делать десктопные интерфейсы. Дохуя народу на четверке сидит, и перекатываться на пятерку ради QML не собирается.
>Реально в современном мире нет ниоднйо причины писать на С++
Ну так не пиши, иди в другой тред.
Это вообще не причина ибо с бинарными данными можно работать откуда угодно.
Про игры отдельная история, там так завелось. К тому же долбоебы из майкрософта решили наговнокодить директ3д на с++.
>>1085220
На куте 4 остались либо люди погрязшие в нем полностью и им уже никуда не деться, кроме как поддерживать ебаный легаси.
Впрочем, по этим же причинам до сих пор пишут на с++, во многих случаях из-за легаси говна, тянущегося веками.
>на обычных QWidget все еще проще делать десктопные интерфейсы
Вот тут ты абсолютно не прав. Мне недавно понадобилось сделать одно кроссплатформенное гуи приложение для себя. Я поначалу начал на Виджетах, но потом понял, что это такое говно, которые к тому же еще и дико тормозное ибо рендирит все софтварно, а там у меня куча 2д графики было. Решил попробовать QML, и я охуел насколько я быстрее и компактнее сделал все на нем. И работает это все намного быстрее, потмоу что использует OpenGL для рендеринга. К тому же можно писать сразу под мобилки. Не понимаю, как говно-виджеты могут сравниваться вообще с этим.
>Ну так не пиши, иди в другой тред.
А я и не пишу, только иногда если выхода нету из-за ебаного легаси. А в тут в треде потому, что могу.
>Это вообще не причина ибо с бинарными данными можно работать откуда угодно.
Где угодно тебе придется проебать месяцы на построение кодогенератора, в крестах для этого есть шаблоны. Близкое по смыслу есть в шарповых дженериках, но это совершенно не то и язык одной платформы.
Как связаны шаблоны с бинарными данными? Какие нахуй кодогенераторы, ты о чем вообще?
Если тебе нужно работать с бинарными форматами читать/писать то ты это и на питоне можешь сделать и на яве и на аллахе. Пишешь свой сериализатор/десериализатор и все. Не понимаю каким хуем тут вообще шаблоны могут пригодиться.
Все это метапрограммирование на шаблонах - полная чушь и наносит только вред.
Возьми тот же stl, ебаные итераторы, контейнеры. В котором максимум дженерик алгоритмы, которые ни на что не годятся в реальных приложениях. В реальных приложениях, пишутся свои алгоритмы и структуры данных заточенные под конкретную задачу.
Даже возьми тот же хеш тейбл в стл, нахуй он вообще там нужен если он не конкурентный? Что туда складывать? Аргументы из командной строки?
Если я захочу структуру данных чтобы доставать значения по ключу, который будет работать в условиях многопоточности, что в наши дни обычная практика, то мне нужно будет писать свою версию, которая будет работать более менее с fine grained lock, а не лочить весь контейнер, ибо по другому с STL парашей ты не сделаешь.
С++ настолько пытались сделать общим языком для всего, что получилось так, что он теперь не пригоден ни для чего.
>Пишешь свой сериализатор/десериализатор и все.
Ну да, проебываешь на его императивное написание месяц-другой и все, хули нам хохлам. Это если протокол прост как палка и у тебя есть данные чтобы дебажить свое поделие для всех типов и структур в него входящих.
>Все это метапрограммирование на шаблонах - полная чушь и наносит только вред.
Аргумент, не поспоришь.
>Возьми тот же stl, ебаные итераторы, контейнеры. В котором максимум дженерик алгоритмы, которые ни на что не годятся в реальных приложениях.
Не люблю переходить на личность, но тут не слабо так повеяло болью неосилятора.
>Даже возьми тот же хеш тейбл в стл, нахуй он вообще там нужен если он не конкурентный?
Хороший вопрос для собеседования - как сделать из обычного хеша "конкурентный". Алсо ознакомься с инсерторами - на них можно изготовить тобой желаемое. Тебе не обязательно лочить весь контейнер для одной операции. Ты можешь спокойно декорировать стандартный инсертер, что, к слову спижжено из раннего спринга, хуй его знает как оно там сейчас.
Я тут мимокрокодил, но вроде как есть такая штука: в игродвижках всякие данные быстрее работают, если их класть слоями: сначала массив x-координат, потом y-координат, потом r-компонента, потом g-компонента, и b-компонента. Если ты заведешь class Vertex { float x, y, r, g, b; } в Яве, то вектор этих вертексов будет лежать в памяти xyrgbxyrgb, в то время как в плюсах можно написать аллокатор, чтобы он это все разворачивал в xxyyrrggbb, при этом оставляя всю мощь оптимизатора для конструций типа for(int i = 0 ... i++) v.x++
Так конечно можно сделать, но суть не в этом. Суть в том что можно один раз написать общий алгоритм, скажем, линейного преобразования и через трейты применять его ко всем существующим сейчас и появляющимся в последствии структурам данных. При этом компилятор сгенерирует сотни и тысячи реальных классов (ну, если скажем у нас N стратегий и M субъектов, то будет минимум MxN производных классов для шаблона двух параметров), что позволит все это дело оптимизировать на стадии компиляции.
> проебываешь на его императивное написание месяц-другой и все, хули нам хохлам.
Все ясно с тобой.
Поехавший шизик, который несет рандомную хуйню, не слышавший ни про bison ни про другие парсер/FSM генераторы. Ниразу не реализовавший ни один протокол.
Алсо, большинство протоколов пишется на С, а не на С++.
Вот только до сих пор непонятно каким хуем ты туда шаблоны собралися пихать и главное нахуя.
Дальше откровенно поехавший бред кукаретика.
Добавлю лишь, то что даже в санной яве есть конкурентные lock-free контейнеры и параллельные алгоритмы. А в ебаном С++, без сторонних либ типа Intel TBB, тебе придется въебать не малую кучу говна, прежде чем реализовать что-то подобное.
>При этом компилятор сгенерирует сотни и тысячи реальных классов
Ты забыл добавить: сделает сотни бесполезных копий твоего кода и экзешник в сотни мегабайт, засрет весь кеш процессора, и будет работать медленнее чем обычная Си-шняая реализация с void*
>откровенно поехавший бред кукаретика.
Самокритично. Особенно доставило про TBB и генераторы. Хотя что ждать от треда борщехлебов?
>bison ни про другие парсер/FSM
Может мне еще ASN1 в проект затащить, мамкин big data designer?
>class Vertex { float x, y, r, g, b; }
>в плюсах можно написать аллокатор, чтобы он это все разворачивал в xxyyrrggbb
Ну-ка, покажи нам такой аллокатор.
Да че ты хочешь от поехавших? Их уровень знания С++, как и всего CS в целом, заканчивается на уровне этого треда.
Я думаю он объебался со словом аллокатор, но сделать так можно: использовать три указателя, вместо трех значений. Типичная джавамакака как раз дрочит на указатели "как в этих проклятых крестах". Ну, чтобы для массива из 100 объектов не надо было датацентр арендовать.
The features of the C language were added with purpose. They were intended to solve a real problem and solve that problem they did. Simple arithmetic with promotion. Automatic register allocation with a portable (between compilers) ABI. A simple-but-handy preprocessor. And so on. C is also a lean language: a single person can feasibly write a C compiler in a relatively short time (tinycc is a C99-compliant C compiler written in just 65kLOC of C!). C set out to achieve a clear goal and it achieved its goal. Thanks to the cleanness of C lots of quality compilers came on the market quickly and even decent OSS solutions were available early on.
In contrast, C++ never had a clear goal. The features of C++ were added almost at random. Stroustrup's original idea was essentially "C is cool and OOP is cool so let's bolt OOP onto C". Retrospectively, OOP was massively overhyped and is the wrong tool for the job for most of the people most of the time. Half of the GoF design patterns just emulate idioms from functional programming. Real OOP languages like Smalltalk and IO express many useful things that C++ cannot. The feature that C needed most was perhaps parametric polymorphism (aka generics in Java and C#, first seen in ML in the late 1970s) but instead of that C++ got templates that weren't designed to solve any particular problem but rather to kind of solve several completely unrelated problems (e.g. generics and metaprogramming). Someone actually discovered by accident that C++ templates are Turing complete and they wrote and published a program that computed prime numbers at compile time. Wow. A remarkable observation that led to decades of template abuse where people used templates to solve problems much better solved by other pre-existing solutions such Lisp macros and ML polymorphism. Worse, this abuse led to even more language features being piled on top, like template partial specialization.
The massive incidental complexity in C++ made it almost impossible to write a working compiler. For example, it remains extremely difficult to write a parser for the C++ language. The syntax also has horrible aspects like List<Set<int>> being interpreted as logical shift right. None of the original C++ compilers were reliable. During my PhD in 2000-2004 I was still stumbling upon dozens of bugs in C++ compilers from GNU, Intel and SGI. Only after two decades did we start to see solid C++ compilers (by which time C++ was in decline in industry due to Java and C#).
C++ is said to be fast but the reality is that C++ is essentially only fast when you write C-like code and even then it is only fast for certain kinds of programs. Due to the "you don't pay for what you don't use" attitude, C++ is generally inefficient. RAII injects lots of unnecessary function calls at the end of scope, sometimes even expensive virtual calls. These calls often require data that would otherwise be dead so the data are kept alive, increasing register pressure and spilling and decreasing performance. The C++ exception mechanism is very inefficient (~6x slower than OCaml) because it unwinds the stack frame by frame calling destructors rather than long jumping. Allocation with new and delete is slow compared to a modern garbage collector so people are encouraged to use STL collections but these pre-allocate huge blocks of memory in comparison so you've lost the memory-efficiency of C and then you are advised to write your own STL allocator which is no better than using C in the first place. One of the main long-standing advantages of C over modern languages is the unpredictable latency incurred by garbage collectors. C++ offers the worst of both worlds by not having a garbage collector (making it impossible to leverage useful concepts like purely functional data structures properly) but it encourages all destructors to avalanche so you get unbounded pause times (worse than any production GC). Although templates are abused for metaprogramming they are very poor at it and C++ has no real support for metaprogramming. For example, you cannot write an efficient portable regular expression library in C++ because there is no way to do run-time code generation and compilation as you can in Java, C# and languages dating back to Lisp (1960). So while Java and C# have had regular expressions in their standard libraries for well over 10 years, C++ only just got them and they are slow.
C++ is so complicated that even world experts make rookie mistakes with it. Herb Sutter works for Microsoft and sits on the C++ standards committee where he influences the future of C++. In a lecture he gave his favorite 10-line C++ program, a thread-safe object cache. Someone pointed out that it leaks memory (Herb Sutter's favorite C++ 10-liner has a memory management bug).
My personal feeling is that the new Rust programming language is what C++ should have been. It has useful known features like generics, discriminated unions and pattern matching and useful new features like memory safety without garbage collection.
Принес тут крестовым блядинкам поразмышлять,
надеюсь крестобляди знают английский или умеют пользоваться переводчиком, чтоб почитать.
The features of the C language were added with purpose. They were intended to solve a real problem and solve that problem they did. Simple arithmetic with promotion. Automatic register allocation with a portable (between compilers) ABI. A simple-but-handy preprocessor. And so on. C is also a lean language: a single person can feasibly write a C compiler in a relatively short time (tinycc is a C99-compliant C compiler written in just 65kLOC of C!). C set out to achieve a clear goal and it achieved its goal. Thanks to the cleanness of C lots of quality compilers came on the market quickly and even decent OSS solutions were available early on.
In contrast, C++ never had a clear goal. The features of C++ were added almost at random. Stroustrup's original idea was essentially "C is cool and OOP is cool so let's bolt OOP onto C". Retrospectively, OOP was massively overhyped and is the wrong tool for the job for most of the people most of the time. Half of the GoF design patterns just emulate idioms from functional programming. Real OOP languages like Smalltalk and IO express many useful things that C++ cannot. The feature that C needed most was perhaps parametric polymorphism (aka generics in Java and C#, first seen in ML in the late 1970s) but instead of that C++ got templates that weren't designed to solve any particular problem but rather to kind of solve several completely unrelated problems (e.g. generics and metaprogramming). Someone actually discovered by accident that C++ templates are Turing complete and they wrote and published a program that computed prime numbers at compile time. Wow. A remarkable observation that led to decades of template abuse where people used templates to solve problems much better solved by other pre-existing solutions such Lisp macros and ML polymorphism. Worse, this abuse led to even more language features being piled on top, like template partial specialization.
The massive incidental complexity in C++ made it almost impossible to write a working compiler. For example, it remains extremely difficult to write a parser for the C++ language. The syntax also has horrible aspects like List<Set<int>> being interpreted as logical shift right. None of the original C++ compilers were reliable. During my PhD in 2000-2004 I was still stumbling upon dozens of bugs in C++ compilers from GNU, Intel and SGI. Only after two decades did we start to see solid C++ compilers (by which time C++ was in decline in industry due to Java and C#).
C++ is said to be fast but the reality is that C++ is essentially only fast when you write C-like code and even then it is only fast for certain kinds of programs. Due to the "you don't pay for what you don't use" attitude, C++ is generally inefficient. RAII injects lots of unnecessary function calls at the end of scope, sometimes even expensive virtual calls. These calls often require data that would otherwise be dead so the data are kept alive, increasing register pressure and spilling and decreasing performance. The C++ exception mechanism is very inefficient (~6x slower than OCaml) because it unwinds the stack frame by frame calling destructors rather than long jumping. Allocation with new and delete is slow compared to a modern garbage collector so people are encouraged to use STL collections but these pre-allocate huge blocks of memory in comparison so you've lost the memory-efficiency of C and then you are advised to write your own STL allocator which is no better than using C in the first place. One of the main long-standing advantages of C over modern languages is the unpredictable latency incurred by garbage collectors. C++ offers the worst of both worlds by not having a garbage collector (making it impossible to leverage useful concepts like purely functional data structures properly) but it encourages all destructors to avalanche so you get unbounded pause times (worse than any production GC). Although templates are abused for metaprogramming they are very poor at it and C++ has no real support for metaprogramming. For example, you cannot write an efficient portable regular expression library in C++ because there is no way to do run-time code generation and compilation as you can in Java, C# and languages dating back to Lisp (1960). So while Java and C# have had regular expressions in their standard libraries for well over 10 years, C++ only just got them and they are slow.
C++ is so complicated that even world experts make rookie mistakes with it. Herb Sutter works for Microsoft and sits on the C++ standards committee where he influences the future of C++. In a lecture he gave his favorite 10-line C++ program, a thread-safe object cache. Someone pointed out that it leaks memory (Herb Sutter's favorite C++ 10-liner has a memory management bug).
My personal feeling is that the new Rust programming language is what C++ should have been. It has useful known features like generics, discriminated unions and pattern matching and useful new features like memory safety without garbage collection.
Принес тут крестовым блядинкам поразмышлять,
надеюсь крестобляди знают английский или умеют пользоваться переводчиком, чтоб почитать.
Ты сейчас Structure Of Arrays.
И оно не обязательно быстрее будет, зависит от данных и алгоритма
>Принес тут крестовым блядинкам поразмышлять
> implying мы этого не знаем
Ну ты открыл секрет Полишинеля.
мимо-крестобоярин
Не понимаю, почему мартыханам так печет от крестов? Не хочешь - не пиши, сейчас миллион других языков. Но ведь нет, регулярно прискакивают в наш уютный тредик, и снова заводят унылую песню "ряяя кресты-говно, вы все дегенераты", как будто их Страуструп в детстве лично обидел.
Сам напиши. Я вот сейчас ебучий калькулятор с приоритетом операторов и скобок пишу. Внезапно понадобился.
У меня весь день на это уйдёт. Мне бы мануал и приммеры из которых можно копипастить. Да и вообще если самому писать, то это шантинг ярд выйдет, а я хочу что-нибудь покачиственее. С деревом приоритетов и всем таким.
Зачем тебе С++ тогда? С него обычно подростки начинают, чтобы игрули делать. Учи джаву лучше, там зарплаты выше.
Потому что по району ходят слухи что C++ быстр и производителен и выстраивает мышление правильным образом.
>Half of the GoF design patterns just emulate idioms from functional programming
>The C++ exception mechanism is very inefficient (~6x slower than OCaml)
>you cannot write an efficient portable regular expression library in C++ because there is no way to do run-time code generation and compilation as you can in Java, C# and languages dating back to Lisp (1960)
>while Java and C# have had regular expressions in their standard libraries for well over 10 years
>C++ быстр и производителен
Это факт, но тебе оно надо?
Быстрее плюсов есть только си и фортран, но на них что-то более или менее сложное заебёшься писать, да и то выйдет криво. Только ядро в пример не приводи.
> и выстраивает мышление правильным образом.
Ой, таких слухов не ходит. Все знают, что плюсы, как язык, это неперевариваемое говно. Просто пока альтернатив не завезли. Наоборот, есть крылатое выражение, что учить программированию на примере C++ это как проводить сексуальное воспитание на примере жестокой порнухи.
C++ это последний эшелон, когда всё остальное будет непосильно медленное или непосильно в разработке на голом си, даже если в си выносить отдельные кусочки. С++ должен быть третим, четвёртым, десятым языком, который ты узнаешь. Это тёмная сторона программирования, древнее зло, к которому можно прибегать только как к крайней мере.
>на них что-то более или менее сложное заебёшься писать, да и то выйдет криво
Ну если ты криворукая макака, то понятно выйдет криво на любом языке, просто в языках специально разработанных для макак, есть защита от дурака, чтоб он себе в ногу не смог выстрелить. А на СИшке пишется много чего, помимо ядра.
>альтернатив не завезли
Так Rust жи.
>Это факт, но тебе оно надо?
Дык. Производительность никогда не лишняя.
>Это тёмная сторона программирования, древнее зло, к которому можно прибегать только как к крайней мере.
Но это же хорошо. Я не люблю играть на лёгких уровнях сложности. С++ это разумный баланс между возможностью изучить и желанием поебаться.
Хотя с хардкора С++ конечно сложно перестать проигрывать.
Я вообще начинал с PHP и теперь просто офигеваю от работы с массивами в C++. Такая анальная ебля, что пиздец.
>Производительность никогда не лишняя
>Но это же хорошо. Я не люблю играть на лёгких уровнях сложности
>Я вообще начинал с PHP
> А на СИшке пишется много чего, помимо ядра.
Ты просто молодой, не видал современной большой залупы. На сишке приходится перепердоливать половину плюсов: исключения, полиморфизм на указателях на функции, шаблоны на препроцессоре и.т.п.
Посмотри сишные опенсурс проекты и поохуевай.
> Так Rust жи.
Так нет компилятора-то нормального. Векторизация там через пень-колоду работает, параллелизм на всяких par_for медленный очень, rsmpi даже пробовать страшно...
Вот когда будет компилятор, перейду на Rust. Нет вопросов. А пока приходится по старинке пердолиться.
>>1085474
> Дык. Производительность никогда не лишняя.
google://premature+opmtimization
> Я вообще начинал с PHP
Братан, у нас на хате принято про это молчать. По незнанке не зашквар, конечно, но всё-таки лучше уж плюсы, чем этот фрактал плохого дизайна. Не охуевай, с 99% вероятностью в пыхе всё куда хуже сделано.
Я предлагаю использовать lua как парсер и интерпретатор формул, с luajit скорость может быть как у натива. "Целый язык" не такой сложный и учится за вечер.
>Векторизация там через пень-колоду работает
В плюсах она точно так же анально работает. Паралелизм в плюсах у 80% проектов больше тыщи строк организовывается своими силами (как и все остальное), к тому же мессейдж пассингу есть биндинги для сишного говна (хотя такие вещи все компании обычно тоже велосипедят на коленке), так что хуй знает чо ты там возникаешь. Есть один компилятор, который везде работает одинаково, с единым языком и просто активнй опенсорс (а не хуита в стиле виндовой залупы в которой нет поддержки C99 и баги чинят по 3 года).
И где там аллокатор?
Там тупо выделяют массив флоатов и reinterpret_cast-ят его то как AOS, то как SOA
(нарушая при этом strict aliasing rule, как я понимаю).
Ну мне и показалось слишком простым, после начального вката - который для меня в целом был подвигом.
> Не охуевай, с 99% вероятностью в пыхе всё куда хуже сделано.
Хуже - наверное. Но господи как же там просто всё.
>google://premature+opmtimization
Одно дело лезть оптимизировать без профайлинга, а просто использовать другую технологию чтобы не закрывать себя заранее в рамки — совсем другое.
>Ты просто молодой
Мне 30.
>Посмотри сишные опенсурс проекты и поохуевай.
Я контрибьютор в нескольких крупных.
> На сишке приходится перепердоливать половину плюсов
Не понял о чем ты. На сишке переписывать код на плюсах или что?
>Так нет компилятора-то нормального
Ну это пока.
>Векторизация там через пень-колоду работает
Векторизация вообще везде через жопу работает даже на С, если ты ее не явно на ассемблере или интринсиксах делаешь. Я в этом экперт, это очень часто используется в моей работе.
Гладко было на бумаге, да забыли по овраги, а по ним ходить. На полном серьёзе, в плюсах векторизация, OpenMP и MPI ещё неплохо работают. Если у тебя есть опыт разработки продакшн-лилвел параллельного кода на Rust, то я милостливо прошу, я на конференцию тебя даже послушать приеду, на ПАВТ какой-нибудь.
Компилятор раста это параша уровня gcc, которая с нормальными компиляторами (например, Интела) рядом не лежала.
>>1085491>>1085492
Если у тебя есть одно узкое место, просто перепиши его на языке си и вызывай через JNI из Scala. Если не очень умный прямо, то используй Python, мощная штука и очень простая.
Плюсы нужны только когда есть невероятно медленный прототип.
>>1085500
Так это, вкидывай гитхаб, мы с пацанами посмотрим. Особенно на Rust вкидывай. Особенно как ты на интринсиках или ассемблере icpc обогнал, это мне особенно интересно. Чаще всего щеглы только хуй за щекой у своей мамки обгоняют.
Если ты сможешь обогнать наивную реализацию, скомпилированную icpc, то я так и напишу в треде: "я пиздабол, так и так, тут чувак смог обогнать современный интеловский компилятор". Только это, проверить надо, а иначе ненаучно выходит.
>векторизация
Даже если не ломает все нахуй — не факт что вообще получится что-то выиграть в перформансе.
>OpenMP и MPI
Тормоза и деревянные игрушки вбитые в пол.
Опять же — хочешь на плюсах и хорошо — делай всё сам. Библиотеки типа folly (реально хорошие, а не буст, один кусок которого использовать можно, а за другой нужно в гулаги сслать) только начинают появляться (спустя 40-то лет).
>через JNI из Scala
Если бы ты хоть раз работал с JNI то не говорил такой хуйни. Чтобы что-то с ним выиграть придется половину бизнес логики на плюсы перенести. Ну либо выйти из ситуации где у тебя скала отвечает за веб-морду а вся логика в нативном коде.
>Ну если ты криворукая макака,
Иди хуярь на ассемблере тогда, ты же не криворукий.
>Так Rust жи.
Хотя, я погорячился - ты же просто кукаретик.
> Даже если не ломает все нахуй — не факт что вообще получится что-то выиграть в перформансе.
Слив засчитан.
> Тормоза и деревянные игрушки вбитые в пол.
Слив засчитан. Если у тебя есть возможность обогнать 256 ядер кластера, которые оркеструются MPI, 32 ядрами одного узла, да ещё влиться в 256 ГБ памяти этого узла, то ты заслуживаешь минимум PhD. Публикуй.
> Чтобы что-то с ним выиграть придется половину бизнес логики на плюсы перенести.
Если так, то там не одно узкое место, и надо всё переписывать на плюсах, так это весь point моего поста.
>С++ настолько пытались сделать общим языком для всего, что получилось так, что он теперь не пригоден ни для чего.
FUD неосилятора.
>>1085282
>в то время как в плюсах можно написать аллокатор
Объясните мне в двух словах, как это можно провернуть, не используя указатели и не разбивая класс/структуру? Геттеры писать? Или контейнер сделать интрузивным? Если интрузивным, то на кой ляд аллокатор?
>>1085288
>Алсо, большинство протоколов пишется на С, а не на С++.
Что такого охуительного в C по сравнению с C++? Вам кто-то запрещает неиспользовать STL?
>>1085288
>Добавлю лишь, то что даже в санной яве есть конкурентные lock-free контейнеры и параллельные алгоритмы.
Стандарт не должен быть бустом.
>>1085290
>Ты забыл добавить: сделает сотни бесполезных копий твоего кода и экзешник в сотни мегабайт
Пример можешь показать?
>>1085299
Эксперты этот ресурс не видели никогда и ради ответа на твой вопрос читать его не будут.
>>1085318
> portable (between compilers) ABI
Учитывая то, что это АБИ минимальное настолько, насколько это возможно, то какое в этом достижение?
>>1085318
>RAII injects lots of unnecessary function calls at the end of scope, sometimes even expensive virtual calls.
Что значит лотс? Сколько объектов, столько и функций, что в это неправильного? Почему проблемы пользователей языка (делающих тяжёлые деструкторы и большие иерархии объектов) - это проблемы языка?
>These calls often require data that would otherwise be dead so the data are kept alive,
штоблядь
>The C++ exception mechanism is very inefficient (~6x slower than OCaml) because it unwinds the stack frame by frame calling destructors rather than long jumping.
Это может быть важно разве что для интерактивных программ - то есть, за счёт сборки мусора во время простоя увеличивается производительность во время вычислений.
>but it encourages all destructors to avalanche so you get unbounded pause times (worse than any production GC)
Что мешаешь сделать методы clear в объектах и вызывать их заранее, если так страшно нежелательна "пауза"? Чем это хуже, чем в Си, в котором программист делает то же самое, но только без гарантии проверки вызова деструктора? Данные и функции можно инкапсулировать в класс, класс разрушать вручную.
>there is no way to do run-time code generation and compilation as you can in Java, C# and languages dating back to Lisp (1960)
Сравнивает хуй с пальцем. Что значит "no way"? Если так сильно нужна кодогенерация, можно тащить компилятор целиком, LLVM x86-64 около 90 МБ весит без либ (которые для регексов, например, не нужны), его ещё и собрать можно с другими флагами, чтобы уменьшить.
>(Herb Sutter's favorite C++ 10-liner has a memory management bug).
http://flyingfrogblog.blogspot.ru/2013/10/herb-sutters-favorite-c-10-liner.html
Какой там меори лик, блядь? Виджеты в гуе размножаются почкованием?
>>1085489
Нет, там флоаты во флоат реинтерпретятся. И вообще, там какое-то расширение используется (аттрибут в начале кода), а не чистый C++.
>С++ настолько пытались сделать общим языком для всего, что получилось так, что он теперь не пригоден ни для чего.
FUD неосилятора.
>>1085282
>в то время как в плюсах можно написать аллокатор
Объясните мне в двух словах, как это можно провернуть, не используя указатели и не разбивая класс/структуру? Геттеры писать? Или контейнер сделать интрузивным? Если интрузивным, то на кой ляд аллокатор?
>>1085288
>Алсо, большинство протоколов пишется на С, а не на С++.
Что такого охуительного в C по сравнению с C++? Вам кто-то запрещает неиспользовать STL?
>>1085288
>Добавлю лишь, то что даже в санной яве есть конкурентные lock-free контейнеры и параллельные алгоритмы.
Стандарт не должен быть бустом.
>>1085290
>Ты забыл добавить: сделает сотни бесполезных копий твоего кода и экзешник в сотни мегабайт
Пример можешь показать?
>>1085299
Эксперты этот ресурс не видели никогда и ради ответа на твой вопрос читать его не будут.
>>1085318
> portable (between compilers) ABI
Учитывая то, что это АБИ минимальное настолько, насколько это возможно, то какое в этом достижение?
>>1085318
>RAII injects lots of unnecessary function calls at the end of scope, sometimes even expensive virtual calls.
Что значит лотс? Сколько объектов, столько и функций, что в это неправильного? Почему проблемы пользователей языка (делающих тяжёлые деструкторы и большие иерархии объектов) - это проблемы языка?
>These calls often require data that would otherwise be dead so the data are kept alive,
штоблядь
>The C++ exception mechanism is very inefficient (~6x slower than OCaml) because it unwinds the stack frame by frame calling destructors rather than long jumping.
Это может быть важно разве что для интерактивных программ - то есть, за счёт сборки мусора во время простоя увеличивается производительность во время вычислений.
>but it encourages all destructors to avalanche so you get unbounded pause times (worse than any production GC)
Что мешаешь сделать методы clear в объектах и вызывать их заранее, если так страшно нежелательна "пауза"? Чем это хуже, чем в Си, в котором программист делает то же самое, но только без гарантии проверки вызова деструктора? Данные и функции можно инкапсулировать в класс, класс разрушать вручную.
>there is no way to do run-time code generation and compilation as you can in Java, C# and languages dating back to Lisp (1960)
Сравнивает хуй с пальцем. Что значит "no way"? Если так сильно нужна кодогенерация, можно тащить компилятор целиком, LLVM x86-64 около 90 МБ весит без либ (которые для регексов, например, не нужны), его ещё и собрать можно с другими флагами, чтобы уменьшить.
>(Herb Sutter's favorite C++ 10-liner has a memory management bug).
http://flyingfrogblog.blogspot.ru/2013/10/herb-sutters-favorite-c-10-liner.html
Какой там меори лик, блядь? Виджеты в гуе размножаются почкованием?
>>1085489
Нет, там флоаты во флоат реинтерпретятся. И вообще, там какое-то расширение используется (аттрибут в начале кода), а не чистый C++.
>Если так, то там не одно узкое место, и надо всё переписывать на плюсах, так это весь point моего поста.
Если ты долбоёб и не можешь почитать как работает JNI — иди и получай PhD в расеюшке.
>Слив засчитан.
Отвечу тебе в твоём же стиле: покидай-ка гитхабчиков, дружочек. Особенно про MPI интересно, как там стандарт поживает и чем оркеструет.
>Я контрибьютор в нескольких крупных.
В студию.
>На сишке переписывать код на плюсах или что?
В свете этого утверждения предыдущее подвергается переезду вагоном сомнений.
>мы с пацанами посмотрим
Может хуй с пацанами друг другу пососете?
> Rust вкидывай
Я не пишу на расте, дебич.
> на интринсиках или ассемблере icpc обогнал
Реально заорал с этого и сразу стало понятно, что ты макака ни разу ничего не векторизовавшая.
Чаще всего ссаный icc просто ебашит очевидный код векторный написанный на С просто тупо наполовину обычными сингл инструкциями, и такая векторизация оказывается медленее раз в 5-8 чем на интринсиксах. И доверять компилятору, высоконагруженный код, который должен выживать из железа максимум, никогда никто не будет, ибо всегда будет существовать вероятность что компилятор сделает хуево. Интел это понимают, поэтому у них есть Math Kernel Library, иначе можно было бы доверить все компилятору и не делать никаких спец либ.
Но тебе откуда знать, ты скорее всего даже не реальный программист, а очередной диван в треде, максимум осиливший laba1.
Можешь не продолжать даже, ибо с нубами о чем-то спорить не вижу смысла.
>Math Kernel Library
Представь Манюнь, у них шаренная кодовая база. И кто еще после этого диван?
Хотя
>пососете
>дебич
> icc просто ебашит очевидный код векторный написанный на С
это риторический вопрос.
Бох ты мой, у меня от твоего кукареку уши заложило.
>Если ты долбоёб и не можешь почитать как работает JNI — иди и получай PhD в расеюшке.
Чего читать? Я писал код, который работает через JNI, весьма легко быстро писать, весьма быстро работает.
> Отвечу тебе в твоём же стиле: покидай-ка гитхабчиков, дружочек. Особенно про MPI интересно, как там стандарт поживает и чем оркеструет.
О, легко.
https://github.com/libMesh/
Вот плюсовая библиотека, там полна коробочка, шаблоны, MPI, говно вышло жуткое. Но быстрее ничего нет. Обгони на Расте хоть. Или покажи, что быстрее работает.
Не ощущаешь сил?
https://github.com/petsc/petsc
Я вызываюсь провести сравнения, реализуй мне из этой библиотеки BiCGStab с LU-предобуславливанием на Расте. Работать должно на MPI-кластере, тестировать будет на 256=16*16 процессоров. Я согласен сам твои результаты опубликовать и тебя первым автором поставить, ты только нормальную реализацию покажи.
Совсем уверенным себя чувствуешь? Перепиши на расте PARDISO. Хотябы версию для общей памяти.
>>1085521
>Я не пишу на расте, дебич.
Так чего ты тогда кукарекал?
> Чаще всего ссаный icc просто ебашит очевидный код векторный написанный на С
Дальше не читал.
https://gist.github.com/kbarbary/9efb3650f1b69b2b6b18e34ad347777b
Жду avx-версию, которая обгоняет референсную имплементацию.
Мощные сишные гитхабы-то будут сегодня, или перфоманс провалился и ты укатишься обратно в php-тред?
Че сказать то хотел, объебос?
Ты же понимаешь, что это анонимный форум, и как бы слово "анонимный" тут не просто так и предполагает, сохранение анонимности его участников, а за раскрытие на некоторых бордах даже банят, не знаю как в этой помойке. Но всегда веселили такие аутисты, которые не могут продолжить дискуссию, рациональными аргументами в поддержку своей позиции, а начинают орать ГИТХАБ СВОЙ ИЛИ НИБЫЛО! Пиздец же дауны. Каково такими быть?
>Ты же понимаешь, что это анонимный форум,
Гитхаб дохуя деанонит? Хотя судя по твоим жалким оправданиям у тебя уже нет другого выхода.
Ой, мы слив уже засчитали, без примеров с гитхаба не возвращайся, можешь чужой нести, но чтобы релевантный был.
>Правило это означает, что перед каждым доступом к значению по указателю, машинный код должен сторнуть все регистры
Это в каком параграфе стандарта так сказано?
> сторнуть все регистры, в которых содержатся lvalue-значения этого типа.
http://eel.is/c++draft/basic.lval#1.sentence-6
Давно C++-выражения хранятся в регистрах?
Ну, в целевой структуре алаймент будет таким же.
Вся суть слившегося студента-отличника обчитавшегося хабрапараши.
Слушай, мне вообще абсолютно насрать на то, что веришь ты или не веришь. Я не собираюсь тебе тут вайтпейперы писать, чтоб убедить в чем-то, какую-то поехавшую крестоблядину. Пиши как знаешь, мне похуй на тебя. Можешь хоть говном вымазаться.
Опять же
>Я скозал
Вообще изначальная тема была, то что С++ уебищный язык, но крестобляди, анальные рабы страустропа, лихо повернули всю тему дискуссии в другое русло, только бы не смотреть правде в глаза.
>Производную нужно обязательно брать автоматически из коробки
Ты пиздец много хочешь, братюня
https://www.google.ru/search?q=c+++symbolic+math+library
>>1085550
>Давно C++-выражения хранятся в регистрах?
Сам себя обосрал. В C++ нету регистров и форма твоего вопроса выдаёт то, что формулировку ты понял.
>Это в каком параграфе стандарта так сказано?
Окей, я понял, объяснять на пальцах в терминах самого популярного вида архитектуры ЦП не надо, ты говоришь только на языке стандарта. Но при этом слово "регистр" ты почему-то знаешь. Готов принять красную пилюлю?
>>1085561
Действительно, в интернете кто-то неправ и на хую вращал твоё желание поговорить на интересную ТЕБЕ тему.
Вот что нашёл. Подходит по всем пунктам кроме возможности посчитать производную.
Заглядывали бы эти начальники хоть иногда в вуз. Спасибо за объяснение.
ход нет. у него от буста зависимость.
Это типо трифорс? В основе всего кресты?! Спасибо, отличная картинка!
Очередной памятник плюсам
Как за всем уследить, как видеть возможность применять фичи
Исопльзуй boost, например, оттуда все говно в стандарт тянется. А если ты решил ударить по шаблонам, то тут ты будешь ебаться всегда вне зависимости от стандарта.
Постараюсь, ага
Просто постоянно натыкаюсь на новые фичи и начинаю себя некомфортно чувствовать, что я их не использую. Потом начинаю пихать их повсюду и опять начинаю себя некомфортно чувствовать. Так вот и живу ВДИСКОМФОРТЕ
Смотря какая ты макака.
Если бизнес-макака, то нужны интегралы
Если графон-макака, то больше тригонометрии и матриц вряд ли что-то понадобится
Если нейроно-макака, то нужно знать специфику нейроночек
Но везде самое главное - знание алгоритмов, а то понаприходют, блять, хэш-таблицу от дерева не могут отличить (ну это я утрирую)
Это копия, сохраненная 15 ноября 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.