Форум программистов, компьютерный форум, киберфорум
Наши страницы
Другие языки программирования
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
кчирвырлмылвырл
0 / 0 / 0
Регистрация: 16.03.2014
Сообщений: 3
1

[Ada] Создать динамический массив, тип которого опеределяется, как "Запись с динамическим массивом"

16.03.2014, 12:28. Просмотров 1127. Ответов 4
Метки нет (Все метки)

Я программирую на языке ada. Передо мной возникла задача создать динамический массива тип которого
опередяется как запись с динамическим массивом. тоесть примерно вот так:

Код
type A is array (Positive range <>) of integer;
type B(max : integer) is record 
  B_a : A(1..max);
  B_b : integer;
end record;
type C is array (Positive range <>) of B;
понятное дело этот код работать не будет из за того что в типе C тип ячеек массива не имеет параметра max. но если задать параметр max То массив станет не динамический. На решение данной проблемы я потратил 2 дня поиска, но ответа так и не нашел. Надеюсь тут найдется человек который прошел через всю боль ада. И знает решение этой проблемы.
Если ты все таки этот человек то помоги как задать этот массив, а так же как задавать его размерность в функциях. Ну тоесть для обычного динамического массива это происходить вот так:

Код
type D is array (Positive range <>) of integer;
Procedure K (m:integer) is
  F: D (1..max);
begin
...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2014, 12:28
Ответы с готовыми решениями:

[КуМир] Ввести символьную строку и заменить все буквы "а" на "б" и наоборот (как заглавные так и строчные)
ввести символьную строку и заменить все буквы а на буквы б и наоборот как...

[Ada] Почему язык Ada не получил широкого распространения?
ADA, этот язык позиционируется как язык для разработки приложений, к которым...

[Ada] Где можно скачать язык Ada?
Здрасте всем народ где можно скачать этот язык?у кого нибудь есть ссылки? в...

[Ada] Язык Ada и семантика ASIS
Требуется помощь, не ставится ADA ASIS на ПК, не понимаю как его распаковывать,...

Как "расширить" тип integer
Возникла проблема. Во время выполнения программы вылезает ошибка: Fortran...

4
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26101 / 17501 / 6943
Регистрация: 22.10.2011
Сообщений: 30,823
Записей в блоге: 6
16.03.2014, 13:56 2
Лучший ответ Сообщение было отмечено кчирвырлмылвырл как решение

Решение

Ты не можешь задать массив из дискриминантных record-ов, не задавая значения дискриминанта еще при объявлении типа. Лучшее, что можно сделать - это задать некое значение дискриминанта по умолчанию, но массив B_a от этого более "динамическим" не станет. Задачу уточни, возможно, она решится другим способом.
1
кчирвырлмылвырл
0 / 0 / 0
Регистрация: 16.03.2014
Сообщений: 3
16.03.2014, 14:14  [ТС] 3
нужно улучшить вот эту древовидную структуру:

Код
   Type T_sA is array (0..4) of integer;
   Type A is record
      Op:string(1..8);
      s : T_sA;
      i : integer;
   end record;
  type D is array (Positive range <>,Positive range <>,Positive range <>) of A;
Данная структура описывает дерево в котором op это какой либо оператор +,-,mod,:= и.т.д. а S(0..4) массив ссылок, i это указатель не заполненной ячейки массива S. Для моей программы требуется массив элементов A назовем его B и ещё 1 массив из элементов B. динамическими они нужны для постепенного заполнения и не использование дополнительных параметров отвечающих за количество заполненных ячеек. В данном же случае если увеличивать i из типа D(i,j,k) то мы увеличиваем его размер не на 1 ячейку а на i*j что не очень хорошо.
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26101 / 17501 / 6943
Регистрация: 22.10.2011
Сообщений: 30,823
Записей в блоге: 6
16.03.2014, 14:59 4
Лучший ответ Сообщение было отмечено кчирвырлмылвырл как решение

Решение

Есть вот такой вариант:
Код
procedure main is   
   type A is array (Natural range <>) of integer;
   
   subtype Max_Range is Natural range 0 .. 1000; -- тут какое-то ограничение чтобы не было Storage_Error
   type B(max : Max_Range := 0) is record 
      B_b : integer;
      B_a : A(1 .. max);
   end record;
   
   type C is array (Positive range <>) of B; -- это прекрасно компилируется
   
   procedure P is
      -- а при создании массива уже задаются его дискриминанты...
      arr : array(1 .. 10) of B := 
        (others => (max => 75, B_b => 1, B_a => (others => 0)));
   begin
      null;
   end P;
   
begin
   P;
end main;
Но опять, я не думаю, что тебе это поможет...
1
кчирвырлмылвырл
0 / 0 / 0
Регистрация: 16.03.2014
Сообщений: 3
16.03.2014, 15:03  [ТС] 5
ага не поможет, но главное что вы сказали что сделать этого нельзя, это уже можно считать ответом, иначе я бы так и продолжал искать, большое спасибо.
0
16.03.2014, 15:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2014, 15:03

как работают команды "String", "Unstring", "Pointer" с большими переменными
Привет. Я начинающий программист в Cobol. У меня такой вопрос: мне нужно...

Массив фиксированного размера может быть динамическим? Что такое "динамический массив"?
есть код string line; char *dup=new char; Я так понимаю создается...

Определить тип данных "Запись", имеющий поля "Фамилия", "Пол", "Зарплата"
определить тип данных запись имеющий поля фамилия пол зарплата. определить...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru