Форум: "Начинающим";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];
ВнизПриведение типов массивов... Найти похожие ветки
← →
Kolan © (2006-02-01 12:31) [0]Здравствуйте,
Мчает вопрос:
Вот есть у меня тип:
TByteArray = array of Byte;
И функции:
№1procedure 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
А если так:
№2procedure 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
← →
ZeroDivide © (2006-02-01 12:46) [1]Существует несколько схем для определения того, являются ли типы двух объектов эквивалентными. Две схемы, наиболее часто используемые, называются структурная эквивалентность типов и именная эквивалентность типов. В соответствии со схемой структурной эквивалентности типов два объекта эквивалентны только в том случае, если структура их типов одинакова. В соответствии со схемой именной эквивалентности, два объекта эквивалентны, если их определения используют имя одного типа.
В Object Pascal принята именная эквивалентность.
Поэтому:
> Причем объявить
> A: TByteArray; нельзя.
Не нельзя, а обязательно.
> И другой вопрос почему нельзя вызвать SetLength для массива
> array of Byte
А с чего ты взял, что нельзя? Можно!
← →
Ega23 © (2006-02-01 12:51) [2]
> И другой вопрос почему нельзя вызвать SetLength для массива
> array of Byte
Почему нельзя?procedure TForm1.SomeFunc2;
var
A: array of Byte;
begin
SomeFunc(TByteArray(A));
end;
Так пойдёт?
← →
Kolan © (2006-02-01 13:05) [3]
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; нельзя.
Не нельзя, а обязательно.
Нельзя потому что не хочу чтобы модули использовали какието посторонние типы. Те написал модуль и он один - оч удобно. А так приходится еще делать модуль где обявлены подобные типы везде его подключать.....
← →
MBo © (2006-02-01 13:06) [4]по 2 вопросу - почему нельзя вызвать SetLength для массива array of Byte
Потому что в данном случае параметр - не динамический массив, а открытый (Open Array Parameters)
По первому - не вижу причин, почему бы во всех твоих случаях не использовать предъобявленный тобой тип дин. массива
← →
Kolan © (2006-02-01 13:47) [5]Потому что в данном случае параметр - не динамический массив, а открытый (Open Array Parameters)
Понятно. Те можно передать и стат массив.. ?
← →
MBo © (2006-02-01 14:12) [6]>Те можно передать и стат массив.. ?
Да, и даже сконструировать его SomeFunc([1,2,3])
← →
Kolan © (2006-02-01 15:56) [7]Ясно. Благодарю всех :)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.045 c