Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
2 / 2 / 0
Регистрация: 18.08.2015
Сообщений: 48
1

Как объявить тип эквивалентный другому типу?

16.11.2017, 16:16. Показов 1222. Ответов 8

Author24 — интернет-сервис помощи студентам
Всем привет,
Не могу разобраться с пользовательскими типами - массивами. Для передачи массива в виде аргумета, у меня объявлены подобные типы:
Delphi
1
2
type
  DoubleArr = array of double; //массив чисел Double
Работаю с ними как с простыми динамическими массивами, но столкнулся с проблемой:
Мне нужно присвоить переменной типа DoubleArr значение типа array of double (Класс из другого юнита содержит значение в таком виде)

То есть ситуация примерно такая:
Delphi
1
2
3
4
5
6
7
8
var
  A: array of Double;
  B: DoubleArr;  // type DoubleArr = array of Double;
begin
  SetLength(A, 1);
  A[0] := 0;
  B := A;  //Incompatible types: 'DoubleArr' and 'Dynamic array'
end;
При компиляции вылазит ошибка: [dcc32 Error]: E2010 Incompatible types: 'DoubleArr' and 'Dynamic array'
Понимаю что объявления переменных разные, но фактически же в переменных один и тот же тип!

Скажите пожалуйста может как то можно сделать преобразование типов, или надо по значениям в цикле перебивать из одного массива в другой? Как то это глупо мне кажется...

Или если в одном юните так объявлен тип DoubleArr и в другом точно так же, то ему тоже не нравится:
ошибка: [dcc32 Error]: E2010 Incompatible types: 'Unit1.DoubleArr' and 'Unit2.DoubleArr'
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.11.2017, 16:16
Ответы с готовыми решениями:

как приводить тип к другому типу?
Хай всем! В паскале полный ноль. Неплохо знаю VB, Си, пхп, яву. Придурацкий хелп в DElphi должон я...

Как объявить тип Tshape ?
как выполнить следующее: Объявим тип TShape = (sPen, sRect, sEllipse, sPoly, sFill). что надо...

Приведение к другому типу
здравствуйте, подскажите, пожалуйста, как преобразовывать типы? у меня есть функция void...

Приведение переменной к другому типу
float a = (float)x; // старый стиль float b = static_cast<float>(y); // современный стиль ...

8
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
16.11.2017, 16:24 2
Проще объявить тип 1 раз в отдельном модуле и ими пользоваться во всех юнитах.
0
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
16.11.2017, 16:45 3
если уж на то пошла такая пьянка))) то можно так

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
type
  TMyArray = Array[0..1] of Integer;
 
var
  Form1: TForm1;
 
  A: Array[0..1] of Integer;
  B: TMyArray;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  A[0] := 10;
  A[1] := 20;
 
  B := TMyArray(A);
 
  ShowMessage(IntToStr(B[0]) + #13#10 + IntToStr(B[1]));
 
 
  // преобразовать массивы в "обратном направлении"
  B[0] := 100;
  B[1] := 200;
 
  TMyArray(A) := B;
 
  ShowMessage(IntToStr(A[0]) + #13#10 + IntToStr(A[1]));
end;
но господин Пупорев скзаал как проще и как делают, мне кажется, в основном случае)

Добавлено через 5 минут
Цитата Сообщение от novikoff92 Посмотреть сообщение
Или если в одном юните так объявлен тип DoubleArr и в другом точно так же, то ему тоже не нравится:
ошибка: [dcc32 Error]: E2010 Incompatible types: 'Unit1.DoubleArr' and 'Unit2.DoubleArr'
можно еще так... если уж снова такая пьянка)))

Delphi
1
2
3
var 
A: Unit1.DoubleArr;
B: Unit2.DoubleArr;
но такая пьянка выльется в скором в "Белочку" (белую горячку) с такими типами в проектах))))
0
2 / 2 / 0
Регистрация: 18.08.2015
Сообщений: 48
17.11.2017, 09:23  [ТС] 4
Цитата Сообщение от Puporev Посмотреть сообщение
Проще объявить тип 1 раз в отдельном модуле и ими пользоваться во всех юнитах.
т.е. как я понимаю юнит с объявлением общих типов и констант и подключать его к каждому другому юниту? Хорошая идея)

Цитата Сообщение от Arcor Посмотреть сообщение
если уж на то пошла такая пьянка))) то можно так
Такой способ тоже решил проблему!

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
var
  A: DoubleArr;
  B: array of double;
begin
  SetLength(B, 2);
  B[0] := 5;
  B[1] := 2;
  //B = [5,2]  A = nil
  A := DoubleArr(B);
  //B = [5,2]  A = [5,2]
  B[0] := 3;
  //B = [3,2]  A = [3,2]
Спасибо большое за ответы!
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
17.11.2017, 22:24 5
Цитата Сообщение от novikoff92 Посмотреть сообщение
Delphi
1
2
3
var
  A: array of Double;
  B: DoubleArr; *// type DoubleArr = array of Double;
ну если В видит тип DoubleArr, почему бы и А не объявить с этим типом?
0
пофигист широкого профиля
4732 / 3167 / 858
Регистрация: 15.07.2013
Сообщений: 18,251
18.11.2017, 02:09 6
Цитата Сообщение от Puporev Посмотреть сообщение
Проще объявить тип 1 раз в отдельном модуле и ими пользоваться во всех юнитах.
Если говорить о Дельфи/Паскале, то такой способ не только проще, но и единственно грамотный.
А проблемы с совместимостью типов, это проблемы индейцев. (Которые шерифов не волнуют

Добавлено через 17 минут
Цитата Сообщение от novikoff92 Посмотреть сообщение
Такой способ тоже решил проблему!
Только твою локальную проблему в данном твоём локальном коде. Но!
При использовании прямого приведения типов
Цитата Сообщение от novikoff92 Посмотреть сообщение
A := DoubleArr(B);
Дельфи отдаёт тебе на откуп все проблемы, которые могу возникнуть из-за твоей ошибки. Точнее ты сам принимаешь на себя ответственность за то, что такое приведение типов - верное. А с ошибками, если они возникнут, разбирайся сам.
0
2 / 2 / 0
Регистрация: 18.08.2015
Сообщений: 48
21.11.2017, 16:01  [ТС] 7
Цитата Сообщение от DenNik Посмотреть сообщение
ну если В видит тип DoubleArr, почему бы и А не объявить с этим типом?
Это я для простоты примера так написал, на самом деле:
массив типа "array of Double" это поле совсем отдельного класса, рассчитываемого в другом потоке,
а обрабатывать мне его уже надо у себя с помощью функции принимающей тип "DoubleArr"
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
21.11.2017, 16:44 8
Цитата Сообщение от novikoff92 Посмотреть сообщение
массив типа "array of Double" это поле совсем отдельного класса, рассчитываемого в другом потоке,
да какая нафик разница, в каком поле и в каком потоке это обрабатывается? объяви свой тип DoubleArr в отдельном модуле, подключи его ко всем модулям, использующим DoubleArr и все будет работать.

по аналогии с системными типами мыслей не возникает никаких? когда ты объявляешь переменную, например типа TPoint, где этот TPoint находится, как ты думаешь?
0
2 / 2 / 0
Регистрация: 18.08.2015
Сообщений: 48
21.11.2017, 16:49  [ТС] 9
Цитата Сообщение от DenNik Посмотреть сообщение
да какая нафик разница, в каком поле и в каком потоке это обрабатывается? объяви свой тип DoubleArr в отдельном модуле, подключи его ко всем модулям, использующим DoubleArr и все будет работать.
по аналогии с системными типами мыслей не возникает никаких? когда ты объявляешь переменную, например типа TPoint, где этот TPoint находится, как ты думаешь?
Да я понял уже это и сделал уже так))

Добавлено через 1 минуту
Цитата Сообщение от novikoff92 Посмотреть сообщение
т.е. как я понимаю юнит с объявлением общих типов и констант и подключать его к каждому другому юниту? Хорошая идея)
я сразу так решил сделать, но отметил что 2й способ тоже решил мою проблему.
0
21.11.2017, 16:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.11.2017, 16:49
Помогаю со студенческими работами здесь

Как типу String^ присвоить тип char[]?
Как типу String^ присвоить тип char? Так не работает: String ^S = File.Name;

Привести один тип к другому. Тип универсальный, параметризируется другими типами
Доброго времени суток! Прошу помощи, что-то туплю. Под вечер или вообще :) Пытаюсь привести...

Приведение указателя на void к другому типу?
в поиске смотрел - не помогло! Возникла проблемка: В книге сказано, что указателю на void можно...

Как по типу массива узнать тип его элементов
Всем здравствуйте. Есть тип массива (экземпляр класса Type) - например string. Как по типу массива...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru