Добрый день.
Возможно вопрос соответствует не очень высокому уровню, прошу прощения, если что.
Вот есть такой код в книге «Язык программирования C++ С. Прата»:
const int LIM = 20;
struct planet {
char name[LIM];
double population;
double g;
};
planet pi;
// Сохранение объекта pi в файл:
fout("planets.dat",ios_base::out | ios_base::app | ios_base::binary);
fout.write((char*) &pl, sizeof pi);
Правильно ли я понимаю, что внутреннее представление объекта pi принадлежащего структуре/классу planet определяется реализацией компилятора и не оговорено стандартом? И тот же вопрос для случая, когда среди членов класса будут объекты других классов, контейнеры, умные указатели и прочее. Немного уточню вопрос: массив char получающийся в итоге и сохраненный в файле будет одинаковый на разных платформах и компиляторах и оговорено ли в стандарте то какой будет этот масссив (т.е. оговорено ли, какое будет побайтовое представление объекта в памяти)?
UPD0
Помечу, что для единообразного преобразования числа в массив байт, и последующего единообразного обратного преобразования (даже при том, что эти преобразования могут быть выполнены на разных пк (например при передаче по сети) в программах, которые были скомпилированы разными компиляторами) можно использовать: Boost.Lexical_Cast std::stringstream (указано в документации к Boost.Lexical_Cast) Qt QDataStream
Добрый день.
В корне проекта есть каталог config. В нем есть файл config.h.in. Это шаблон конфигурационного файла на основе которого при сборке через механизм cmake configure_file() генерируется файл config.h который будет подключаться в исходниках целей через директиву
// Здесь не указываются пути, только имя файла
#include "config.h"
Также в каталоге config есть файл CMakeLists.txt следующего содержания (config.h.in добавляется к цели для того, чтобы отображаться в дереве проекта в IDE):
add_library(config config.h.in)
set_target_properties(config PROPERTIES LINKER_LANGUAGE CXX)
# или же можно установить свойства конкретного файла (с тем же эффектом)
# set_source_files_properties(config.h.in PROPERTIES LANGUAGE CXX HEADER_FILE_ONLY ON)
set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON)
configure_file(config.h.in config.h)
Без второй строки получаю ошибку:
CMake Error: Cannot determine link language for target "config".
CMake Error: CMake can not determine linker language for target: config
(это из-за того что cmake по расширению .in не может определить язык поэтому далее я указываю язык явно через set_target_properties())
Данный файл подключается в корневом файле CMakeLists.txt через команду
add_subdirectory("config")
Также есть подкаталог program со своим CMakeLists.txt который подключается в корневом CMakeLists.txt также через команду add_subdirectory(). Вот содержимое CMakeLists.txt из подкаталога program:
В данном случае я добавил config в команду target_link_libraries() для того, чтобы добавить к текущей цели каталоги с заголовочными файлами из цели config.
При данной конфигурации сборка работает.
Вопрос: правильная ли это архитектура? Или добавить путь к конфигурационному файлу удобнее иначе? Например через команду cmake add_custom_target (через нее у меня не получилось, но возможно я делал это как-то не корректно)?
Добрый день. Имеется система VxWorks 6.8 и ее Ide Workbench. Есть проект. Проект собирается в качестве Downloadable Kernel Module. И при запуске получается вот такая ошибка:
memPartAlloc: block too big ...
Я понимаю, что в процессе работы моего кода, было выделено памяти больше чем позволено по дефолту. Так вот помогите пожалуйста настроить это допустимое количество памяти, куда тут смотреть? Имею ввиду конечно опции проекта в Workbench.
Добрый день.
Подскажите место в стандарте, где разъясняется следующее поведение:
#include <iostream>
using namespace std;
class A {
int i_ = 555;
friend void f0(A& a) {
cout << a.i_ << endl;
}
friend void f1() {
A a;
cout << a.i_ << endl;
}
};
// Если не указать эту строку,
// то дальнейший вызов f1() не удастся
void f1();
int main() {
A a;
f0(a);
// Здесь будет ошибка, если выше
// нет объявления f1() вне класса
f1();
return 0;
}
Где в стандарте написано, что в данном случае для f0 достаточно объявления в классе, а для f1 нет?
Заранее спасибо.
UPD0
Нашел ответ.
В книге Язык программирования C++ Специальное издание (Бьерн Страуструп) 11.5.1. Поиск друзей
...
Дружественная функция может явно объявляться таким же образом, что и дружественный класс; или же ее можно искать по типу аргументов (§8.2.6) даже в случае, когда она объявлена вовсе не в самой близкой из охватывающих областей видимости.
Например:
void f(Matrix& m) {
invert(m); // invert() - друг класса Matrix
}
Итак, дружественная классу функция или объявляется в непосредственно охватывающей области видимости, или имеет аргумент типа класса (или производного от него класса) (§13.6), или вообще не может быть найдена.
... 8.2.6. Поиск имен
Чаще всего функция с аргументом типа Т определяется в том же пространстве имен, что и тип Т. Поэтому, если функцию не удается найти в контексте, где она используется, поиск продолжается в пространстве имен ее аргументов.
Например:
namespace Chrono {
class Date{ /*...*/};
boot operator==(const Date&, const std::string&);
std::string format(const Date&); // выдать строковое представление
// ...
}
void f(Chrono::Date d, int i) {
std::string s = format(d); // Chrono::format()
std::string t = format(i); // error: нет format() в области видимости
}
Добрый день.
Подскажите пожалуйста момент.
Можно в C++ вызывать метод объекта сразу при создании:
class SomeClass {
public:
int someMember() { return 0; }
};
int main() {
int i = SomeClass().someMember();
return 0;
}
Я так никогда не делал, т.к. считал, что это не по фэншую. Но вот иногда встречается в библиотеках эта форма (например в OpenCV есть).
Как вы к такому относитесь? И укажите пожалуйста, если в курсе, в стандарте такая форма где-то упомянается?
Добрый день.
Посоветуйте пожалуйста ПО для геометрических вычислений.
Конкретно нужно:
- Нарисовать отрезок/прямую/многоугольник/окружность/точку.
- Получить точки пересечения прямых/отрезков/многоугольников/окружностей.
- Иметь возможность сохранить координаты точек многоугольников и остальных фигур в простом текстовом формате.
Добрый день.
В книге Приемы объектно-ориентированного проектирования. Паттерны проектирования от Банды четырех в главе о Наблюдателе обсуждается так называемый менеджер изменений (ChangeManager), применяемый для инкапсуляции сложной семантики обновления. А также реализация основанная на ациклическом направленном графе зависимостей между субъектами и их наблюдателями (DAGChangeManager).
0) В начале описания менеджера изменений пишется, что если некоторая операция влечет за собой изменения в нескольких независимых субъектах, то нужно, чтобы наблюдатели уведомлялись после того, как будут модифицированы ВСЕ субъекты, дабы не уведомлять одного и того же наблюдателя несколько раз. Почему именно так? Ведь если субъекты независимы, то логично при изменениях в некотором субъекте СРАЗУ уведомить соответствующих наблюдателей. И почему тут говорится НЕ УВЕДОМЛЯТЬ НЕСКОЛЬКО РАЗ ? Ведь за один вызов уведомляющей функции наблюдателю передается информация об изменении одного субъекта, соответственно, для того, чтобы уведомить его об изменениях в нескольких субъектах, нужно вызвать уведомляющую функцию, соответствующую каждому субъекту. Соответственно в любом случае будет столько вызовов уведомляющей функции, сколько субъектов изменилось для каждого наблюдателя.
1) В описании говорится, что если у одного наблюдателя несколько субъектов, то плохо, когда изменения сразу у нескольких субъектов, ведь тогда наблюдатель получит избыток уведомлений. Но почему избыток? Ведь логично, что от каждого субъекта будет по одному уведомлению для каждого субъекта? И далее пишется, что DAGChangeManager гарантирует, что наблюдатель получит только одно уведомление. Опять-таки какого хрена? Ведь нужно, чтобы наблюдатель получил уведомление от каждого субъекта, у которого зарегистрирован.
2) Можете более подробно описать работу DAGChangeManager?
Добрый день. Кто в ваших конторах (должность) пишет документы SRS(Software requirements specification), SDD(Software design description) и прочие? И второй вопрос: эти документы пишутся перед непосредственной разработкой, во время или после?
Добрый день.
Есть необходимость производить некоторое количество геометрических расчетов. Поиск точек пересечения, некоторые операции с векторами на плоскости и т.п. Так вот столкнулся с известными проблемами double (потеря точности). Как бы вы сделали, заморачивались бы с double самостоятельно или просто взяли бы готовую библиотеку, которая позволяет представлять числа с фиксированной точностью (Boost.Multiprecision)?
Добрый день всем.
Навеяно темой про emoji (Как вы относитесь к идее запрета emoji на форуме?).
Не знаю право, насколько есть польза от emoji.
Но вот хорошо было бы иметь возможность добавлять в сообщения изображения (хотя бы в SVG), чтобы при обсуждении некоторых вопросов графически изобразить вопрос или ответ (например схему сети или диаграмму классов и т.п.)
Как думаете?
Добрый день.
Есть ли какая-нибудь не очень большая кроссплатформенная (linux / windows) C++ (или C на худой конец) библиотека для получения списка процессов, получения объема используемой памяти, загрузки процессора по каждому процессу и по всей системе и другой сопутствующей информации?
struct Base
{
virtual int Foo()
{
return -1;
}
};
struct Derived : public Base
{
virtual int Foo()
{
return -2;
}
};
int main(int argc, char* argv[])
{
Base *x = new Derived;
ASSERT(-2 == x->Foo());
//syntax is trippy but it works
ASSERT(-1 == x->Base::Foo());
return 0;
}
Но интересно, такая форма описана в каком-нибудь стандарте?
Добрый день.
Нужно сделать вот что.
Документ
1-2 страницы без нумерации,
3-4 нумерация римскими цифрами начиная с I (т.е. I-II),
5 и далее нумерация арабскими цифрами начиная с 1 (т.е. 1,2,3,...,n)
Пока просто сделано отдельными документами ((1-2),(3-4),(5-n)), но это не солидно. Подскажите пожалуйста, как это сделать в одном документе.
Добрый день. Тема поднималась хренову тучу раз, уж простите. Вопрос: объявляете ли вы деструкторы производных классов виртуальными? Я знаю, что не обязательно, что и так будет работать. Тут вопрос скорее такой: с точки зрения правил хорошего тона нужно ли это делать?
Добрый день. Есть программа, она выполняет опрос некоторого железа и сохраняет результат опроса в базу данных PostgreSQL. Нужно наличие системы пользователей, т.е. запускает человек эту программу, выбирает свою фамилию, вводит пароль и работает, а результат сохраняется под его фамилией. Так вот. Как хранить пользователей? Делать в базе таблицу users с пользователями или на каждого пользователя заводить роль в PostgreSQL?
Добрый день. Система kde.neon (на основе ubuntu 18.04) Как понять, что работает nvidia карта. Использую nvidia-prime. При выборе и intel и nvidia, glxgears показывает одинаковый результат ~60fps (если задавать vbalnk_mode=0 то примерно ~8000-9000fps и на intel и на nvidia).
Добрый день. Есть необходимость собрать свое приложение 32 битной версии и соответственно и саму библиотеку Qt. На компьютере система 64 битная. Вопрос: хотя бы общая последовательность действий, как это сделать или это слишком трудоемко и лучше/надежней просто собрать все в 32 битной системе?