![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Приведение типов массивов... [D7, XP]
Kolan © (2006-02-01 12:31:00)Здравствуйте,
Мчает вопрос:
Вот есть у меня тип:
TByteArray = array of Byte;
И функции:
№1
procedure TForm1.SomeFunc(var A: TByteArray);
begin
SetLength(A, 20);
end;
procedure TForm1.SomeFunc2;
var
A: array of Byte;
begin
SomeFunc(A);
end;
Компилятор ругается:
[Error] Unit1.pas(38): Types of actual and formal var parameters must be identical
А если так:
№2
procedure TForm1.SomeFunc(var A: array of Byte);
begin
SetLength(A, 20);
end;
То:
[Error] Unit1.pas(31): Incompatible types
Вопрос как вызвать функциюSomeFunc(A);из примера №1. Причем объявить
A: TByteArray;нельзя.
И другой вопрос почему нельзя вызватьSetLengthдля массиваarray of Byte
Kolan (2006-02-01 15:56:00) [1]Ясно. Благодарю всех :)
MBo (2006-02-01 14:12:00) [2]>Те можно передать и стат массив.. ?
Да, и даже сконструировать его SomeFunc([1,2,3])
Kolan (2006-02-01 13:47:00) [3]Потому что в данном случае параметр - не динамический массив, а открытый (Open Array Parameters)
Понятно. Те можно передать и стат массив.. ?
MBo (2006-02-01 13:06:00) [4]по 2 вопросу - почему нельзя вызвать SetLength для массива array of Byte
Потому что в данном случае параметр - не динамический массив, а открытый (Open Array Parameters)
По первому - не вижу причин, почему бы во всех твоих случаях не использовать предъобявленный тобой тип дин. массива
Kolan (2006-02-01 13:05:00) [5]
Ega23 © (01.02.06 12:51) [2]
Ну я так и пытался. Просто пример не очень корректный...
Вот такая ситуация у меня:
procedure TForm1.SomeFunc( A: array of Byte);
begin
SomFunc(TByteArray(A));
end;
procedure TForm1.SomFunc(A: TByteArray);
begin
SetLength(A, 10);
end;
Если A - лок переменная то приведение помогло. А если так то
[Error] Unit1.pas(30): Invalid typecast
ZeroDivide © (01.02.06 12:46) [1]
Благодарю за разяснения.
> И другой вопрос почему нельзя вызвать SetLength для массива
> array of Byte
А с чего ты взял, что нельзя? Можно!
Ну как же можно если
[Error] Unit1.pas(31): Incompatible types
Хотелось бы вообще от этих типов типа TByteArray избавится...
> Причем объявить
> A: TByteArray; нельзя.
Не нельзя, а обязательно.
Нельзя потому что не хочу чтобы модули использовали какието посторонние типы. Те написал модуль и он один - оч удобно. А так приходится еще делать модуль где обявлены подобные типы везде его подключать.....
Ega23 (2006-02-01 12:51:00) [6]
> И другой вопрос почему нельзя вызвать SetLength для массива
> array of Byte
Почему нельзя?
procedure TForm1.SomeFunc2;
var
A: array of Byte;
begin
SomeFunc( TByteArray(A));
end;
Так пойдёт?
ZeroDivide (2006-02-01 12:46:00) [7]Существует несколько схем для определения того, являются ли типы двух объектов эквивалентными. Две схемы, наиболее часто используемые, называются структурная эквивалентность типов и именная эквивалентность типов. В соответствии со схемой структурной эквивалентности типов два объекта эквивалентны только в том случае, если структура их типов одинакова. В соответствии со схемой именной эквивалентности, два объекта эквивалентны, если их определения используют имя одного типа.
В Object Pascal принята именная эквивалентность.
Поэтому:
> Причем объявить
> A: TByteArray; нельзя.
Не нельзя, а обязательно.
> И другой вопрос почему нельзя вызвать SetLength для массива
> array of Byte
А с чего ты взял, что нельзя? Можно!