Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.08.03;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.01 c
15-1213368104
Виталий_2
2008-06-13 18:41
2008.08.03
MAC-адрес


2-1214976925
lewka-serdceed
2008-07-02 09:35
2008.08.03
ключ в реестре


3-1203655549
Ganda
2008-02-22 07:45
2008.08.03
Туплю


2-1215070574
megavolt
2008-07-03 11:36
2008.08.03
Parsing Squid access.log


4-1193835165
alexnmsk
2007-10-31 15:52
2008.08.03
Отображение формы через ShowWindow





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский