Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
paskal
444 / 293 / 26
Регистрация: 15.08.2011
Сообщений: 875
#1

Как сделать массив в памяти по фиксированному адресу? - C++

03.07.2013, 21:40. Просмотров 892. Ответов 11
Метки нет (Все метки)

Есть микропроцессор, и в нем по жестко зафиксированному адресу находится массив ячеек. Допустим типа int. Как в Си мне организовать к нему доступ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2013, 21:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как сделать массив в памяти по фиксированному адресу? (C++):

Данные по адресу памяти - C++
У меня есть адрес например 0x11E9B62C как узнать что по нему записанно?

Доступ к памяти по адресу - C++
Есть структура, элементы которой адрес на начало массива в памяти и его размер. Адреса хранятся в 16-ричном формате. Мне нужно распечатать...

Прочитать из памяти по адресу - C++
Задача: в памяти по адресу 0040:0010h (0x00400010) записано слово (информация о подключенном оборудовании). Нужно прочитать 12-й бит этого...

Доступ к произвольному адресу памяти - C++
Есть известный адрес в памяти с известным значением int Хотел бы проверить это значение после того как введу адрес памяти вручную. ...

Выделение памяти по известному адресу - C++
Всем привет. Вопрос сообственно в заголовке темы. Как выделить память по нужному мне адресу, например: Я хочу выделить память n*...

Взятие обьекта по адресу в памяти - C++
Допустим, я знаю что по адресу 0x13242341 находится произвольный обьект. Как возвратить указатель типа void на данный адрес Типо так?...

11
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
03.07.2013, 21:52 #2
C++
1
2
3
4
int * p_array = (int *)0xabcd;
array[0] = 123;
int a = array[1];
...
1
paskal
444 / 293 / 26
Регистрация: 15.08.2011
Сообщений: 875
03.07.2013, 22:30  [ТС] #3
Хорошо. А array надо заменить на p_array, я правильно понял?
Но тут я вижу надо заводить дополнительную переменную типа указатель. А без этой переменной нельзя? В микроконтроллере памяти не так много чтоб впустую заводить дополнительную переменную
Как так делать с простым типом int я уже разобрался сам: *(int*)0xabcd=123; Как бы похожую конструкцию применит к типу массив?
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
03.07.2013, 22:37 #4
Цитата Сообщение от paskal Посмотреть сообщение
Как бы похожую конструкцию применит к типу массив?
Не совсем понял что тебе нужно..., ты не об этом?
C++
1
2
((int *)0xabcd)[0] = 123;
((int *)0xabcd)[1] = 456;
0
paskal
444 / 293 / 26
Регистрация: 15.08.2011
Сообщений: 875
03.07.2013, 22:50  [ТС] #5
Цитата Сообщение от lazybiz Посмотреть сообщение
Не совсем понял что тебе нужно..., ты не об этом?
C++
1
2
((int *)0xabcd)[0] = 123;
((int *)0xabcd)[1] = 456;
Да, об этом. Но такую конструкцию нельзя применить, подставлять тип массив там где должен стоять int компилятор не позволит.
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
03.07.2013, 23:00 #6
Цитата Сообщение от paskal Посмотреть сообщение
подставлять тип массив там где должен стоять int компилятор не позволит.
Все прекрасно компилируется, если ты об этом. Такая конструкция вполне позволительна.
0
paskal
444 / 293 / 26
Регистрация: 15.08.2011
Сообщений: 875
03.07.2013, 23:19  [ТС] #7
У меня компилятор на это дает ошибку. А без спецификатора массива - все ок.
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
03.07.2013, 23:29 #8
Все было бы намного проще, если бы ты еще в 5-м сообщении сказал что за ошибка и какой у тебя компилятор.
0
paskal
444 / 293 / 26
Регистрация: 15.08.2011
Сообщений: 875
03.07.2013, 23:53  [ТС] #9
Компилятор keil microvision для ARM.
Сообщение об ошибке - expression must have pointer to object type
Но я уверен что и другие компиляторы это делать не дадут, си все же стандартизован.
И потом, как так можно: просто подставить к целому типу скобки массива? Си все же язык со строгой типизацией.
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
04.07.2013, 00:06 #10
Цитата Сообщение от paskal Посмотреть сообщение
как так можно: просто подставить к целому типу скобки массива?
Где ты увидел что я просто подставил к целому типу скобки массива?
C++
1
((int *)0x1234)[0] = 123;
(int *)0x1234 - преобразуем значение 0x1234 в указатель int *.
(ptr)[0] - адресуем указатель как массив.
Еще раз: любой стандарт языка Си это позволяет!
Если у тебя такое не прокатывает, значит проблема в твоем keil microvision.
Покажи как ты это делаешь.
1
paskal
444 / 293 / 26
Регистрация: 15.08.2011
Сообщений: 875
04.07.2013, 06:56  [ТС] #11
А и правда работает, это я накосячил.
0
-=ЮрА=-
Заблокирован
Автор FAQ
04.07.2013, 12:49 #12
paskal, используй VirtualAllocEx
Reserves or commits a region of memory within the virtual address space of a specified process. The function initializes the memory it allocates to zero, unless MEM_RESET is used.
C++
1
2
3
4
5
6
7
LPVOID WINAPI VirtualAllocEx(
  _In_      HANDLE hProcess,
  _In_opt_  LPVOID lpAddress,
  _In_      SIZE_T dwSize,
  _In_      DWORD flAllocationType,
  _In_      DWORD flProtect
);
lpAddress [in, optional]
The pointer that specifies a desired starting address for the region of pages that you want to allocate.
If you are reserving memory, the function rounds this address down to the nearest multiple of the allocation granularity.
If you are committing memory that is already reserved, the function rounds this address down to the nearest page boundary. To determine the size of a page and the allocation granularity on the host computer, use the GetSystemInfo function.
If lpAddress is NULL, the function determines where to allocate the region.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2013, 12:49
Привет! Вот еще темы с ответами:

Динамический массив. Как лучше обращатся к элементу: по адресу или по значению? - C++
Собственно, как лучше. Так: int i, j, len; char *text = new char; cout << "Input the text: "; cin.getline...

Почему обращение к недоступному адресу в памяти - C++
Почему при проверке кода(компиляции) выскакивает сообщение :"Недостаточный размер массивов или обращение по недоступному адресу в памяти" ?...

Вызов функции-члена класса по адресу в памяти - C++
Всем хорошего дня :) Допустим, что где-то есть static функция, не принимающая аргументов и ничего не возвращающая. Имея один лишь...

Классы. Объявить массив динамически и сделать указатель на объект в динамической памяти - C++
Я создал классы: ПЕРСОНА, служащий, роботодатель, инженер. Но мне нужно в программе (после int main() 69 строка) объявить массив...


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

Или воспользуйтесь поиском по форуму:
12
Yandex
Объявления
04.07.2013, 12:49
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru