Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.19;
Скачать: CL | DM;

Вниз

Приведение типов массивов...   Найти похожие ветки 

 
Kolan ©   (2006-02-01 12:31) [0]

Здравствуйте,
 Мчает вопрос:
 Вот есть у меня тип:
 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


 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.028 c
3-1135335487
UnDISCOvery
2005-12-23 13:58
2006.02.19
MS Access - макс.размер файла БД - сжать и добавить


2-1138957015
саня_
2006-02-03 11:56
2006.02.19
Подскажите решение


2-1138553667
tort
2006-01-29 19:54
2006.02.19
Ошибкак в Mediaplayer1?


8-1126434169
Ego
2005-09-11 14:22
2006.02.19
Как вставить звуковой файл в тело программы?


15-1138013263
pavel_guzhanov
2006-01-23 13:47
2006.02.19
DirectX или OpenGL