Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
9 / 9 / 4
Регистрация: 14.07.2012
Сообщений: 106

Попытка разыменовать нулевой указатель

11.05.2013, 20:30. Показов 3601. Ответов 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
program BinTree;
 
uses Tree;
 
var
  TheRoot: PNode;
 
begin
  Init(TheRoot);
  MakeRoot(TheRoot, 7);
  { Левое поддерево }
  AppendLeft(TheRoot, 4);
  AppendLeft(TheRoot^.Left, 2);
  AppendRight(TheRoot^.Left, 3);
  AppendRight(TheRoot^.Left^.Right, 1);
  AppendLeft(TheRoot^.Left^.Right^.Right, 0);
  { Правое поддерево }
  AppendRight(TheRoot, 9);
  AppendLeft(TheRoot^.Right, 10);
  AppendLeft(TheRoot^.Right^.Left, 11);
  AppendRight(TheRoot^.Right, 12);
  { Обходы дерева }
 
  { Добавление/Удаление значений }
 
  { Удаляем дерево }
  DestroyTree(TheRoot);
end.
Модуль:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
unit Tree;
 
interface
 
type
  TInfo = integer;
  PNode = ^TNode;
  TNode = record
    Info: TInfo;
    Left, Right: PNode;
  end;
 
function Init(TheRoot: PNode): PNode;
Procedure MakeRoot(TheRoot: PNode; E: TInfo);
Procedure AppendLeft(L: PNode; E: TInfo);
Procedure AppendRight(R: PNode; E: TInfo);
Procedure DestroyTree(Root: PNode);
 
//-------------Обходы-------------//
 
Procedure PreOrder(Root: PNode);
{ Прямой }
 
Procedure PostOrder(Root: PNode);
{ Обратный }
 
Procedure ReverseOrder(Root: PNode);
{ Концевой }
 
//--------------------------------//
 
implementation
 
function Init(TheRoot:PNode): PNode;
begin
  Result :=  NiL;
end;
 
procedure MakeRoot(TheRoot: PNode; E: TInfo);
begin
  New(TheRoot);
  TheRoot^.Info := E;
  TheRoot^.Left := NiL;
  TheRoot^.Right := NiL;
end;
 
Procedure AppendLeft(L: PNode; E: TInfo);
var
  N: PNode;
begin
  New(N);
  N^.Info := E;
  N^.Left := Nil;
  N^.Right := Nil;
  L^.Left := N;
end;
 
Procedure AppendRight(R: PNode; E: TInfo);
var
  N: PNode;
begin
  New(N);
  N^.Info := E;
  N^.Left := Nil;
  N^.Right := Nil;
  R^.Right := N;
end;
 
Procedure DestroyTree(Root: PNode);
var
  L, R: PNode;
begin
  if Root = Nil then
    Exit;
  L := Root^.Left;
  R := Root^.Right;
  Dispose(Root);
  DestroyTree(L);
  DestroyTree(R);
end;
 
//-------------Обходы-------------//
 
Procedure PreOrder(Root: PNode);
{ Прямой }
begin
  if Root = Nil then
    Exit;
  Write(Root^.Info);
  PostOrder(Root^.Left);
  PostOrder(Root^.Right);
end;
 
Procedure PostOrder(Root: PNode);
{ Обратный }
begin
  if Root = Nil then
    Exit;
  PostOrder(Root^.Left);
  Write(Root^.Info);
  PostOrder(Root^.Right);
end;
 
Procedure ReverseOrder(Root: PNode);
{ Концевой }
begin
  if Root = Nil then
    Exit;
  PostOrder(Root^.Left);
  PostOrder(Root^.Right);
  Write(Root^.Info);
end;
 
//--------------------------------//
 
end.
В итоге получаю ошибку которая в заголвке(строка 55 в модуле).
Можете объяснить в чем ошибка?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.05.2013, 20:30
Ответы с готовыми решениями:

Попытка разыменовать нулевой указатель
program triangl_var6; uses graphABC; const n=8; type TListPoints = ^TNodePoint; //указатель на TNodePoint = record ...

Ошибка: попытка разыменовать нулевой указатель
Прошу помоч. Написал прогу для такой задачки :" Все числа, упоминаемые в задачах данной группы, являются целыми. Все указатели имеют тип...

Разыменовать указатель
Пишу класс Train, и сейчас подсчитываю количество пассажиров. Создал указатель суммирования, доступился через цикл к количеству пассажиров...

3
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
11.05.2013, 21:27
Как минимум надо вот тут:
Pascal
1
procedure MakeRoot(TheRoot: PNode; E: TInfo);
описать параметр TheRoot, как передаваемый по ссылке (Var-параметр), иначе его изменение внутри процедуры не передается в вызывающую программу.
1
9 / 9 / 4
Регистрация: 14.07.2012
Сообщений: 106
11.05.2013, 22:28  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Как минимум надо вот тут:
Pascal
1
procedure MakeRoot(TheRoot: PNode; E: TInfo);
описать параметр TheRoot, как передаваемый по ссылке (Var-параметр), иначе его изменение внутри процедуры не передается в вызывающую программу.
Понятно, спасибо.
А я то думал, что когда работаешь с указателями, этого можно не делать.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
12.05.2013, 01:34
Лучший ответ Сообщение было отмечено volvo как решение

Решение

Смотри: если у тебя есть
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
type
   PR = ^R;
   R =
   record
      data : integer;
   end;
 
procedure change(a : PR);
begin
   a^.data := 777;
end;
 
var
   a : PR;
 
begin
   new(a);
   a^.data := 10;
   change(a);
   writeln(a^.data);
   dispose(a);
end.
, то вариант Change без var-параметра отработает. Значение поля Data будет изменено. При этом само значение A остается неизменным, изменяется только область, на которую A указывает. Но если тебе надо изменить сам указатель (что как раз и надо коде из первого поста, ведь там память выделяется внутри процедуры, и надо из нее вернуть указатель на выделенную область), то нужен Var-параметр.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.05.2013, 01:34
Помогаю со студенческими работами здесь

Не удается разыменовать указатель на объект класса
Добрый день, знатоки c++. Пишу программу, уровень знаний базовый. Нуждаюсь в совете профессионалов. Создал класс node. ClassNode.h: ...

Ошибка при попытке разыменовать указатель, который размещен в динамической памяти другим процессом
Доброго времени суток. Есть родительский процесс, он запускает через createProcess дочерний процесс, передавая ему в командной строке...

Нулевой указатель
Всем привет. Возникли вот такие вопросы: Допустим, есть код: char *a = new char(5); В каких пределах будет находиться a? Т.е....

Нулевой указатель
Что происхот при: int* p = NULL; cout << *p; Другими словами, на что ссылается нулевой указатель? Компилятор ошибок не...

Нулевой указатель на функцию
Всем привет. Ещё раз подыму предыдущую тему. Я делаю упражнение на явное связывание dll. Проблема состоит вот в чем. Я кладу библиотеку в...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru