Главная страница
    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.007 c
14-69519
Pan
2002-10-31 15:42
2002.11.21
Как все-таки перевести на русский надпись на кнопке Ok?


1-69272
Durik
2002-11-09 23:10
2002.11.21
Как удалить запись из TString а


3-69207
Relict
2002-11-01 09:11
2002.11.21
видел тут вопрос про 1С...может и мне подскажут..


1-69341
Andrey-k
2002-11-11 23:17
2002.11.21
TGrid и TDBGrid и TDBListBox - общий вопрос


1-69305
Kinder
2002-11-12 13:21
2002.11.21
Подскажите начинающему





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