Главная страница
    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.01 c
14-74409
MooSE
2003-10-06 09:53
2003.10.23
Cabinet.dll


14-74443
Tyrande
2003-10-02 19:03
2003.10.23
Колонки или звук. карта? Кто дурак?


7-74494
RomCom
2003-08-09 09:50
2003.10.23
Установка Tx COM-порта


4-74541
Michael Makushev
2003-08-18 13:30
2003.10.23
TThread - и совместное использование данных


9-73960
b@nz@i
2003-04-19 06:05
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский