Форум: "Начинающим";
Текущий архив: 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.008 c