Anonymous
На контекст класса.
Вы же собрались передавать указатель на объект. А не объект ?
Andy
Где?
вот тут прям можно. Например так : class Students { // Имя студента std::string name; // Фамилия std::string last_name; // Пять промежуточных оценок студента int scores[5]; // Итоговая оценка за семестр float average_ball; };
Anonymous
Я увы не знаю. Знаю что к экземплярам лепится указатель на контекст. Поэтому и спрашиваю.
Это тут при чем, это заботы компилятора, он знает какой метод вызывать для какого объекта и пропимывает это во время компиляции. Либо, при динамическом связывании , связывание происходит во время вызова
Andy
Я к тому, что где обвинение? =)
"Вы все мимо стреляете =)" Вот. Опять же штука :)
SetPf
вот тут прям можно. Например так : class Students { // Имя студента std::string name; // Фамилия std::string last_name; // Пять промежуточных оценок студента int scores[5]; // Итоговая оценка за семестр float average_ball; };
class Command { public: // Fields CommandType type; struct { page_id page; var_id var; VarType type; }variable; // Methods /// Constructor & destructor Command(); Command(CommandType init_type, page_id init_page, var_id init_var, VarType init_var_type); ~Command() {}; /// Converts data to display-accepted-string /// @param - Destination /// @return - char* SerializeForDisplay(char* destination); };
SetPf
"Вы все мимо стреляете =)" Вот. Опять же штука :)
Да я к тому, что не в ту сторону разговор идет.
Anonymous
АПИ очереди принимает указатель на память.
Вот вы говорите что передавать будете указатель а не объект
SetPf
Anonymous
Вот я про это примерно пытался узнать. В интернете написано - что да, зависит от компилятора и иногда идет вместе с объектом иногда нет.
Я вам первым ответом написал как это проверить. Вообще это задача программиста знать что и как у него хранится
Anonymous
В объекте
SetPf
Лучше кодом наверное.
xQueueSend принимает указатель на область памяти. Откуда заберет себе значение. Поэтому да, передаю в очередь по значению, но в АПИ передаю указатель =) Я черт знает как это объяснить иначе. BaseType_t xQueueSend( QueueHandle_t xQueue, const void * pvItemToQueue, TickType_t xTicksToWait );
Andy
class Command { public: // Fields CommandType type; struct { page_id page; var_id var; VarType type; }variable; // Methods /// Constructor & destructor Command(); Command(CommandType init_type, page_id init_page, var_id init_var, VarType init_var_type); ~Command() {}; /// Converts data to display-accepted-string /// @param - Destination /// @return - char* SerializeForDisplay(char* destination); };
Отлично! Теперь создаем экземпляр класса, получаем кусок памяти выделенный для type, еще один кусок с variable и т.д. И совсем не гарантируется, что эти куски будут лежать вместе.
Andy
Ну они же будут лежать в области определенного размера, которая будет sizeof(Command)?
не совсем, в области Command будут указатели на эти структуры, а где они будут уже как пойдет.
SetPf
не совсем, в области Command будут указатели на эти структуры, а где они будут уже как пойдет.
Во как. Т.е. получается наверняка - надо сериализировать и структуру какую отправлять.
Anonymous
Ну они же будут лежать в области определенного размера, которая будет sizeof(Command)?
Если Command имеет виртуальных родителей то в объекте будет ссылка на таблицу виртуальных методов. Для динамического связывания
Andy
Во как. Т.е. получается наверняка - надо сериализировать и структуру какую отправлять.
Может быть. Но более правильно на мой взгляд будет передавать не экземпляр класса (нам же не нужно знать как обрабатывать данные в очереди, это знает сам класс), а достаточно только сами данные отправить, тот же type например.
Anonymous
Указатель это адрес в памяти где хранится ваш объект
SetPf
Т.е. по хорошему - объединить их в структуру (паблик тайпдеф в классе) и ею кидаться?
SetPf
Вы передаёте указатель, ни чего кроме указателя он содержать не будет
Она принимает указатель на область памяти, откуда копируются данные в очередь, по размеру заданому при инициализации.
SetPf
Откуда он узнает что там лежит и какого размера? И зачем ему копировать то
Так работают очереди фриртоса. Размер задается при инициализации.
SetPf
SetPf
Офф пример.
SetPf
Сишный апи же. Я то себе на тимплейт переделал =)
Anonymous
Может подзабыл я уже
SetPf
Anonymous
Так как же вы тогда создали очередь если не знаете размер своих объектов?
Anonymous
Да и в примере создаётся глубина очереди, а не это вот все
SetPf
Так как же вы тогда создали очередь если не знаете размер своих объектов?
Так я ее создам по sizeof(Class), компилятор знает. Я не знаю =)
Anonymous
Давайте снова тогда. Вопрос какой? 😄
SetPf
Да и в примере создаётся глубина очереди, а не это вот все
Ну в примере передается кол-во сущностей максимально и размер сущности. Этого достаточно.
Anonymous
Так я ее создам по sizeof(Class), компилятор знает. Я не знаю =)
Тогда вам нужно написать конструктор копирования, если вы хотите помешать объекты класса
SetPf
Давайте снова тогда. Вопрос какой? 😄
Да энди на вопрос уже ответил. Что нихрена не факт что и как лежит в памяти по указателю на экземпляр.
SetPf
И надо сериализировать перед отправкой.
Anonymous
Если вы хотите передавать ссылки на класс, тогда вам нужно писать sizeof (clsss *)
Alexey
А почему бы просто не передавать указатель на экземпляр? На сколько я понял он уже существует до отправки в очередь
Anonymous
Это не питон, за каждым байтом следить вам
SetPf
Тогда вам нужно написать конструктор копирования, если вы хотите помешать объекты класса
Ну я хотел перехетрить сам себя и т.к. класс без дин выделения, положится что xQueueSend его просто побайтово скопирует верно.
Andy
А почему бы просто не передавать указатель на экземпляр? На сколько я понял он уже существует до отправки в очередь
Если гарантировать, что экземпляр будет жив во время выхода задачи из блокирования, то можно
Alexey
объект существует в одном месте, статический экземпляр. В очередь идёт его указатель. Из очереди достается указатель и обращение к статическому объекту идёт через указатель
Alexey
выделения памяти нет
SetPf
Так он говорит: я передам указать а объект сам скопируется
Так он и скопируется, просто не конструктором а побайтово по адресу в памяти.
Alexey
Ну это если создать объект класса прямо в коде, без new. Память для него алоцируется на этапе компиляции
Alexey
В очередь ничего не копируется, в нее идут 4 байта - указатель на место в памяти, а по адресу лежит уже сам объект
Anonymous
В примере создаётся очередь такой толщины и такой глубины. Если вы будете записывать указатели, значит в очереди будут храниться указатели
SetPf
Там даже написано /* Send an unsigned long. Wait for 10 ticks for space to become available if necessary. */
Anonymous
Все, я пасс.... 😁
SetPf
А ниже
SetPf
Как отправляется указатель.
Alexey
Бред. Это значит что очередь может быть занята другим процессом, тогда он будет пытаться положить в нее данные в течении 10 тиков
Alexey
ну если как троллинг, то неплохо 😄
Alexey
нет, это именно когда в нее помещаются данные
Alexey
очереди это изначально безопасный механизм обмена данными между потоками.
Anonymous
Нормально очереди работают во фриртосе. Ни кто за программиста ни чего не копирует тайком, что поместил, то достал
Alexey
пример с офф сайта фриртоса весьма хорош. Он показывает два способа использования очередей. В первом случае размер данных 4 байта (unsigned long) то есть его можно сразу положить в очередь, без использования указателей, потому что указатель занимает эти же 4 байта. А вот структура занимает уже больше байт, и, чтобы избежать ненужного копирования, в очередь уходит только указатель на эту структуру, которая была создана ранее. Таким образом "копируются" только 4 байта указателя
SetPf
@Alexey_V_Volkov по моему изначальному вопросу не подскажите?
Anonymous
Как отправляется указатель.
Отправляется в очередь указатель и этот же указатель достается из очереди
Anonymous
Объект со своими данными где лежал там и лежит
Alexey
я уже подсказал. Создаете объект в том месте, где он никогда не уничтожится (не выйдет из области видимости). Очередь создаете на нужное количество указателей (то есть размер элемента очереди всегда 4 байта). Затем в очередь отправлете указатели на те самые, уже созданные, объекты
romanetz
Такое себе
romanetz
Отгораживать мютексом придётся
Anonymous
<Сейчас должен последовать вопрос про таблицу>
Alexey
Отгораживать мютексом придётся
ну это уже другачя задача совсем