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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2016, 02:54   #1
Glebson
 
Регистрация: 22.12.2016
Сообщений: 8
По умолчанию создание НЕСКОЛЬКИХ динамических массивов

Здравствуйте.

Объявляю два динамических массива. Количество элементов заранее неизвестно
Код:
int * pA[];
int * pB[];
далее создаю и инициализирую

Код:
void __fastcall TSDIAppForm::FormCreate(TObject *Sender)
{
	for(int i=0; i<3; i++)
	{
		pA[i] = new int;
		(* pA[i]) = i;
	}
	for(int j=0; j<4; j++)
	{
		pB[j] = new int;
		(* pB[j]) = j+10;
	}
но адреса массива pB[] совпадают с адресами pA[]

понимаю что компилятору трудно предугадать сколько всего будет элементов массива, поэтому он и пихает всё в кучу, но может есть способ сказать :
“вот это массив pA из N элементов, он закончился . следующий массив создавай по новым адресам ”
Glebson вне форума Ответить с цитированием
Старый 22.12.2016, 08:03   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
понимаю что компилятору трудно предугадать сколько всего будет элементов массива, поэтому он и пихает всё в кучу
Нет, он делает то, что вы написали

Цитата:
но может есть способ сказать
Да, сделать правильно и выделить память сначала для А, а потом В, а не писать в неинициализированную и не выделенную память. Вам повезло, что с сегментфолт еще не падает.
p51x вне форума Ответить с цитированием
Старый 22.12.2016, 19:53   #3
Glebson
 
Регистрация: 22.12.2016
Сообщений: 8
По умолчанию

Цитата:
Да, сделать правильно
трудно с этим не согласиться. Вопрос только - как?
Пробую кодить в RAD c++ builder.
В h. файле объявляю два динамических массива. Размер которых будет известен только во время исполнения программы.
в cpp. файле выделяю память. Разве не так?

Можно пример кода как правильно?
Glebson вне форума Ответить с цитированием
Старый 22.12.2016, 19:56   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
в cpp. файле выделяю память. Разве не так?
Так, но вы же не выделяете.. Где
Код:
pA = new int*[3];
?
p51x вне форума Ответить с цитированием
Старый 25.12.2016, 07:32   #5
Glebson
 
Регистрация: 22.12.2016
Сообщений: 8
Радость

Бился несколько дней. Ерунда, какая то.
В итоге всё оказалось просто.
Отчитываюсь. Возможно, кому-то это пригодится.

В .hpp -файле объявления:
Код:
….
private:
	int i;  // переменная вычисляется где то в программе
	
        //  int * pA[]; // обьявленние массивов указателей
        //  int * pB[]; // приводит к тому, что адреса
		           // этих массивов совпадают
		           // так же эти адреса далее перебьются 
		           // массивом  TEdit *pEdit[];
        int * pA; 		//  указатели на массивы pA,  pB,  pS
	int * pB; 		// объявляются как указатели 
	AnsiString *pS;  	// на одинарные переменные

	//TEdit *pEdit; // ошибка 
	TEdit *pEdit[];	// указатели на массивы VCL–элементов
				// должны объявляться именно как 
				// указатели на массивы
…
В cpp–файле
Код:
…
void __fastcall TSDIAppForm::FormCreate(TObject *Sender)
{
	i=4;

	pA = new int[i];		// создаём массивы переменных
	pB = new int[i];		// затем присваиваем их указателям
	pS = new AnsiString[i];	//
	
        pA[1]=6;	// с указателями можно работать как 
	pB[1] =9;	// обычными массивами

	pS [0] = "one";
	pS[1]= "two";
	pS[2]= "three";
	pS[3]= "four";
	

	//pEdit =new TEdit(this)[4];// ошибка [bcc32 Error]
                                              // SDIMAIN.CPP(62):
					      // E2034 Cannot convert 'TEdit' to 'TEdit *'
					      // Full parser context SDIMAIN.CPP(49): 
                                              // parsing: void _fastcall   TSDIAppForm::FormCreate(TObject *)
for(i=0; i<4; i++)
	{
		pS[i] =i;
		if(pEdit[i] == NULL)
		{
			pEdit[i] = new  TEdit(this);
		}
		pEdit[i] ->Parent = SDIAppForm;
		pEdit[i] ->Top =80+40*i;
		pEdit[i] ->Left=20;
		pEdit[i] ->Text = pS[i];
	}	
}
….

Последний раз редактировалось Glebson; 25.12.2016 в 07:55.
Glebson вне форума Ответить с цитированием
Старый 25.12.2016, 10:47   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Вы так и не поняли почему они "перебиваются"... и бились зря, я уже давно написал как надо.
p51x вне форума Ответить с цитированием
Старый 25.12.2016, 11:29   #7
Glebson
 
Регистрация: 22.12.2016
Сообщений: 8
По умолчанию

Да уж.

По инерции я думал что надо в .hpp- файле объявлять указатель на массив
int * pA[];
как при создании vcl-элементов
// например TEdit *pEdit[];

и если в .cpp- файле использовать конструкцию
pA = new int*[3];

компилятор выдавал ошибку
E2277 Lvalue required - требуется значение в левой части.

Если честно... Я до сих пор не догоняю разницу. Начинаю подозревать что
TEdit *Edit;
создаёт указатель, а не объект Редактор. :-)
Glebson вне форума Ответить с цитированием
Старый 25.12.2016, 12:02   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Начинаю подозревать что
TEdit *Edit;
создаёт указатель, а не объект Редактор. :-)
Оно ничего не создает, а объявляет переменную типа указатель (видите * ?) на TEdit
p51x вне форума Ответить с цитированием
Старый 25.12.2016, 13:22   #9
Glebson
 
Регистрация: 22.12.2016
Сообщений: 8
По умолчанию

теперь то понятно.

Зы.
не судите меня строго. По профессии я - электрик. А это так - хобби.

Вот появилась идея - сделать тренажёр английского языка.
Суть: Есть аудио- файл. и текстовый.
пока дослушаешь до конца.- забудешь начало.
Задача - разбить текст на массив предложений.
сопоставить ему массив кусков аудио-, а так же массив полей ввода
типа TEdit - куда пытаться вводить прослушанный текст.
Glebson вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выполнить обработку массивов. предусмотреть описание массивов как динамических Vika_0_0 Паскаль, Turbo Pascal, PascalABC.NET 8 03.06.2012 10:12
Организация динамических массивов. MaSTeD C# (си шарп) 0 29.02.2012 10:18
удаление динамических массивов Dimarik Общие вопросы C/C++ 20 14.03.2011 12:30
сортировка динамических массивов в Си тина сорока Помощь студентам 2 26.02.2010 00:39
обработка динамических массивов funky Помощь студентам 0 11.05.2009 17:53