Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 13.07.2010
Сообщений: 5

Как сэкономить память?

25.01.2012, 17:18. Показов 1554. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C
1
2
#define PORTS 260
#define MAX_NUMBER_OF_ENTRIES 255
Есть у нас такой интересный указатель:
C
1
STRUCT_T (*location)[MAX_NUMBER_OF_ENTRIES];
Под него выделалясь память:
C
1
2
3
4
5
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 неизменной?


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

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

C
1
2
3
STRUCT_S_T *location;
 
typedef STRUCT_T *STRUCT_S_T[MAX_NUMBER_OF_ENTRIES];
Всё, далее у меня начались затруднения с реализацией, а главное из них, "Как выделить память под location? Исходя из того что PORTS = 3"

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

C
1
2
3
location[123][ENTRY].a = 4;
location[56][ENTRY].a = 5;
location[32][ENTRY].a = 5;
-------
Заранее спасибо за помощь!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.01.2012, 17:18
Ответы с готовыми решениями:

Как сэкономить оперативную память (многопоточный сервер)
Написал свой класс-обертку, построил на сокетах, Когда сервер принимает подключенного нового клиента Socket handler =...

Можно ли как-либо сэкономить память при динамическом создании объектов?
С QT работаю недавно. Появилась задача в программе динамически создавать QPushButton Создаю следующим образом: ... QPushButton *pb =...

Как сэкономить время?
Грустная история стандартного человека: Утро. Встать. Не то что бы лежать покуда охота. Далее выход в люди: Причесаться, смыть с себя...

9
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
25.01.2012, 17:54
Сэкономить можно динамически выделяя память
C
1
STRUCT_S_T * list = (STRUCT_S_T *)malloc(sizeof(STRUCT_S_T));
далее в программе изменям размер массива list под n элементов способом ниже
C
1
list = (STRUCT_S_T *)realloc((void *)list, n*sizeof(STRUCT_S_T));
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
25.01.2012, 18:51
Динамические контейнеры вроде списка подойдут. См. STL std::list.
0
0 / 0 / 0
Регистрация: 13.07.2010
Сообщений: 5
25.01.2012, 23:36  [ТС]
К сожалению оба варианта неподходят. Первый потому что нужно залоцировать память сразу. Второй потому что язык СИ ....

Нужно как-то хитро через тайпдеф)
0
26.01.2012, 11:57

Не по теме:

Unmanner, выложи код, потому что не видя что к чему просто мозг сломать можно...

0
0 / 0 / 0
Регистрация: 13.07.2010
Сообщений: 5
26.01.2012, 23:24  [ТС]
К сожалению не могу, это по работе, но пример точ в точ описывает проблему.
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
27.01.2012, 09:16
C++
1
2
3
4
5
6
7
8
9
10
11
STRUCT_T **location=new STRUCT_T*[PORTS];
setmem(location,PORTS*sizeof(*STRUCT_T),0);
for (int i=0;i<PORTS;i++)
{
 location[i]=new STRUCT_T[N];
 setmem(location[i],N*sizeof(STRUCT_T),0);
}
// код который юзает location
for (int i=0;i<PORTS;i++)
 delete location[i];
delete []location;
а вот вариант на pure С
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdlib.h>
#include <mem.h>
#define PORTS 3
#define N 10
 
typedef struct STRUCT_T
{
 int port;
} STRUCT_T, *PSTRUCT_T;
 
int main()
{
 int i;
 STRUCT_T **location=(PSTRUCT_T*)malloc(PORTS*sizeof(PSTRUCT_T));
 setmem(location,PORTS*sizeof(PSTRUCT_T),0);
 for (i=0;i<PORTS;i++)
 {
  location[i]=(STRUCT_T*)malloc(N*sizeof(STRUCT_T));
  setmem(location[i],N*sizeof(STRUCT_T),0);
 }
 location[0][0].port=1;
 location[1][1].port=2;
 location[2][2].port=3;
 for (i=0;i<PORTS;i++)
  free(location[i]);
 free(location);
 return 0;
}
хотя если можно поменять значение константы PORTS....
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
27.01.2012, 09:18
Цитата Сообщение от Unmanner Посмотреть сообщение
Второй потому что язык СИ ....
Не так уж и сложно написать вектор на Си
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
27.01.2012, 12:52
Цитата Сообщение от Unmanner Посмотреть сообщение
К сожалению не могу, это по работе, но пример точ в точ описывает проблему.
- поля в структуре STRUCT_S_T хоть какие, всё что тут пишется без чёткого понимания под что выделяем память - гадание на кофейной гуще.
PS: Если по работе упрости исключив комерческую тайну и выложи код, при полном понимании проблеммы будет исчерпывающее решение...
0
0 / 0 / 0
Регистрация: 13.07.2010
Сообщений: 5
28.01.2012, 15:09  [ТС]
Цитата Сообщение от агерон Посмотреть сообщение
хотя если можно поменять значение константы PORTS....
Неа( Ладно, видимо решение так просто не найдётся.. Спасибо всем
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.01.2012, 15:09
Помогаю со студенческими работами здесь

C# или как сэкономить
Вот вопрос по C# если допустим к примеру я обьявляю 2 константы (ну так теоретически!!!) String x1 = &quot;Текст1&quot;; String...

Как сэкономить топливо - бензин?
В этой статье мы предложим полезные и интересные советы рядовому автолюбителю, которые помогут ему сэкономить на расходе горючего. ...

Как сэкономить на мобильном интернете?
Какие есть методики?

i7 4770-4770k Как сэкономить?
Если я не буду разгонять проц и возьму 4770 в место 4770к,сколько я смогу сэкономить на сборке компа????? Просто разница в цене 4770 и...

Конвертация типа или как сэкономить на указателе?
Везде, где только могу, использую ссылающийся тип, чтобы лишний раз не создавать экземпляры, а просто давать &quot;новое имя&quot;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru