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

Вниз

Динамический двумерный массив   Найти похожие ветки 

 
MacX   (2003-10-11 15:11) [0]

Есть массив типа A: array of array of Byte
Как можно передать массив в процедуру? Типа procedure ChangeArray(var A:array of array of Byte)
С одномерным получается, с двумерным и более ошибка... Дайте кто-нибудь, пожалуйста, пример работы процедуры с динамическим многомерным массивом


 
Владислав ©   (2003-10-11 15:15) [1]

Объяви тип. Дальше свои массивы объявляй этого типа.


 
MacX   (2003-10-11 15:52) [2]

Спасибо, вроде работает... Интересно, здесь всё корректно, размер массива там... где об этом почитать можно, не подскажете?


 
Владислав ©   (2003-10-11 15:54) [3]

Хелп, F1, типа. Можешь код привести. Поглядим...


 
MacX   (2003-10-11 16:23) [4]

Да я читал, что при работе с динамическими массивами, внутри тела процедуры нельзя присваивать значение всему массиву, можно обращаться только к его элементам. Все началось с того, что оказывается функция Delete не работает с дин. массивами, в отличие, например, от Copy. Пришлось делать свою функцию:


procedure DeleteElement(var A: array of Byte; Index: Integer);
var
i: Integer;
begin
if Index < 0 then Exit;
if Index < High(A) then
for i := Index to High(A)-1 do
A[i] := A[i+1];
A := Copy(A, 0, Length(A)-1); // - не работает, как я и читал
end;


Однако, когда создал новый тип

procedure DeleteElement(var A: TDynArray; Index: Integer);

последняя строка заработала, что в принципе противоречит, тому о чем я читал... вот я и засомневался...


 
MBo ©   (2003-10-11 16:28) [5]

>(var A: array of Byte
Это был открытый массив, а не динамический


 
MacX   (2003-10-11 16:38) [6]

Ну да, как я понял, это одно и тоже... только открытый передается в процедуру


 
Владислав ©   (2003-10-11 16:42) [7]

Ушли от одног, пришли к другому :)

Вот тебе пример на Delphi. Нужны комментарии спрашивай.

procedure RemoveFromArray(const ArrayPointer: Pointer;
const ArraySize, ElementSize: Integer;
const AIndex, ACount: Integer);
var
RemovePoint: Pointer;
RemovingByteCount: Cardinal;
MovingByteCount: Cardinal;
begin
RemovingByteCount := Cardinal(ACount) * Cardinal(ElementSize);
RemovePoint :=
Pointer(Cardinal(ArrayPointer) + Cardinal(AIndex) * Cardinal(ElementSize));
MovingByteCount := Cardinal(ArraySize - AIndex - 1) * Cardinal(ElementSize);
Move(Pointer(Cardinal(RemovePoint) + RemovingByteCount)^, RemovePoint^,
MovingByteCount);
end;


PS.: Первый комментарий без вопроса. Размер массива нужно ручками менять.


 
MBo ©   (2003-10-11 16:48) [8]

>это одно и тоже
Нет.


 
MacX   (2003-10-11 16:55) [9]

2 Владислав
Это универсальная процедура, через указатели, для любых массивов... в принципе понятно. А что значит "нужно ручками менять"? Это к чему относится?

2 All
Пока я понял что вроде
var A: TDynArray - передача динамического массива
var A: array of Byte - передача открытого массива
var A: array of array of Byte - такого вообще не может быть
Правильно?


 
MacX   (2003-10-11 16:57) [10]

...И в открытом массиве нельзя изменять количество элементов, а в динамическом можно... Вот я про это и прошу где можно почитать, чтобы уже самому разобраться


 
Владислав ©   (2003-10-11 17:21) [11]

> MacX (11.10.03 16:55) [9]

Это к тому: DeleteElement. На счет ручками, процедура не изменяет количество елементов в массиве. Просто сдвигает данные. После нее надо SetLength вызывать (ну не обязательно конечно).

> MacX (11.10.03 16:57) [10]

RTFM... Типа, читай хелп, либо популярные книги.


 
MacX   (2003-10-12 12:34) [12]

OK, всем спасибо, однако, если у кого появится хорошая ссылочка, буду рад



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

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

Наверх




Память: 0.49 MB
Время: 0.015 c
14-74440
VID
2003-10-04 13:02
2003.10.23
Ищу бесплатный работающий прокси-сервер


4-74538
Programmers88
2003-08-18 14:54
2003.10.23
Как найти окно по одному имени


3-74039
Игоряныч
2003-10-03 08:11
2003.10.23
Как закрепить левые столбцы в DBGrid.


3-74046
Slawa_Jh
2003-10-02 16:04
2003.10.23
Поиск данных в очень большой базе FoxPro


6-74343
mma
2003-08-27 08:04
2003.10.23
TWebBrowser -> ServerSocket -> ClientSocket -> HTTPS???