Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Список.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Jenya7
есть структура.
Код
struct parent
{
  uint8_t name[40];
  uint32_t a;
  uint32_t b;
  struct parent *next
}parent;

можно организовать список со вставкой и удалением элементов списка.
а если я хочу вставить список в эту структуру. возможно ли такое?

struct parent
{
uint8_t name[40];
uint32_t a;
uint32_t b;
тут вставить список
struct parent *next
}parent;

я имею в виду вставить список других элеметов
Код
struct child
{
  uint8_t name[40];
  uint32_t a;
  uint32_t b;
  struct child *next
}child;
Kabdim
Сделайте указатель и вставьте его.
Jenya7
Цитата(Kabdim @ Mar 3 2016, 15:53) *
Сделайте указатель и вставьте его.

да. спасибо.

а вот интересно. при вставке нового элемента он должен быть глобальным? а если его еще нет?
скажем адресная книга.
есть список контактов в адресной книге и у каждого контакта есть список детей - это второй список. но пользователь еще не ввел данные – реально элемента не существует. теперь пользователь ввел данные - я создал элемент (контакт) - но он локальный. куда будет указывать next?
XVR
Цитата
а вот интересно. при вставке нового элемента он должен быть глобальным? а если его еще нет?
Списки обычно делаются на динамической памяти - malloc и free вам в помощь (ну или new и delete)
Jenya7
Цитата(XVR @ Mar 3 2016, 18:43) *
Списки обычно делаются на динамической памяти - malloc и free вам в помощь (ну или new и delete)


malloc и free этого как раз я хочу избежать. в эмбедед это плохо.
посоветовали создать свой struct parent my_memory[100]; и туда вносить/удалять элементы. проблема если я удаляю элемент в середине - что делать? сдвигать все элементы влево?

XVR
Цитата(Jenya7 @ Mar 3 2016, 15:50) *
malloc и free этого как раз я хочу избежать. в эмбедед это плохо.
посоветовали создать свой struct parent my_memory[100]; и туда вносить/удалять элементы.
И чем это отличается от своего собственного malloc/free? И отдать сразу 100 штук структур, даже если реально будет использоваться одна - это хорошо? rolleyes.gif
Код
проблема если я удаляю элемент в середине - что делать? сдвигать все элементы влево?
Если вам нужен именно список, то сдвигать не надо (просто потом переиспользуете освобожденный элемент под другой элемент списка). Если нужен массив - то да, сдвигать.

В общем вам нужен менеджер памяти, а уж будет это стандартный malloc/free из libc или ваш собственный malloc/free роли не играет
Jenya7
Цитата(XVR @ Mar 3 2016, 19:13) *
И чем это отличается от своего собственного malloc/free? И отдать сразу 100 штук структур, даже если реально будет использоваться одна - это хорошо? rolleyes.gif
Код
проблема если я удаляю элемент в середине - что делать? сдвигать все элементы влево?
Если вам нужен именно список, то сдвигать не надо (просто потом переиспользуете освобожденный элемент под другой элемент списка). Если нужен массив - то да, сдвигать.

В общем вам нужен менеджер памяти, а уж будет это стандартный malloc/free из libc или ваш собственный malloc/free роли не играет

я понял. главная проблема malloc это фрагментация. но мне подсказали что если я удаляю элемент из середины на его место можно подставить последний.
megajohn
Цитата(Jenya7 @ Mar 3 2016, 16:42) *
я понял. главная проблема malloc это фрагментация


нет, не поняли

в терминологии SYS/BIOS (операционка под TI`шные uC, процессоры и DSP ) есть три вида выделения памяти на куче
1 HeapMem. Allocate variable-size blocks
2 HeapBuf. Allocate fixed-size blocks
3 HeapMultiBuf. Specify variable-size allocation, but internally allocate from a variety of fixed-size blocks

так вот, 2 и 3 этим не страдают
XVR
Менеджеров памяти существует вагон и маленькая тележка. И хотя снаружи они все более менее похожи (обычно разные вариации malloc/free) внутри они могут очень существенно различаться. Все зависит от требований. malloc в libc является средне-плохим менеджером rolleyes.gif - он удовлетворительно подходит для всех применений.

Есть менеджеры и для встраиваемых приложений, покопайте в Интернете.
Jenya7
спасибо. поищу менеджер памяти.
dxp
QUOTE (Jenya7 @ Mar 3 2016, 23:18) *
спасибо. поищу менеджер памяти.

https://github.com/emb-lib/heap_z
Jenya7
Цитата(dxp @ Mar 4 2016, 10:24) *

спасибо. попробую перевести в С.
Сергей Борщ
не нужно переводить в Ц. Просто добавьте в проект и добавьте еще один .cpp-файл с определением объекта кучи.
Jenya7
Цитата(Сергей Борщ @ Mar 5 2016, 15:59) *
не нужно переводить в Ц. Просто добавьте в проект и добавьте еще один .cpp-файл с определением объекта кучи.

при компиляции не находит heapcfg.h. наверное эти файлы часть фреймворка emb-lib.

не хочет компилятор компилить cpp файлы. выдает кучу ошибок. например не понимает namespace.
Сергей Борщ
Цитата(Jenya7 @ Mar 5 2016, 15:38) *
при компиляции не находит heapcfg.h. наверное эти файлы часть фреймворка emb-lib.

Это файл "тонких настроек" менеджера памяти. Пока в нем только объявляется объект, исключающий одновременное обращение в многопоточной системе. Поскольку у вас (полагаю) не используется многопоточная ОС, вам достаточно объявить в этом файле ничего не делающий класс:

Код
#ifndef HEAPCFG_H__
#define HEAPCFG_H__

struct heap_guard_default
{
    void lock()   { }
    void unlock() { }
};

#endif // HEAPCFG_H__


Также вам понадобится файл .cpp с определением объекта менеджера кучи примерно такого содержания:
Код
#include <stdint.h>
#include <heap.h>

heap::pool<4096> HeapPool;   // 4096 - размер "кучи" в байтах

heap::manager<heap_guard_default> heap::Manager(HeapPool);

После этого в вашем проекте будут работать malloc(), free() new, delete.

Цитата(Jenya7 @ Mar 5 2016, 15:38) *
не хочет компилятор компилить cpp файлы. выдает кучу ошибок. например не понимает namespace.
Очевидно, вы заставили ваш компилятор компилить этот файл в режиме обычного C. Если это ИАР, то в настройках проекта есть галочка "определять язык по расширению". Вам надо выбрать ее.
Jenya7
понял. спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.