Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

массивы данных [D6, Win95/98]


Игорь_ ©   (2004-09-21 09:38:00) 

Есть массив MyArray = array of array of integer;
подскажите, пожалуйста, как его записать в память с помощью указателя?


Игорь_   (2004-09-21 11:56:00) [1]

Спасибо всем за советы :-)


MBo   (2004-09-21 11:49:00) [2]

>Игорь_   (21.09.04 11:35) [13]
1. N*N можно установить одним вызовом SetLength (см [6] )
2. >array of array of string;
речь сначала шла о числах - со строками работы еще добавится лишней
3. Почитай по ссылке в  [12]


Игорь_   (2004-09-21 11:35:00) [3]

До того как сформировать массив размерности N*N я дошел
A : array of array of string;
I : Integer;
begin
SetLength(A, N);
for I := 0 to High(A) do
 SetLength(A[I], N);
end;
а вот как его записать в память (с помощью @)я так и не понял!


MBo   (2004-09-21 11:16:00) [4]

http://www.delphikingdom.ru/lyceum/seminar.asp?partID=4


Amoeba   (2004-09-21 11:13:00) [5]


> Erik1 ©   (21.09.04 11:04) [5]

Не сбивай молодого человека с панталыку!


Игорь_   (2004-09-21 11:12:00) [6]

Вообще-то я учусь на заочных курсах и у меня есть лабораторка в которой написано:
Шаг 9. Создайте обработчик событий для кнопки «Ввод дан-ных». Последовательность действий должна быть такой:
· записать в память сгенерированный двумерный массив вве-денной размерности N;
Вот я и мучаюсь.


КаПиБаРа   (2004-09-21 11:12:00) [7]

Игорь_   (21.09.04 10:44) [2]
можно тоже самое проделать с массивом и, если можно, то как?


С динамическим массивом лучше так не делать, т.к. при увеличении размера он "переедет" по другому адресу и все указатели полученные таким образом будут не действительны.

IntegerPtr := @MyArray[3,5] - указатель на 5 элемент массива в 3 строке.

=================================
Когда у тебя есть только молоток,
все похоже на гвоздь.
=================================


Amoeba   (2004-09-21 11:10:00) [8]

Это пример из Help:

The following example uses dynamic arrays (and the IntToStr function declared in the SysUtils unit) to create a triangular matrix of strings.

var

 A : array of array of string;
 I, J : Integer;
begin
 SetLength(A, 10);
 for I := Low(A) to High(A) do
 begin
   SetLength(A[I], I);
   for J := Low(A[I]) to High(A[I]) do
     A[I,J] := IntToStr(I) + ',' + IntToStr(J) + ' ';
 end;
end;


MBo   (2004-09-21 11:09:00) [9]

>Erik1 ©   (21.09.04 11:04) [5]
>PMyArray = ^TMyArray;
обычно такой подход не нужен


MBo   (2004-09-21 11:07:00) [10]

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

type
 TA:array of array of Integer;

var a:ta;
begin
SetLength(a,3,3);
теперь a является (неявным) указателем на массив из 3-х указателей на массивы данных, т.е.
a[0] - указывает на первый блок из 3-х чисел и т.д.


Erik1   (2004-09-21 11:04:00) [11]

А что тебя смущает, конечно можно, но ненужно. Потому, что если у тебя есть указатель на масив, то емеет смвсл выделеть ему память, а после незабыть освободить ее. Пример:
Type
 TMyArray = array of array of integer;
 PMyArray = ^TMyArray;
...
Var
 MyArray: PMyArray;
Begin
 New(MyArray);
 SetLength(MyArray^, 1);
 MyArray[0,0] := 1;
end;
И гдето
 SetLength(MyArray^, 0);
 Dispose(MyArray);
Хотя непонятно зачем тебе динамически создовать масив. Так с ним неработают.


Игорь_   (2004-09-21 10:57:00) [12]

Ну наверное заглядывал.
С.Бобровский Delphi7 нашел там про это только загадочную фразу, что одной командой это сделать нельзя.
Никита Культин Delphi6 -Вообще ничего не нашел относительно этого.
В Help тоже найти не могу ИБО изучаю Delphi6 только второй месяц.


Amoeba   (2004-09-21 10:47:00) [13]

А в Help или в книжку заглянуть религия не позволяет? Там даже примеры есть.


Игорь_   (2004-09-21 10:44:00) [14]

Имелось в виду несколько другое:
var BytePtr:^ byte;
чтобы присвоить ей адрес конкретного места памяти используется операция @.
var BytePtr:^ byte;
   ByteVal: byte;
   begin
   ByteVal := 255;
   BytePtr :=@ByteVal
можно тоже самое проделать с массивом и, если можно, то как?


ЮЮ   (2004-09-21 09:46:00) [15]

type
  TMyArray= array of array of integer;

var
 arr: TMyArray;

arr - это и есть указатель и находится, как не странно, в "памяти" :-)


Наверх

Титульная страница Поиск, карта сайта Написать письмо