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

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

Как создать и работать с двухмерным динамическим масивом? [D7, XP]


maxon ©   (2008-07-01 23:16:00) 

Знаю, что много чего по ним написано, но этого явно маловато.
С одномерными динамическими масcивами я работать умею (вроде бы), а вот с двухмерными да еще и тип запись...

Т.е. у меня есть запись вида:

TCellRec = record
 sValue: string;
 bCorrect: boolean;
end;


Массив должен быть примерно таким:
MyDynArray: array [1..X,1..Y] of TCellRec;
где X и Y - динамические значения.

Пытался сам разобраться, но еще больше запутался. Может, кто нибудь доходчиво объяснить как с двухмерным динамическим массивом работать?


maxon   (2008-07-02 00:35:00) [1]

Да, все, разобрался! Всем спасибо за помощь!


Сергей М.   (2008-07-02 00:28:00) [2]


> maxon   (02.07.08 00:17) [15]
> Я же говорил, что с этими массивами не все так просто!Вот
> зацените


А тут собссно и "заценивать" нечего - динамическими массивами тут даже и не пахнет.

Ответ тебе был дан уже в [1] - проще уж некуда.


Поросенок Винни-Пух   (2008-07-02 00:23:00) [3]

поддерживаемый компилятором тип "массив" и гетмем. в цикле. ага.

а не судьба хотябы красиво извращаться, если уж так хочется извращаться?


maxon   (2008-07-02 00:17:00) [4]

Я же говорил, что с этими массивами не все так просто!

Вот зацените:

type
 TCellRec = record
   sValue:   string;
   bCorrect: boolean;
 end;

 IType = Word;

const
 MAXCOLARRAY = ( High( IType ) - $F ) div SizeOf( TCellRec );

type
 PCol = ^TCol;
 TCol = array [1..MAXCOLARRAY] of TCellRec;

 PCellsArray = ^TCellsArray;
 TCellsArray = array[1..High( IType )] of PCol;

var
 DynList:      PCellsArray;
 DynListCols:  IType = 0;
 DynListRows:  IType = 0;

implementation

function CreateDynList( iColCount, iRowCount: IType ): boolean;
var
 i:    IType;
begin
 Result:= false;
 
 if ( iColCount > 0 ) and ( iRowCount > 0 ) then
 begin
   GetMem( DynList, iRowCount * High( TCellsArray ) );

   for i:= 1 to iRowCount do
   begin
     GetMem( DynList[i], High( TCol ) );

     PCol( DynList )[i].sValue:=    '';
     PCol( DynList )[i].bCorrect:=  false;
   end;

   DynListCols:= iColCount;
   DynListRows:= iRowCount;
   
   Result:= true;
 end;
end;

procedure FreeDynList;
var
 i: IType;
begin
 for i:= DynListRows downto 1 do
   FreeMem( DynList[i], High( TCellsArray ) );

 FreeMem( DynList, DynListCols * High( TCol ) );
end;


Поросенок Винни-Пух   (2008-07-02 00:02:00) [5]

Не ошибается тот, кто ничего не делает!

Я так понял - это и была демонстрация той самой "простоты работы с масивом"?
:)))


Loginov Dmitry   (2008-07-02 00:01:00) [6]

Это...
А язык Delphi или Turbo Pascal?
Если Delphi, то чем не удовлетворяет языковаяконструкция динамический массив? Тем более это заголовок ветки.


maxon   (2008-07-01 23:59:00) [7]


> Поросенок Винни-Пух ©   (01.07.08 23:55) [11]
>
> ой, мама......

Не ошибается тот, кто ничего не делает!


Поросенок Винни-Пух   (2008-07-01 23:55:00) [8]

ой, мама......


maxon   (2008-07-01 23:53:00) [9]

Вот, исправил:

function CreateDynList( iColCount, iRowCount: IType ): boolean;
var
 i, j:    word;
begin
 Result:= false;
 
 if ( iColCount > 0 ) and ( iRowCount > 0 ) then
 begin
   for j:= 1 to iColCount do
   begin
     GetMem( DynList, High( TCol ) );

     for i:= 1 to iRowCount do
     begin
       GetMem( DynList[i], High( TCellsArray ) );
       PCol( PCellsArray( DynList )[i] )[i].sValue:=   '';
       PCol( PCellsArray( DynList )[i] )[i].bCorrect:= false;
     end;
   end;

   Result:= true;
 end;
end;


maxon   (2008-07-01 23:51:00) [10]


> массивы - любимое детище школьных училок по инфороматике.

Это не значит, что не нужно знать как работать с массивами!

Ладно, вот че вышло:

type
 TCellRec = record
   sValue:   string;
   bCorrect: boolean;
 end;

 IType = Word;

const
 MAXCOLARRAY = ( High( IType ) - $F ) div SizeOf( TCellRec );

type
 PCol = ^TCol;
 TCol = array [1..MAXCOLARRAY] of TCellRec;

 PCellsArray = ^TCellsArray;
 TCellsArray = array[1..High( IType )] of PCol;

var
 DynList:      PCellsArray;
 DynListCols:  IType = 0;
 DynListRows:  IType = 0;

implementation

function CreateDynList( iColCount, iRowCount: IType ): boolean;
var
 i, j:    word;
begin
 Result:= false;
 
 if ( iColCount > 0 ) and ( iRowCount > 0 ) then
 begin
   for j:= 1 to iColCount do
   begin
     GetMem( DynList, iColCount * High( TCol ) );

     for i:= 1 to iRowCount do
     begin
       GetMem( DynList[i], iRowCount * High( TCellRec ) ); // Здесь ошибка - несовместимость типов!
       PCol( PCellsArray( DynList )[i] )[i].sValue:=   '';
       PCol( PCellsArray( DynList )[i] )[i].bCorrect:= false;
     end;
   end;

   Result:= true;
 end;
end;


Поросенок Винни-Пух   (2008-07-01 23:44:00) [11]

Чем удобен-то?


Поросенок Винни-Пух   (2008-07-01 23:40:00) [12]

PCellRec = ^TCellRec;
TCellRec = record
sValue: string;
bCorrect: boolean;
end;

+ TList и все. И не надо никаких массивов ни двумерных ни семимерных.
массивы - любимое детище школьных училок по инфороматике.


maxon   (2008-07-01 23:39:00) [13]


> Поросенок Винни-Пух ©   (01.07.08 23:36) [5]
>
> нафик тебе вообще "двумерный" массив?
> думаешь он в памяти такой же "двумерной табличкой как на
> рисунке"  будет представлен?

Нет, но он в работе будет более удобен!


Поросенок Винни-Пух   (2008-07-01 23:36:00) [14]

нафик тебе вообще "двумерный" массив?
думаешь он в памяти такой же "двумерной табличкой как на рисунке"  будет представлен?


maxon   (2008-07-01 23:34:00) [15]

Ну, вот как я это записал:

type
 TCellRec = record
   sValue:   string;
   bCorrect: boolean;
 end;

const
 MAXCOLARRAY = ( High( Word ) - $F ) div SizeOf( TCellRec );

type
 PCol = ^TCol;
 TCol = array [1..MAXCOLARRAY] of TCellRec;

 PCellsArray = ^TCellsArray;
 TCellsArray = array[1..16000] of PCol;

var
 DynList:      PCellsArray;
 DynListCols:  Word = 0;
 DynListRows:  Word = 0;


Такой код правильный?

Но, как теперь создавать (выделять память под массивы), как получить значение массива?


{RASkov}   (2008-07-01 23:29:00) [16]

> кто нибудь доходчиво объяснить как с двухмерным динамическим
> массивом работать?

Точно так же как и с одномерным или 2х и более мерными динамичными...
TCellRec = record
sValue: string;
bCorrect: boolean;
end;
TCellRecs = array of array of TCellRec;
..............
var ar: TCellRecs; X, Y: Integer;
begin
 X:=10;
 Y:=30;
 SetLength(Ar, X, Y);
 Ar[5,5].sValue:='text';
....

или например так:
var ar: TCellRecs; X, N: Integer;
begin
 X:=10;
 SetLength(Ar, 10);
 for N:= Low(Ar) to High(Ar) do begin
   SetLength(Ar[N], N*10);
   Ar[Low(Ar), High(Ar[N])].bCorrect:=Odd(N);
....


Loginov Dmitry   (2008-07-01 23:26:00) [17]

var
 MyDynArray: array of array of TCellRec;

begin
 SetLength(MyDynArray, X, Y);
 MyDynArray[0, 0].sValue := 'blablabla';
....................


Сергей М.   (2008-07-01 23:26:00) [18]


> запутался


Что непонятно ?


Наверх

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