Главная страница
    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.45 MB
Время: 0.006 c
1-69425
AndreyAG
2002-11-11 11:00
2002.11.21
Окна!


4-69621
Oxy2
2002-10-08 11:40
2002.11.21
Проблемы с локальным хуком WH_SHELL


4-69623
DeCompiler
2002-10-09 22:21
2002.11.21
Клик мышкой в чужом окне


1-69371
Trof
2002-11-08 16:01
2002.11.21
Размер дочерних окон MDI-интерфейса


1-69348
Cranium
2002-11-13 01:12
2002.11.21
Работа с LPT. В D3 все работало, а в D5 ругается, вот пример кода





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