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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.07.2015, 12:22   #1
Bayern_M
Форумчанин
 
Регистрация: 18.03.2015
Сообщений: 114
По умолчанию Си. Общая память

Здравствуйте!
Расшарил сегмент памяти для межпроцессного взаимодействия. Подключаю этот сегмент в другой программе, получаю указатель на начало области общей памяти *shared_memory.

Подскажите, пожалуйста, каким образом, имея указатель, я могу посмотреть на эту область как на массив short int?
Понимаю, что вопрос глупый, но я никак не могу сообразить как мне присвоить первому элементу массива адрес *shared_memory
Bayern_M вне форума Ответить с цитированием
Старый 01.07.2015, 12:32   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
(short int*)ptr
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.07.2015, 12:41   #3
Bayern_M
Форумчанин
 
Регистрация: 18.03.2015
Сообщений: 114
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Код:
(short int*)ptr
Спасибо за помощь! Но я немного не понял, видно вопрос написал криво

Код:
int             segment_id;
char          *shared_memory;
short int     regs[0x281];

segment_id=(ftok(_FILE, '7'), sizeof(union _regs_), 0);
shared_memory = (char *)shmat(segment_id, 0, 0);
Ситуация такая. Как подвязать к первому элементу массива regs указатель *shared_memory. Чтобы я потом мог обращаться к нужному элементу массива и вытаскивать данные из общей памяти

ПС. понял, что вы имели в виду, но мне к сожалению недостаточно просто посмотреть на память как на short int. Нужно двигаться свободно по массиву, без вычислений смещения конкретного элемента. Все равно спасибо за помощь

Последний раз редактировалось Bayern_M; 01.07.2015 в 12:46.
Bayern_M вне форума Ответить с цитированием
Старый 01.07.2015, 12:45   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

при таком объявлении никак, у вас массив уже лежит где-то.
а надо просто
Код:
short int *regs=(short int*)shared_memory;
но тогда нельзя sizeof на него делать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.07.2015, 12:51   #5
Bayern_M
Форумчанин
 
Регистрация: 18.03.2015
Сообщений: 114
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
при таком объявлении никак, у вас массив уже лежит где-то.
а надо просто
Код:
short int *regs=(short int*)shared_memory;
но тогда нельзя sizeof на него делать.
Спасибо! Но массив имеет конечный размер. И мне нужно обращаться постоянно к элементу 0х102, например.
Bayern_M вне форума Ответить с цитированием
Старый 01.07.2015, 14:24   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

regs[123] = 321;
waleri вне форума Ответить с цитированием
Старый 01.07.2015, 14:46   #7
Bayern_M
Форумчанин
 
Регистрация: 18.03.2015
Сообщений: 114
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
regs[123] = 321;
правильно я понимаю, что вот кусок рабочий?

Код:
int 			segment_id;
char			*shared_memory;
short int		*regs;
float                   val;

segment_id=shmget(ftok(_FILE, '7'), sizeof(union _regs_), 0);
shared_memory = (char *)shmat(segment_id, 0, 0);

regs = (short int*)shared_memory;

val=*((float *)(regs[0x102]));

Последний раз редактировалось Bayern_M; 01.07.2015 в 15:25.
Bayern_M вне форума Ответить с цитированием
Старый 01.07.2015, 17:47   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Так я не понял, вам int или float?
Не проще будет:
Код:
float* regs = (float*) shared_memory;
val = regs[123];
waleri вне форума Ответить с цитированием
Старый 02.07.2015, 09:15   #9
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Вы не забывайте ту структуру которую вы туда запихнули вы и считываете. Просто вам нужно в первые два или четыре байта записать длину массива, в зависимости от длины массива, который будет у вас задействован.
И потом приводите к нужному типу ваш массив и все.
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Общая память у переменных! moon-guest Общие вопросы Delphi 3 24.07.2013 12:18
общая папка CraZZy RabbIt Общие вопросы Delphi 15 18.02.2012 12:57
Общая переменная Артэс Общие вопросы C/C++ 4 18.06.2009 16:24
Общая БАЗА OgE®_M@G Microsoft Office Access 4 07.01.2009 22:05
Общая переменная А.Брей Помощь студентам 2 20.05.2007 18:13