Приведення типів масивів

Приведення типів масивів.

Вітаю,
# XA0; Мчает питання:
# XA0; Ось є у мене тип:
# XA0; TByteArray = array of Byte;
# XA0; І функції:

№1
procedure TForm1.SomeFunc (var A: TByteArray);
begin
# XA0; SetLength (A, 20);
end;

procedure TForm1.SomeFunc2;
var
# XA0; A: array of Byte;
begin
# XA0; 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
# XA0; SetLength (A, 20);
end;

те:
[Error] Unit1.pas (31): Incompatible types

Питання як викликати функцію SomeFunc (A); з прикладу №1. причому оголосити
A: TByteArray; не можна.

І ще одне запитання чому не можна викликати SetLength для масиву array of Byte

Існує кілька схем для визначення того, чи є типи двох об'єктів еквівалентними. Дві схеми, найбільш часто використовувані, називаються структурна еквівалентність типів і іменна еквівалентність типів. У відповідності зі схемою структурної еквівалентності типів два об'єкти еквівалентні тільки в тому випадку, якщо структура їх типів однакова. У відповідності зі схемою іменний еквівалентності, два об'єкти еквівалентні, якщо їх визначення використовують ім'я одного типу.

У Object Pascal прийнята іменна еквівалентність.

Тому:

> Причому оголосити
> A: TByteArray; не можна.

Чи не можна, а обов'язково.


> І ще одне запитання чому не можна викликати SetLength для масиву
> Array of Byte

А з чого ти взяв, що не можна? Можна, можливо!


> І ще одне запитання чому не можна викликати SetLength для масиву
> Array of Byte

procedure TForm1.SomeFunc2;
var
A: array of Byte;
begin
SomeFunc (TByteArray (A));
end;

Ну я так і намагався. Просто приклад не дуже коректний.
Ось така ситуація у мене:
procedure TForm1.SomeFunc (A: array of Byte);
begin
# XA0; SomFunc (TByteArray (A));
end;

procedure TForm1.SomFunc (A: TByteArray);
begin
# XA0; SetLength (A, 10);
end;

Якщо A - лок змінна то приведення допомогло. А якщо так то
# XA0; [Error] Unit1.pas (30): Invalid typecast


> І ще одне запитання чому не можна викликати SetLength для масиву
> Array of Byte

А з чого ти взяв, що не можна? Можна, можливо!

Ну як же можна якщо
[Error] Unit1.pas (31): Incompatible types

Хотілося б взагалі від цих типів типу TByteArray позбудеться.


> Причому оголосити
> A: TByteArray; не можна.

Чи не можна, а обов'язково.

Не можна бо не хочу щоб модулі використовували якісь сторонні типи. Ті написав модуль і він один - оч зручно. А так доводиться ще робити модуль де обявлени подібні типи всюди його підключати.

по 2 питання - чому не можна викликати SetLength для масиву array of Byte

Тому що в даному випадку параметр - НЕ динамічний масив, а відкритий (Open Array Parameters)

По першому - не бачу причин, чому б у всіх твоїх випадках не використовувати пред'обявленний тобою тип дин. масиву

Тому що в даному випадку параметр - НЕ динамічний масив, а відкритий (Open Array Parameters)

Зрозуміло. Ті можна передати і стат масив.

> Ті можна передати і стат масив.
Так, і навіть сконструювати його SomeFunc ([1,2,3])

Ясно. Дякую всім :)

Схожі статті