Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
6 / 6 / 3
Регистрация: 02.01.2012
Сообщений: 42
1

Проблема с взаимодействием динамической и статической памяти - обращение к статической переменной

02.01.2012, 17:38. Показов 852. Ответов 3
Метки нет (Все метки)

Здравствуйте!
Помогите решить проблему!
Задача такая: написать сортировку бинарным деревом, так что бы данные читались из текстового файла.
В текстовом файле:
"<имя> <число>"
и таких строчек неограниченное количество (собственно поэтому и нужно бинарное дерево).
Программа у меня написана, но есть проблема с чтением из файла. Я не знаю как обратится из динамической памяти к статической переменной.
Собственно, вот исходник (код):
Pascal
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
type pointer=^pokupka;
pokupka= record
nazv:string;
cena:integer;
left:pointer;
right:pointer;
 
end;
var root,temp:pointer;
c:char;
m:integer;
input,output:text;
i,code: integer;
s: string;
procedure vvod(root,temp:pointer); {здесь идет сортировка деревом}
begin
if ((root^.cena>=temp^.cena) and (root^.left<>nil)) then
vvod(root^.left,temp);
 
if ((root^.cena>=temp^.cena) and (root^.left=nil)) then
root^.left:=temp;
 
if ((root^.cena<temp^.cena) and (root^.right<>nil)) then
vvod(root^.right,temp);
 
if ((root^.cena<temp^.cena) and (root^.right=nil)) then
root^.right:=temp;
end;
 
procedure vuvod(root:pointer); {здесь вывод дерева}
begin
if root^.left<>nil then
vuvod(root^.left);
 
writeln(root^.nazv,' ',root^.cena);
 
if root^.right<>nil then
vuvod(root^.right);
end;
 
begin
new(root);
root:=nil;
i:=0;
assign(input,'nput.txt'); 
assign(output,'output.txt');
reset(input);
rewrite(output);
while not eof(input) do begin
 
repeat
read(input,c);
if c<>' ' then s:=s+c;
until c=' ';
temp^.nazv:=@s; {//////////проблема начинается здесь////////}
read(input,m);
temp^.cena:=m; 
new(temp);
temp^.left:=nil;
temp^.right:=nil;
if root=nil then root:=temp
else vvod(root, temp);
end;
vuvod(root);
end.
 Комментарий модератора 
Теги кода добавлены модератором. По правилам форума, код должен быть оформлен соответствующими тегами. Для оформления кода Pascal следует выделить этот код и на панели редактирования сообщения нажать кнопку: "PASCAL".
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.01.2012, 17:38
Ответы с готовыми решениями:

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

Переменные в статической и динамической памяти!
Народ, подскажите как этот рисунок перевести в программу! тоесть как с помощью программы разместить...

Обращение к статической переменной
Уточните пожалуйста как обратиться к статик переменной ,если её название содержится например в...

Возможно ли обращение к статической памяти функции извне?
Здравствуйте! Возможно ли сделать так? Obj* ptr; void F() { static Obj _obj = { }; ...

3
206 / 183 / 104
Регистрация: 10.01.2011
Сообщений: 302
02.01.2012, 17:58 2
Pascal
1
2
new(root);
 root:=nil;
???????

Цитата Сообщение от Comst95 Посмотреть сообщение
Pascal
1
2
3
4
5
6
temp^.nazv:=@s; {//////////проблема начинается здесь////////}
read(input,m);
temp^.cena:=m; 
new(temp);
temp^.left:=nil;
temp^.right:=nil;
Сначала надо выделить память под объект, а потом инициализировать его
Цитата Сообщение от Comst95 Посмотреть сообщение
Pascal
1
2
3
4
5
6
new(temp);
temp^.nazv:=s; {//////////проблема начинается здесь////////}
read(input,m);
temp^.cena:=m; 
temp^.left:=nil;
temp^.right:=nil;
1
6 / 6 / 3
Регистрация: 02.01.2012
Сообщений: 42
02.01.2012, 18:18  [ТС] 3
Цитата Сообщение от Andyc Посмотреть сообщение
Код Pascal
1
2
new(root);
*root:=nil;
???????
это обнуление корневого элемента дерева
0
206 / 183 / 104
Регистрация: 10.01.2011
Сообщений: 302
02.01.2012, 18:44 4
Pascal
1
new(root);
Этот код выделяет в памяти блок размером в SizeOf(pointer), адрес этого блока содержиться в p
Pascal
1
root:=nil
А этот заносит в p константу nil, тоесть p уже никуда не указывает. А выделенный ранее блок так и "висит", но уже в неизвестности. (Утечка памяти).

Добавлено через 3 минуты
И да, существует встроенный тип Pointer, поэтому, во избежание путаницы, лучше назвать ваш тип по другому.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.01.2012, 18:44

Обращение к статической переменной указав ее как параметр функции
Добрых времени суток. Есть статический класс. public static class DataActions { ...

Как сделать MFC статической, а не динамической?
это всё тоже из серии &quot;Не работает exe файл на других компах&quot; я предлагаю засунуть в эту тему все...

CPT: Настройка статической и динамической маршрутизации
Здравствуйте, первый раз пишу на форум вообще. Мне нужна ваша помощь в настройке статической и...

Заполнение динамической матрицы(дв. массива) аналогично статической
Т.е. простой двумерный массив можно заполнить так: { {0, 0, 0, 0, 0}, {0, 1, 3, 1, 0}, {0, 3,...

В чем отличие статической линковки библиотек от динамической?
В чем отличие статической линковки библиотек от динамической?

Приведите доходчивые примеры статической и динамической типизации
Приведите доходчивые примеры статической и динамической типизации


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

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

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