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

Каким образом использовать глобальные переменные в процедурах?

23.11.2015, 18:27. Показов 2081. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Собственно проблема, создаю процедуру, в которой ссылаюсь на глобальные переменные. У меня создаются множества- a,b и мне необходимо получить их симметрическую разность, в головной программе все работает, но пытаюсь написать процедуру , получаю ошибку об отсутствии актуальных параметров. Как тут быть? Как сделать так, чтобы в процедуре я ссылался на множества из основной программы?
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
program PSet;
 
{$APPTYPE CONSOLE}
 
 
uses
  SysUtils,
  Unit1;
 
var
  el: TItem;
  a, b, c,x,y: TSet;
  h, z: longint;
BEGIN
  el := TItem.Create;
  writeln('Pokajem rabotu classa TSet: ');
  a := TSet.Create;
  b := TSet.Create;
  c := TSet.Create;
   x := TSet.Create;
    y := TSet.Create;
  writeln('Pokajem rabotu operacii AddItem, Get Mem, Members: ');
  writeln('Vvedite 4 znacheniya v spisok: ');
  readln(z);
  a.AddItem(z);
  readln(z);
  a.AddItem(z);
  readln(z);
  a.AddItem(z);
  readln(z);
  a.AddItem(z);
  for h:=0 to a.Members-1 do
     writeln(h, ': ', a.Item[h]);
     writeln('Vvedite 4 znacheniya v spisok: ');
readln(z);
b.AddItem(z);
readln(z);
b.AddItem(z);
readln(z);
b.AddItem(z);
readln(z);
b.AddItem(z);
{  writeln('Pokajem rabotu operacii IsEmpty: ');
  writeln(b.IsEmpty);
  writeln(a.IsEmpty);
  writeln('Pokajem rabotu svoistva Item: ');
   for h:=0 to a.Members-1 do
     writeln(h, ': ', a.Item[h]);    }
 
writeln('Pokajem rabotu operacii Sub: ');
writeln('a - b: ', a.Sub(b).List);
 
 
writeln('Pokajem rabotu operacii Sub: ');
writeln('b - a: ', b.Sub(a).List);
 
// x :=b.Sub(a);
// y :=a.Sub(b);
 
 
 
 
 writeln('Pokajem rabotu operacii SIMMA: ');
//  writeln(x.AddSet(y).List);
 
 // c := x.AddSet(y);
writeln('simmetrraznost: ', c.SIMA);
 { writeln('Pokajem rabotu operacii RemItem: ');
  writeln('Vvedite 4 znacheniya v spisok: ');
  readln(z);
  b.RemItem(z);
  readln(z);
  b.RemItem(z);
  readln(z);
  b.RemItem(z);
  readln(z);
  b.RemItem(z);
  writeln('b: ', b.List);
  writeln('Pokajem rabotu operacii Empty: ');
  b.Empty;
  writeln('b: ', b.List);
  writeln('a before Empty: ', a.List);
  a.Empty;
  writeln('a after Empty: ', a.List);
  writeln('Pokajem rabotu operacii Sub: ');
  writeln('c - b: ', c.Sub(b).List);
  writeln('b - c: ', b.Sub(c).List);
  writeln('Vvedite 4 znacheniya v spisok: ');
  readln(z);
  b.AddItem(z);
  readln(z);
  b.AddItem(z);
  readln(z);
  b.AddItem(z);
  readln(z);
  b.AddItem(z);
  writeln('b: ', b.List);
  writeln('c: ', c.List);
  writeln('c - b: ', c.Sub(b).List);
  writeln('c ', c.List);
  writeln('Pokajem rabotu operacii Mul: ');
  writeln('c * a: ', c.Mul(a).List);
  writeln('a * c: ', b.Mul(a).List);
  writeln('s3 ', c.List);
  writeln('b ', b.List);
  writeln('b * c', b.Mul(c).List);
  writeln('c * b', c.Mul(b).List);     }
  el.Free;
  a.Free;
  b.Free;
  c.Free;
 readln;
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
unit Unit1;
 
 
 
interface
 
uses
  Classes, SysUtils;
 
type
//---
ESetEmpty = class (Exception)
{Исключительная ситуация, возникающая при попытке
выполнить некоторые операции на пустом множестве}
        end;
EIndexOut = class(Exception)
{Исключительная ситуация, возникающая при выходе
индекса за границы допустимого диапазона}
            end;
T = Longint;// Тип элементов множества. Может быть любым простым типом
TItem = class       //Узел списка
   public
    e: T;        //поле со значением элемента множества
    constructor CreateItem(a: T);
        end;
//------------------------------------------------------------------------------
TSet = class(TList)
 private
    function    GetMem: Longint;
//Операция Элементов. Возвращает число элементов во множестве
    function    ReadItem(i: Longint): T;
    function    InSetInd(a: T; var j: Longint): Boolean;
{Возвращает True и индекс элемента, если заданный элемент
принадлежит множеству, False в противном случае}
    function    GetSet: String;
//Операция МножествоВСтроку. Формирует строку
 public
    procedure   AddItem(a: T);
//Операция Добавить. Включает заданный элемент во множество
    procedure   RemItem(a: T);
//Операция Удалить. Удаляет заданный элемент из множества
    function    IsEmpty: Boolean;
{Операция Пусто. Возвращает True, если множество пусто,
False в противном случае}
    function    InSet(a: T): Boolean;
{Операция Принадлежит. Возвращает True, если заданный
элемент принадлежит множеству, False в противном случае}
    function    AddSet(b: TSet): TSet;
{Операция Объединить. Создаёт множество, полученное объединением
элементов двух множеств}
    function    SIMA(c: TSet): TSet;
    function    Sub(b: TSet): TSet;
{Операция Вычесть. Создаёт множество, полученное вычитанием
из одного множества другого}
    function    Mul(b: TSet): TSet;
{Операция Умножить. Создаёт множество, полученное путём
пересечения двух множеств}
   //  function mmm(b:Tset):Tset;
    procedure   Empty;
//Операция Опустошить. Удаляет из множества все элементы
    property    Members: Longint read GetMem;
//Операция Элементов. Подсчитывает и возвращает количество элементов во множестве.
    property    Item[i: Longint]: T read ReadItem; default;
//Операция Элемент. Возвращает элемент множества с индексом i
    property    List: String read GetSet;
//Операция МножествоВСтроку. Формирует строку из элементов множества
    destructor  Destroy; override;
  end;
 
 
implementation
 
constructor TItem.CreateItem(a: T); //конструктор элемента множества
 
begin
  self.e:= a;
end;
//------------------------------------------------------------------------------
function TSet.GetMem: Longint;
//Операция Элементов. Возвращает число элементов в множестве
begin
  result:=self.Count;
end;
//------------------------------------------------------------------------------
function TSet.ReadItem(i: Longint): T;
//Возвращает значение элемента с индексом i
begin
  if self.Members=0 then raise ESetEmpty.Create('Множество пустое');
  if (i<0) or (i>self.Members-1) then raise EIndexOut.Create('Индекс вышел из допустимого диапазона.');
  result:=TItem(self.Items[i]).e; //приведение указателя Pointer к типу TItem
//используеся метод Items класс TList
end;
//------------------------------------------------------------------------------
function TSet.InSetInd(a: T; var j: Longint): Boolean;
{Возвращает True и индекс элемента, если заданный элемент
принадлежит множеству, False в противном случае}
var i: longint;
begin
  result:=false;
  for i:=0 to self.Count-1 do
   if self.Item[i]=a //Если элемент множества равен заданному числу
    then begin
          result:= True;
          j:=i;
          exit;
         end;
   j:=-1;//Если не нашли нужный элемент, индекс -1
end;
//------------------------------------------------------------------------------
function TSet.GetSet: string;
//Операция МножествоВСтроку. Формирует строку из элементов множества.
var i: Integer;
begin
  result:='Length: ' + IntToStr(Members);
  if not self.IsEmpty
   then
     begin
       result:=result + ' Members: ';
       for i:=0 to self.Members-1 do result:=result+IntToStr(self.Item[i])+'| ';
     end;
end;
//------------------------------------------------------------------------------
procedure TSet.AddItem(a: T);
var
  j: longint;
begin
 if not self.InSetInd(a, j) then self.Add(TItem.CreateItem(a));
end;
 
 
 
//------------------------------------------------------------------------------
procedure TSet.RemItem(a: T);
var
  j: longint;
begin
  if self.InSetInd(a, j) then
    begin
      TItem(self.Items[j]).Free;  //Освобождаем память из-под элемента множества
      self.Delete(j);         //Delete метод класса Tlist (удаляем элемент из списка)
    end;
end;
//------------------------------------------------------------------------------
function TSet.IsEmpty: Boolean;
begin
  if self.Members=0 then result:=true else result:=false;
end;
//------------------------------------------------------------------------------
function TSet.InSet(a: T): Boolean;
var
  j: longint;
begin
  if self.InSetInd(a, j) then result:=true else result:=false;
end;
//------------------------------------------------------------------------------
function TSet.AddSet(b: TSet): TSet;
var
  i: longint;
begin
  result:=TSet.Create;
  if self.IsEmpty and b.IsEmpty then exit;
  if self.IsEmpty then begin result:=b; exit; end;
  if b.IsEmpty then begin result:=self; exit; end;
  for i:= 0 to self.Members-1 do result.AddItem(self.Item[i]);
  for i:= 0 to b.Members-1 do
  if not result.InSet(b.Item[i]) then result.AddItem(b.Item[i]);
end;
 
function TSet.SIMA(c: TSet): Tset;
var
x,y,a,b: TSet;
begin
x :=b.Sub(a);
y :=a.Sub(b);
result:=x.AddSet(y);
 
end;
 
 
 
 
 
 
 
//------------------------------------------------------------------------------
function TSet.Sub(b: TSet): TSet;
var
  i: longint;
begin
  result:=TSet.Create;
  if self.IsEmpty or b.IsEmpty then begin result:=self;  exit; end;
  for i:=0 to self.Members-1 do
    if not b.InSet(self.Item[i]) then result.AddItem(self.Item[i]);
end;
 
 
 
 
 
//------------------------------------------------------------------------------
function TSet.Mul(b: TSet): TSet;
var
  i: longint;
begin
  result:= TSet.Create;
  if self.IsEmpty or b.IsEmpty then exit;
  for i:=0 to self.Members-1 do
      if b.InSet(self.Item[i]) then result.AddItem(self.Item[i]);
end;
//------------------------------------------------------------------------------
procedure TSet.Empty;
var
  i: longint;
begin
    for i:= self.Members-1 downto 0 do
    self.RemItem(Item[i]);
    self.Clear;  //удаление всех элементов списка, счётчик Count = 0
end;
//------------------------------------------------------------------------------
destructor TSet.Destroy;
begin
  if not self.IsEmpty then self.Empty;
end;
//------------------------------------------------------------------------------
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.11.2015, 18:27
Ответы с готовыми решениями:

Каким образом можно перехватывать глобальные нажатия клавиш на экране блокировки?
ДД! Прошу подскажите, нужно перехватывать глобально нажатия клавиш на локскрине, было написано...

Переменные в процедурах
есть допустим Procedure (a,b : integer); Чтобы вызвать эту процедуру надо procedure ( и тут 2...

Глобальные переменные
Глобальные переменные вроде как инициализируются нулевыми значениями. Даже в хелпе написано: &quot;If...

Глобальные переменные
Если я в файле проекта создам раздел var и там напишу переменные, могу ли я их использовать в...

9
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
23.11.2015, 19:25 2
Цитата Сообщение от yury911 Посмотреть сообщение
получаю ошибку об отсутствии актуальных параметров
Так посчитай и сравни сколько параметров требует метод, а сколько ты ему передаешь.
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
23.11.2015, 20:11 3
Глобальные переменные на то и глобальные, что их не обязательно указывать в параметрах.
0
2 / 2 / 1
Регистрация: 01.10.2014
Сообщений: 66
24.11.2015, 07:17  [ТС] 4
Я понимаю, но тогда как сделать так, чтобы в процедуре выполнялись операции со списком из основной программы? Я там создал список, добавил в него переменные, но не могу сослаться на эти списки в процедуре. Как быть?
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
24.11.2015, 07:21 5
Но если список объявлен как глобальная переменная, то в процедуре с ним будут происходить все указанные действия без указания его в параметрах, типа
Delphi
1
2
3
4
5
6
7
8
var n:integer;
procedure p;
begin
n:=20;
end;
begin
p;
end.
0
2 / 2 / 1
Регистрация: 01.10.2014
Сообщений: 66
24.11.2015, 07:31  [ТС] 6
То есть просто попробовать сделать процедурой, а не функцией
Как то так?
Delphi
1
2
3
4
5
6
Procedure sima;
var x,y: Tset;
Begin
x:=b.sub(a);
y:=a.sub(b);
А как вывести результатом список к которому примеяются  x.Addset(y)??
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
24.11.2015, 07:33 7
Подождите может экстрасенсы подтянутся...
Я например вообще не понимаю что Вы творите, например
Delphi
1
2
3
4
5
6
7
8
9
function TSet.SIMA(c: TSet): Tset;
var
x,y,a,b: TSet;
begin
x :=b.Sub(a);
y :=a.Sub(b);
result:=x.AddSet(y);
 
end;
Для чего параметр c: TSet? Где он используется в функции?
0
2 / 2 / 1
Регистрация: 01.10.2014
Сообщений: 66
24.11.2015, 07:55  [ТС] 8
Так, вроде начинаю понимать. Тут ошибся я, так как функция эта может применяться к любому списку типа TSet, параметр с вообще не нужен, можно ведь функцию и к списку d использовать. Тогда, по сути, поменять нужно лишь пару строк? А описывать а и б , из головной программы в функции нужно? Или нет необходимости?
Если я работаю с ними в функции
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
24.11.2015, 07:58 9
И
Цитата Сообщение от yury911 Посмотреть сообщение
Так, вроде начинаю понимать. Тут ошибся я,
Нужно сначала внимательно прочитать задание, понять что требуется и продумать логику программы и ее составных частей.
0
2 / 2 / 1
Регистрация: 01.10.2014
Сообщений: 66
24.11.2015, 17:18  [ТС] 10
Написал процедуру. Ну не хочет он обрабатывать a,b с основной программы. Undeclared identtifier на переменных a,b
Delphi
1
2
3
4
5
6
7
8
function TSet.SIMA: string;
var
x,y: TSet;
begin
x :=b.Sub(a).List;
y :=a.Sub(b).List;
result:=x.AddSet(y).List;
end;
В программе обращаюсь как
Delphi
1
writeln('simmetrraznost: ', c.SIMA);
Добавлено через 2 часа 55 минут
HELP
0
24.11.2015, 17:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.11.2015, 17:18
Помогаю со студенческими работами здесь

Глобальные переменные
Здравствуйте. Объясните пожалуйста как объявлять глобальные переменные. Спасибо.

Глобальные переменные
Включил глобальные переменные в свойствах проекта(Compatibility-&gt;Allow globals) Программа...

Потоки и глобальные переменные
Здравствуйте, у меня проблема. Я имею глобальный массив из объектов с атрибутами...

while not Eof() + глобальные переменные
Собсно вот в чем проблема... мне надо занести то что в блокноте в масив(с етим проблем нету) и...


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

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