Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.037 c
15-1138106652
Prospect
2006-01-24 15:44
2006.02.19
Дайте рекомендации, плз.


2-1138632049
gidd
2006-01-30 17:40
2006.02.19
трех позиционный CheckBox


2-1139124267
PARUS
2006-02-05 10:24
2006.02.19
Автоответчик


3-1135066879
skulll
2005-12-20 11:21
2006.02.19
Помогите подключиться к MSSQL через DBE


2-1138689259
Три корочки
2006-01-31 09:34
2006.02.19
Application.Run





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский