Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.03;
Скачать: CL | DM;

Вниз

Как создать и работать с двухмерным динамическим масивом?   Найти похожие ветки 

 
maxon   (2008-07-01 23:16) [0]

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

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

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


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

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


 
Loginov Dmitry ©   (2008-07-01 23:26) [1]

var
 MyDynArray: array of array of TCellRec;

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


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


> запутался


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


 
{RASkov} ©   (2008-07-01 23:29) [3]

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

Точно так же как и с одномерным или 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);
....


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

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

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;


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

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


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

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


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


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

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


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

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

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


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

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


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


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

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

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

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;


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

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

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;


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

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


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


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

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


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

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


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

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

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


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

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

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

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:23) [16]

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

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


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


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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2008.08.03;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.021 c
15-1213879771
User_1
2008-06-19 16:49
2008.08.03
El-Lib


2-1215153307
Максим В.
2008-07-04 10:35
2008.08.03
Pointer + Integer


15-1213765055
Slider007
2008-06-18 08:57
2008.08.03
С днем рождения ! 18 июня 2008 среда


2-1215104995
blazerad
2008-07-03 21:09
2008.08.03
ShowMessage


6-1191474026
Rav
2007-10-04 09:00
2008.08.03
Какой компонент использовать для обмена данными в D7?