Приведення типів масивів.
Вітаю,
# 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])
Ясно. Дякую всім :)