Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.011 c
1-74189
dimm
2003-10-13 17:37
2003.10.23
Как перехватить событие копирования в буфер обмена и вставка


6-74345
Dr.Karter
2003-08-26 13:42
2003.10.23
Как Отслеживать пакет


1-74288
Kiril
2003-10-13 00:06
2003.10.23
Не добавляет в TList объект.


3-73988
dzh2000
2003-10-04 16:36
2003.10.23
Bug с отрицательными числами в Firebird 1.5


14-74401
Murad
2003-10-03 10:48
2003.10.23
Женские





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский