Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Length для массивов в [D2]


Acorus ©   (2002-11-12 13:55:00) 

Ребята, как написать универсальную функцию Length для массивов с элементами различных типов в D2 ?

пробовал так:
function _length(var a: array of const): Longint;
begin
result := high(a) - low(a) + 1;
end;

но при передаче конкретного массива (например: array [1..3] of Integer) - не соответствие типов!

знаю что можно - ведь есть length для строк и в старших версиях она же и для массивов...

но как написать на D2 ?


Acorus   (2002-11-12 16:30:00) [1]

ясно - спасибо!


Alex44   (2002-11-12 16:09:00) [2]

array [1..3] of ... - eto massive, dlinu kotorogo znaet compilator; v run-time ona nedostupna (t.k. ne nuzhna).
array of ... - dynamicheskiy massive; grubo govorya, eto chto-to tipa ukazatelya, dlina kotorogo hranitsya vmeste s massivom. Tak chto, nikak...


PVOzerski   (2002-11-12 15:36:00) [3]

Боюсь, что придется свой Heap Manager писать... И то для статических переменных не подойдет. Либо другой вариант: написать свою процедуру для выделения памяти под массив. И выделять не просто блок запрашиваемой длины, а делать нечто вроде внутренней структуры AnsiString.

Тут уж пишу, не проверяя работоспособность, так что никаких гарантий.

type
tHead=packed record
len:longint;
body:array[4..4]of byte;
end;
pHead=^tHead;
procedure SetALength(var p:pointer;ItemSize,ItemCount:cardinal);
var
h:pHead;
begin
if ItemSize*ItemCount<>0 then
begin
if p=nil then
GetMem(h,ItemSize*ItemCount+sizeof(longint));
else
begin
h:=addr(pHead(p)^.body[0]);
ReallocMem(h,ItemSize*ItemCount+sizeof(longint));
end;
p:=addr(h^.body);
h^.len:=ItemCount;
end
else if p<>nil then
begin
p:=addr(pHead(p)^.body[0]);
ReallocMem(p,0);
end;
end;

function GetALength(p:pointer):longint;
begin
if p=nil then
Result:=0
else
Result:=longint(pointer(addr(pHead(p)^.body[0]))^);
end;


Acorus   (2002-11-12 14:19:00) [4]

так что ли ?:

function _length(p: Pointer): Longint;
begin
result := high(p^) - low(p^) + 1;
end;

- так не компилируется ! - Incompatible types в строке result := ...

для high и low нужны только конкретные типы (по доке):
Ordinal type
Array type
String type
Open array
String parameter
- а как привести указатель к open array?

- дайте плиз рабочий код!


AndreyAG   (2002-11-12 14:10:00) [5]

Передавай указатель !


Наверх

Титульная страница Поиск, карта сайта Написать письмо