warobushek писал(а):в чем различие между типами tIntArr0 и tIntArr1, между указателями tPtrIntArr0 и tPtrIntArr1.
Можно ведь убрать один из типов?
Убрать - можно.
Различие - смотрите внимательнее на описанте типов. В первом случае элементы массив считается от индекса 1, во втором - от индекса 0. Кому-то (или в каких-то случаях) удобнее использовать один вариант, кому-то (или в каких-то случаях) - другой.
Кстати, в связи с этим в Вашем коде ошибка:
warobushek писал(а):Код: Выделить всё
procedure outmas(ptr: tPtrIntArr0; size: integer);
......................................
begin
for i:=1 to size do
begin
..............
write(ptr^[i],' ')
..............
end;
end;{outmas}
Вы передаете в процедцру массив (т.е., конечно, указатель на него) типа
tPtrIntArr0, т.е. считающийся от индекса
0, а цикл крутите от
1 до
size.
Либо нужно использовать
tPtrIntArr1 (и крутить цикл, как сейчас и написано, от
1 до
size), либо, если использовать (как сейчас)
tPtrIntArr0, то цикл крутить от
0 до
(size - 1)
Кстати, читабельнее будет в качестве флага
flag использовать переменную не типа
byte, а типа
boolean. Переменные которго принимают значения TRUE и FALSE. Хотя формально здесь ошибки нет.
Код: Выделить всё
var
i: integer;
flag: boolean;
begin
flag:=FALSE;{признак того, что был встречен не нулевой элемент}
for i:=1 to size do
begin
if (flag) then
write(ptr^[i],' ')
else
if(ptr^[i]<>0) then
begin
write(ptr^[i],' ');
flag:=TRUE;
end;
end;
end;{outmas}
Как мне сделать так, чтобы эта процедура работала и для обычного массива (или указателя на него) любого размера?
Если я правильно понял вопрос, то, например, вот так:
Код: Выделить всё
procedure outmas(ptr: tPtrIntArr1; size: integer);
begin
...................................
end;{outmas}
var aiTest : array [1 .. 10] of integer;
begin
...................................
outmas (@aiTest, SizeOf (aiTest) div SizeOf (aiTest [1]));
{ Ну, или, если предыдущая строка выглядит слишком загадочно, то: }
outmas (@aiTest, 10);
end.
Если на
@aiTest компилятор будет выдавать ошибку 'Type mismatch', то, либо поставьте директиву компилятора
{$T-} ( Type-Checked Pointers Switch), либо сделайте приведение типа при передаче параметра в outmas :
outmas (tPtrIntArr1(@aiTest), 10);