Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2012, 10:02   #1
Unmanner
Пользователь
 
Регистрация: 18.03.2011
Сообщений: 47
По умолчанию Как сэкономить память?

#define PORTS 260
#define MAX_NUMBER_OF_ENTRIES 255

Есть у нас такой интересный указатель:
STRUCT_T (*location)[MAX_NUMBER_OF_ENTRIES];

Под него выделалясь память:
location = (STRUCT_T (*)[MAX_NUMBER_OF_ENTRIES]) malloc( sizeof(STRUCT_T) * PORTS * MAX_NUMBER_OF_ENTRIES );

location[PORT][ENTRY].a = 4;
location[PORT][ENTRY].b = 5;
...
И так далее..

Как видно что у нас выделется память под PORTS * MAX_NUMBER_OF_ENTRIES позиций.

Теперь представьте что нам из PORTS нужны только 3 штуки, выделять память под остальные абсолютно не требуется.

Вопрос, как реализовать это, оставляя интексацию по типу переменной location неизменной?


Было предложено такое решение:

Объявить указатель следующим образом:

STRUCT_S_T *location;

typedef STRUCT_T *STRUCT_S_T[MAX_NUMBER_OF_ENTRIES];

Всё, далее у меня начались затруднения с реализацией, а главное из них, "Как выделить память под location? Исходя из того что PORTS = 3"

И чтобы обращаться к ней так:

location[123][ENTRY].a = 4;
location[56][ENTRY].a = 5;
location[32][ENTRY].a = 5;

-------
Заранее спасибо за помощь!
Unmanner вне форума Ответить с цитированием
Старый 26.01.2012, 10:21   #2
Ezhuk
Форумчанин
 
Регистрация: 09.10.2010
Сообщений: 217
По умолчанию

Код:
struct E{
  int entry;
  int a;
  E* nextE;
};
struct P{
  int port;
  E * ENTRY;
  P * nextP;
};
Использовать такие структуры и получить список портов, каждый элемент которого хранит адрес первого элемента списка ENTRY, элементы которого хранят необходимое значение. Дальше работать как со списками. При добавлении: если нет порта, добавлять новый элемент в список...

PORT23------PORT54
|____________|
ENTRY1_____ENTRY3
A=2________A=5
|___________
ENTRY2
A=4
|
ENTRY3
A=2
Ёж птица гордая, пока не пнешь не полетит.
Ezhuk вне форума Ответить с цитированием
Старый 26.01.2012, 12:37   #3
Unmanner
Пользователь
 
Регистрация: 18.03.2011
Сообщений: 47
По умолчанию

Да, конечно же так можно. Но мне нужно имеено поддержать предложенное решение, внося как можно меньше своих изменений, так что вариант со списками сразу отпадает..

Так же не подходит решение с realloc.

Нужно именно воспользоваться хитрым typedef и залоцировать память только для трёх позиций.
Unmanner вне форума Ответить с цитированием
Старый 26.01.2012, 12:40   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Код:
#define PORTS 3
Не?
_Bers вне форума Ответить с цитированием
Старый 26.01.2012, 13:29   #5
Unmanner
Пользователь
 
Регистрация: 18.03.2011
Сообщений: 47
По умолчанию

нет, индексация должна быть сохранена.
Unmanner вне форума Ответить с цитированием
Старый 26.01.2012, 14:27   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Unmanner Посмотреть сообщение
нет, индексация должна быть сохранена.
Если тебе нужно только 3 элемента, то и выделять память нужно только под 3 элемента. Иначе, ты никак не сможешь сэкономить память.

Другое дело, что ты можешь подтасовать сами индексы локаций:


Код:
location[  Convert_ID(123)  ][ENTRY].a = 4;
location[  Convert_ID(56)   ][ENTRY].a = 5;
location[  Convert_ID(32)   ][ENTRY].a = 5;
По факту, количество существующих элементов только 3.
А вот индексы для обращения к элементам пропускаются через специальные функции-конверторы, логику которых можно запилить как угодно.

Результат работы этих конверторов - числа от 0 до 2.
_Bers вне форума Ответить с цитированием
Старый 26.01.2012, 14:40   #7
Unmanner
Пользователь
 
Регистрация: 18.03.2011
Сообщений: 47
По умолчанию

Маппинг не приветствуется, это тоже было оговорено. нужно именно выделить память. чтобы пулл был один, а указателя на него три...
Unmanner вне форума Ответить с цитированием
Старый 26.01.2012, 16:39   #8
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Unmanner


Есть у нас такой интересный указатель:
STRUCT_T (*location)[MAX_NUMBER_OF_ENTRIES];


...

Было предложено такое решение:
Объявить указатель следующим образом:

STRUCT_S_T *location;


надеюсь, ты понимаешь, что в первом случае мы имеем дело с указателем на массив элементов, во втором - с указателем на элемент. Из этого выплывают твои проблемы с индексацией.

Отсюда вывод: если работаем на C++, то завернуть все это дело в класс с перегруженным оператором []. использовать "разреженный массив".
если работаем на Си, то расслабиться и ничего не делать - с учетом озвученных ограничений задача неразрешима.
Rififi вне форума Ответить с цитированием
Старый 26.01.2012, 19:10   #9
Unmanner
Пользователь
 
Регистрация: 18.03.2011
Сообщений: 47
По умолчанию

вообще у этих элементов разные типы. юзать си++ нельзя, так как это рабочий момент. если не разрешима то меня уволят...
Unmanner вне форума Ответить с цитированием
Старый 26.01.2012, 19:28   #10
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Unmanner

вообще у этих элементов разные типы.

я кагбэ в курсе что это разные типы.

location[123][ENTRY].a = 4;
Нужно именно воспользоваться хитрым typedef

налицо путаница с тем, как работает адресная арифметика

Теперь представьте что нам из PORTS нужны только 3 штуки,

какие номера этих ports? или они тоже все время разные?

зачем экономить память? почему нельзя применить все техники, описанные выше? случай начальника-самодура что-ли? тогда лучше увольняйся сам, чё толку делать в этой шаражке.
Rififi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как не затратить память pray_driver HTML и CSS 4 14.06.2011 21:34
Как улучшить память?:-) Kudryavtsev Свободное общение 38 09.05.2011 20:27
Как выделить память 750mb? VintProg Общие вопросы Delphi 10 29.06.2009 20:30
Как чистить оперативную память??? Altera Операционные системы общие вопросы 10 16.05.2008 14:52