реклама на сайте
подробности

 
 
> Список.
Jenya7
сообщение Mar 3 2016, 09:22
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



есть структура.
Код
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;


Сообщение отредактировал Jenya7 - Mar 3 2016, 09:37
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
Kabdim
сообщение Mar 3 2016, 09:53
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Сделайте указатель и вставьте его.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 3 2016, 10:08
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Kabdim @ Mar 3 2016, 15:53) *
Сделайте указатель и вставьте его.

да. спасибо.

а вот интересно. при вставке нового элемента он должен быть глобальным? а если его еще нет?
скажем адресная книга.
есть список контактов в адресной книге и у каждого контакта есть список детей - это второй список. но пользователь еще не ввел данные – реально элемента не существует. теперь пользователь ввел данные - я создал элемент (контакт) - но он локальный. куда будет указывать next?


Сообщение отредактировал Jenya7 - Mar 3 2016, 10:18
Go to the top of the page
 
+Quote Post
XVR
сообщение Mar 3 2016, 12:43
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
а вот интересно. при вставке нового элемента он должен быть глобальным? а если его еще нет?
Списки обычно делаются на динамической памяти - malloc и free вам в помощь (ну или new и delete)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 3 2016, 12:50
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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


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

Go to the top of the page
 
+Quote Post
XVR
сообщение Mar 3 2016, 13:13
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



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

В общем вам нужен менеджер памяти, а уж будет это стандартный malloc/free из libc или ваш собственный malloc/free роли не играет
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 3 2016, 13:42
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

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

я понял. главная проблема malloc это фрагментация. но мне подсказали что если я удаляю элемент из середины на его место можно подставить последний.

Сообщение отредактировал Jenya7 - Mar 3 2016, 13:42
Go to the top of the page
 
+Quote Post
megajohn
сообщение Mar 3 2016, 15:05
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(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 этим не страдают


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
XVR
сообщение Mar 3 2016, 15:31
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



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

Есть менеджеры и для встраиваемых приложений, покопайте в Интернете.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 3 2016, 17:18
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



спасибо. поищу менеджер памяти.
Go to the top of the page
 
+Quote Post
dxp
сообщение Mar 4 2016, 05:24
Сообщение #11


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (Jenya7 @ Mar 3 2016, 23:18) *
спасибо. поищу менеджер памяти.

https://github.com/emb-lib/heap_z


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 5 2016, 09:35
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(dxp @ Mar 4 2016, 10:24) *

спасибо. попробую перевести в С.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 5 2016, 09:59
Сообщение #13


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



не нужно переводить в Ц. Просто добавьте в проект и добавьте еще один .cpp-файл с определением объекта кучи.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 5 2016, 13:38
Сообщение #14


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

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

не хочет компилятор компилить cpp файлы. выдает кучу ошибок. например не понимает namespace.

Сообщение отредактировал Jenya7 - Mar 5 2016, 13:45
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 5 2016, 15:50
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(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. Если это ИАР, то в настройках проекта есть галочка "определять язык по расширению". Вам надо выбрать ее.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 20:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01483 секунд с 7
ELECTRONIX ©2004-2016