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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2009, 14:16   #1
Tiro
 
Аватар для Tiro
 
Регистрация: 10.06.2009
Сообщений: 6
По умолчанию Вопрос по выделению памяти

Доброго времени суток.

У меня следующий вопрос.
В своей курсовой я пишу драйвер Host Port Interface для TSM320C6x... Впрочем не важно
Суть в том, что мне нужно выделить память для буффера обмена, причем эту память нужно выделить по определенному адрессу... И я не знаю, как это сделать...
Писать и читать я-то могу и так... Но как сделать так, чтоб эта память была зарезервированной?
Есть вариант прописать все в Linker Command File... Но мне кажется, что должен быть и механизм выделения памяти по заданному адрессу...

Буду рад любому совету.
Заранее спасибо.

Последний раз редактировалось Tiro; 10.06.2009 в 15:23.
Tiro вне форума Ответить с цитированием
Старый 12.06.2009, 04:23   #2
Tiro
 
Аватар для Tiro
 
Регистрация: 10.06.2009
Сообщений: 6
По умолчанию

Мне тут знакомый показал синтаксис оператора new, которого я еще не видел... Написал пару тестовых программок... Впринципе синтаксически все корректно...

Код:
#include <iostream>
using namespace std;
int main(void)
{
	int i;
	int array1[10];//объявляем массив
	void* pointer1=array1; //объявляем указатель на него
	cout<<"pointer1 "<<pointer1<<endl; //cмотрим адрес
	int* pointer2=new(pointer1) int[10]; //выделяем второй массив оператором new но с аргументом
	cout<<"pointer2 "<<pointer2<<endl; //смотим второй адресс.  адреса одинаковы
	for(i=0;i<10;i++)
	   *(pointer2+i)=10*i; //пишем что-нибудь в массив
	for(i=0;i<10;i++)
	   cout<<*(pointer2+i)<<' ';//читаем - работает
}
Все получилось:
Цитата:
pointer1 0xbffff8fc
pointer2 0xbffff8fc
0 10 20 30 40 50 60 70 80 90
Потом попробовал такое:
Код:
...
int* pointer3=new((void*)0x8fa0d760) int[10];//выделил массив по произвольному адрессу
cout<<pointer3<<endl;
Тоже сработало...
Но ни читать, ни писать по этому адресу не получилось. Скомпилировалось-то без ошибок. Запустило, и уже в консоли выдало ошибку:
Цитата:
Program received signal: “EXC_BAD_ACCESS”.
Думаю, это вполне ожидаемо. Я попытался залезть по тому адрессу куда не положено

Думаю что DSP мне ошибку не выдаст, но в лучшем случае не будет корректно работать или вообще не будет... Протестить к сожалению пока не могу... Но может истина где-то рядом? или может нужно еще что-то добавить? Подскажите плизз...
Tiro вне форума Ответить с цитированием
Старый 12.06.2009, 08:18   #3
vasek123
Заблокирован
 
Регистрация: 21.11.2008
Сообщений: 4,986
Сообщение

Добавь оператор delete на указатель:

Код:
delete pointer1;
pointer1=NULL;
ну и на pointer3

Неудивительно что у тебя ничего не получилось, некоторые компиляторы не видят подобные ошибки...

Последний раз редактировалось vasek123; 12.06.2009 в 08:25.
vasek123 вне форума Ответить с цитированием
Старый 13.06.2009, 15:16   #4
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Ваш пример корректен. Но, как сказал товарищ vasek123, требуется добавить delete [] pointer1;
Теперь насчет этого:
Цитата:
Сообщение от Tiro Посмотреть сообщение
Код:
...
int* pointer3=new((void*)0x8fa0d760) int[10];//выделил массив по произвольному адрессу
cout<<pointer3<<endl;
Тоже сработало...
Но ни читать, ни писать по этому адресу не получилось. Скомпилировалось-то без ошибок. Запустило, и уже в консоли выдало ошибку:
Выделение памяти под массив:
int *ptr = new int[array_size]
New работает примерно так:
1. kol = sizeof(int)*array_size;
2. Ищет в памяти свободные, подряд идущие, адреса количеством kol штук.
3. Резервирует их для Вас, и возвращает первый адрес.
Вы же пытаетесь заставить new выделить память по заданному адресу. Причем не факт что эти адреса будут свободны.
Насколько я знаю, C++ вообще не предоставляет такой возможности (поправьте если не так).
Зато подобное действие под силу Ассемблеру.
К сожалению, изменение чужих данных может привести к непредвиденным последствиям. Скорее всего, при неправильном изменении памяти, винда вылетит с синим экраном(((
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 13.06.2009, 15:40   #5
Tiro
 
Аватар для Tiro
 
Регистрация: 10.06.2009
Сообщений: 6
По умолчанию

Я ж не под винду программирую, а драйвер для системы микроконтроллеов
И там несколько другие условия... Система статическая: то есть в момент компиляции известно, сколько задач будет выполняться, память выделяется 1 раз при старте/ресете...
Tiro вне форума Ответить с цитированием
Старый 13.06.2009, 16:46   #6
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Тогда прошу прощения (никогда не писал под микроконтроллеры). Но все равно: не думаю что new чем-то вам поможет.
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с выделением динамической памяти malloc (recalloc) slips Общие вопросы C/C++ 6 29.04.2009 19:27
Вопрос по структурам и динамической памяти. ROD Общие вопросы C/C++ 4 12.04.2009 18:20
поиск с выделением photozaz Компоненты Delphi 1 22.05.2008 15:46
ВОПРОС на счет блоков памяти и отслеживание за перемещением потока. Big Zee Свободное общение 7 21.04.2008 14:38