Главная страница
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.021 c
1-74188
Vlad
2003-10-10 12:17
2003.10.23
Помогите решить проблему....


1-74210
CaNaBiS
2003-10-09 18:33
2003.10.23
Ребят делаю чат в локалке.Какой компонент использовать чтоб...


6-74367
Dimon
2003-08-28 06:00
2003.10.23
Статистика использования шар на локальном компьютере


3-73977
Alexadre
2003-10-05 23:31
2003.10.23
DBGrid-после удаления записи


14-74410
Е-Моё имя
2003-10-06 00:17
2003.10.23
сцылка