Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2014, 19:20   #11
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
1) Нельзя после, так ошибка при выделении памяти под типизированный указатель (размер динамического массива внутри не опеределен)
Убейте указатели. Объявите динамический массив рекордов и будет Вам счастье.
Цитата:
2) Ну про SetLength я знаю , вот только где мне выделять память под массив? в отдельной функции? и как мне передать указатель в record. Это ведь не экземпляр класса и я не могу вызвать конструктор при выделении памяти под узел.
Вы раб указателей. Современные языки программирования и методики проектирования уходят от прямого манипулирования памятью. Это удел системных программистов. Начните сначала с учетом новой вводной - полностью исключить использование указателей как в модели дерева так и в реализации. Никаких ^ в коде.
Цитата:
Это ведь не экземпляр класса и я не могу вызвать конструктор при выделении памяти под узел.
Можете. Вы же знаете когда возникнет операция добавления узла. Тогда и вызываете свой SetLength. Такой вот ручной конструктор. Да и для динамических узлов ошибка возникать не будет. Но это не означает, что в массив не нужно будет распределять элементов. Вы просто отложите выделение памяти до другого момента.
Цитата:
Я конечно могу описать узел как объект а не запись но это уже не совсем то что требуется в задании.
Проблема в указателях, а не в записях.
И не попадитесь на удочку Паскаля. Есть динамические массивы, а есть открытые массивы. В последних размер изначально неизвестен, но как только Вы начнете с ним работать размер изменить не сможете. То есть как только передадите из функции/процедуры начнутся проблемы. Всегда объявляйте именно динамические массивы.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 09.11.2014 в 19:24.
Utkin вне форума Ответить с цитированием
Старый 09.11.2014, 19:31   #12
Dvach
Новичок
Джуниор
 
Регистрация: 09.11.2014
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Убейте указатели. Объявите динамический массив рекордов и будет Вам счастье.
Я бы рад но я не для себя дерево делаю , это лабораторная работа со строгой формулировкой задания и там нужно реализовать дерево с помощью ненавистных указателей. Прочитайте, пожалуйста, задание если вы этого еще не сделали.
Цитата:
Сообщение от Utkin Посмотреть сообщение
Можете. Вы же знаете когда возникнет операция добавления узла. Тогда и вызываете свой SetLength. Такой вот ручной конструктор.
Смотрите, два возможных варианта:
Код HTML:
New(current);
SetLenght(current^.child, 5);
ошибка
Код HTML:
SetLenght(current^.child, 5);
New(current);
(это вообще глупость, понимаю)
естественно тоже ошибка и не важно в какую процедуру я это запихну. Возможно я сильно туплю, не могли бы вы показать код примерной реализации?
Узел добавляеться при выделении на него памяти, но в процедуру New нельзя запихнуть еще что то кроме указателя, не понятно как реализовать этот ручной конструктор.

Последний раз редактировалось Dvach; 09.11.2014 в 19:37.
Dvach вне форума Ответить с цитированием
Старый 09.11.2014, 19:42   #13
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Вы получаете указатель на рекорд, а пытаетесь изменить размер массива. Попробуйте получить указатель на массив (нет делфи под рукой чтобы проверить).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 09.11.2014, 19:48   #14
Dvach
Новичок
Джуниор
 
Регистрация: 09.11.2014
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Вы получаете указатель на рекорд, а пытаетесь изменить размер массива. Попробуйте получить указатель на массив (нет делфи под рукой чтобы проверить).
Вы предлагаете получить указатель на массив не используя указатель на рекорд? но как это сделать если массив принадлежит рекорду.

Последний раз редактировалось Dvach; 09.11.2014 в 20:04.
Dvach вне форума Ответить с цитированием
Старый 09.11.2014, 19:56   #15
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
с помощью ненавистных указателей. Прочитайте, пожалуйста, задание если вы этого еще не сделали.
Тогда я тебя разочарую. Array of <чето> к указателям относится как Йежик к Бабе Яге. Оба млекопитающиеся, но не более.
А можешь полностью текст задания выложить. Какая-то нисрастуха получается.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.11.2014, 20:01   #16
Dvach
Новичок
Джуниор
 
Регистрация: 09.11.2014
Сообщений: 12
По умолчанию

Смысл думаю понятен. Массив относиться к конкретному рекорду. И у каждого нового он должен быть свой ( со своим набором указателей на наследников)
Задание уже кидал, вот:
Каждая вершина содержит следующие поля:
- поле данных;
- поле, в котором указано число координирующих вспомагательных полей;
- вспомагательное поле, содержащее указатель на вершину более высокого уровня (предыдущую вершину). Для корневой вершины в него заносится значение NIL;
- вспомагательные поля, содержащие указатели на вершины нижнего уровня (у листьев - отсутствуют).
Если с текущей вершиной не связаны вершины нижнего уровня, то соответствующие вспомагательные поля отсутствуют

И вот схема дерева: http://pixs.ru/showimage/shemapng_2013252_14653489.png
Ссылки на файлообменник разрешены? могу кинуть docx файл.

Последний раз редактировалось Dvach; 09.11.2014 в 20:15.
Dvach вне форума Ответить с цитированием
Старый 09.11.2014, 20:56   #17
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Не понял беды. В делфи это работает
Код:
var BeginNode: NodePointer;
...
  New(BeginNode);
  SetLength(BeginNode^.child,2);
  for i:=0 to High(BeginNode^.child) do New(BeginNode^.child[i]);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 09.11.2014 в 20:59.
Аватар вне форума Ответить с цитированием
Старый 09.11.2014, 21:01   #18
Dvach
Новичок
Джуниор
 
Регистрация: 09.11.2014
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Не понял беды. В делфи это работает
Код:
var BeginNode: NodePointer;
...
  New(BeginNode);
  SetLength(BeginNode^.child,2);
  for i:=0 to High(BeginNode^.child) do New(BeginNode^.child[i]);
странно. В АВС паскале и Free Pascal это не работает..
в АВС выдает ошибку на строчке выделения памяти под указатель на рекорд:
"Ошибка времени выполнения: Невозможно упаковать тип "ByProCoder.Node" как неуправляемую структуру; невозможно вычислить размер или смещение, имеющие смысл."
Во Free Pascal вообще ругается на синтаксис в этой строчке child : array of NodePointer;

Последний раз редактировалось Dvach; 09.11.2014 в 21:03.
Dvach вне форума Ответить с цитированием
Старый 09.11.2014, 21:08   #19
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Значит там не поддерживается такой вариант выделения памяти
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.11.2014, 21:09   #20
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ерунда какая-то а не задание... Что-то тут не так.
Цитата:
Во Free Pascal вообще ругается на синтаксис в этой строчке child : array of NodePointer;
И какой текст ошибки?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дерево на C# No_Comments Помощь студентам 8 26.04.2013 21:22
Дерево Тюха Visual C++ 0 23.05.2011 18:50
Я дерево Кукла_колдуна Паскаль, Turbo Pascal, PascalABC.NET 0 20.03.2011 23:07
Дерево Ikram Помощь студентам 0 05.05.2010 19:42
дерево С# Natok Помощь студентам 0 14.09.2009 23:42