Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.009 c
3-69196
Live_Aus_Berlin
2002-10-31 22:09
2002.11.21
Есть прога дла расчёта производных функции???


1-69410
Lexa1900
2002-11-10 23:30
2002.11.21
Как создать свой тип шаблона?


3-69101
Наташа
2002-11-02 17:44
2002.11.21
Создание SQL запроса


4-69650
SergeBSL
2002-10-09 23:35
2002.11.21
Как переместить курсор в Edit-е чтобы выделенная часть не пропала


1-69349
Anar
2002-11-10 00:32
2002.11.21
OnCloseQuery





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