PDA

Просмотр полной версии : Длина Открытого Массива в Pax'e


mikser
26.07.2012, 12:11
Как узнать сабж?
Почемуто у меня длинна всегда равна единице и не зависит от фактической длинны в конструкторе.
А у вас как ? Пожалуйста проверьте:

{запустите в именно паксе! а не в делфи }
program tvarTest;
uses SysUtils;


procedure OpenArrayTest(const OpArray: array of Integer);
var
i: Integer;
begin
print('Длинна массива : '+intToStr(length(OpArray)));
print('Последний индекс: '+intToStr(High(OpArray) ));

for i := Low(OpArray) to High(OpArray) do
begin
print('Array ' +IntToStr( i )+' = '+ IntToStr( OpArray ) );
end;
end;


begin
OpenArrayTest([11,22,33,44,55,66,77]);

end.


вот что выводит у меня
Длинна массива : 1 //а должно быть 7
Последний индекс: 0 //а должно быть 6
Array 0 = 11

[I]Добавлено через 52 секунды
Как узнать длинну открытого массива без передачи дополнительных параметров?

SeregaZ
26.07.2012, 15:06
а не верно ли? массив содержит один элемент, с индексом 0 - массивы вроде с 0 начинаются.

mikser
26.07.2012, 15:29
с индексом 0 - массивы вроде с 0 начинаются.
Да, Открытые массивы Zero-Based с этим ни кто и ни спорит.
массив содержит один элемент
Нет, массив содержит 7 элементов. [11,22,33,44,55,66,77]

а не верно ли?
Нет не верно
я передал в процеду массв из 7 элементов [11,22,33,44,55,66,77]
а внутри процедуры оказывается его длинна равна 1 (WTF)

Я попросил проверить у вас так же?

SeregaZ
26.07.2012, 16:23
ааа... не туда посмотрел :) туплю на старости лет... значит передаешь неверно. чтобы удостоверится попробуй так:
begin
OpenArrayTest([11,22,33,44,55,66,77]);
print('Array 2 = '+ IntToStr( OpArray[2] ) ); должно по идее показать 33
end.
в случае вылета, скажет оут оф бондс или как там... значит передаешь все-таки не верно, если покажет... эээ... ну думаю оно не покажет :)

и еще момент! у меня в пьюр бейсике для организации массива сначала требуется указать его размер. типа Dim Array(10), а уже после этого забивать данные. нет ли чего подобного в твоем языке?

mikser
26.07.2012, 16:40
SeregaZ,
1. покажет 33.
2. есть array[0..10] of тип.

а как насчет ответа на сабжевый вопрос?

supernewbie
26.07.2012, 16:54
mikser, попробуй print('Длинна массива : '+intToStr(SizeOf(OpArray) div SizeOf(Integer)));

mikser
26.07.2012, 18:04
mikser, попробуй print('Длинна массива : '+intToStr(SizeOf(OpArray) div SizeOf(Integer)));
тоже самое получается:
{запустите в именно паксе! а не в делфи }
program tvarTest;
uses SysUtils;


procedure OpenArrayTest(const OpArray: array of Integer);
var
i: Integer;
Len:Integer;
begin


Len:=SizeOf(OpArray) div SizeOf(Integer) ;

print('Длинна массива : '+intToStr(Len));
print('Последний индекс: '+intToStr( Len-1 ));


for i := Low(OpArray) to Len-1 do
begin
print('Array ' +IntToStr( i )+' = '+ IntToStr( OpArray ) );
end;
end;


begin
OpenArrayTest([11,22,33,44,55,66,77]);

end.
SizeOf(OpArray)=4
видимо это указатель

[I]Добавлено через 28 минут
Уря победил!!!
Помогло старое-доброе насилие - преобразование типов
обявляем какойнить тип вроде MyType=array of Integer;
что по существу есть описание динамического массива
а потом преобразуем нашь массив к нему MyType(mass)
Но полученый код будет работать только с массивом из целых чисел
Потому было принято решение юазть Array of Const для универсальности :)

Вот рабочий код:

{запустите в именно паксе! а не в делфи }
program tvarTest;
uses SysUtils;

type TDAoC=array of const;

procedure OpenArrayTest(const OpArray: array of Integer);
var
i: Integer;
begin
print('Длинна массива : '+intToStr(length(TDAoC(opArray))));
print('Последний индекс: '+intToStr( High(TDAoC(opArray)) ));

for i := Low(TDAoC(opArray)) to High(TDAoC(opArray)) do
begin
print('Array ' +IntToStr( i )+' = '+ IntToStr( OpArray[i] ) );
end;
end;


begin
OpenArrayTest([11,22,33,44,55,66,77]);

end.



Print: Длинна массива : 7
Print: Последний индекс: 6
Print: Array 0 = 11
Print: Array 1 = 22
Print: Array 2 = 33
Print: Array 3 = 44
Print: Array 4 = 55
Print: Array 5 = 66
Print: Array 6 = 77