Форум: "Основная";
Текущий архив: 2003.10.23;
Скачать: [xml.tar.bz2];
ВнизДинамический двумерный массив Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c