Форум: "Основная";
Текущий архив: 2002.11.21;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c