Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.21;
Скачать: CL | DM;

Вниз

Length для массивов в   Найти похожие ветки 

 
Acorus ©   (2002-11-12 13:55) [0]

Ребята, как написать универсальную функцию 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 ?


 
AndreyAG ©   (2002-11-12 14:10) [1]

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


 
Acorus ©   (2002-11-12 14:19) [2]

так что ли ?:

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?

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


 
PVOzerski ©   (2002-11-12 15:36) [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;


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

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...


 
Acorus ©   (2002-11-12 16:30) [5]

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



Страницы: 1 вся ветка

Текущий архив: 2002.11.21;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.012 c
14-69533
SV
2002-11-02 14:49
2002.11.21
Мама, где ты?


3-69205
sen
2002-11-01 13:54
2002.11.21
Хранение wav файлов в BLOB полях Oracle


14-69530
FnF
2002-10-28 22:56
2002.11.21
Не совсем такая уж проблема, только вот...


3-69219
bkv
2002-11-01 16:41
2002.11.21
Навигация по отфильтрованной таблице большого размера


1-69356
pheonix_ash
2002-11-11 16:35
2002.11.21
Подскажите как это осуществить