Форум программистов, компьютерный форум, киберфорум
Наши страницы

Lazarus

Войти
Регистрация
Восстановить пароль
 
Hretgir
201 / 75 / 2
Регистрация: 25.01.2012
Сообщений: 2,767
Записей в блоге: 20
#1

По массивам - Lazarus

26.12.2016, 15:16. Просмотров 346. Ответов 6
Метки нет (Все метки)

Возникла проблема:
В ходе написания программы удобно использовать локальные переменные - они помогают ориентироваться в чтении программы (когда имя одно - ты знаешь что содержит эта переменная или массив).
В общем надо как-то инициализировать массивы при объявлении в процедурах.
в глобальных переменных и типах есть это
Pascal
1
2
type tproc = procedure is nested;/////////////////////////////////////////////
  arr = array of TProc;
но последующее объявление в процедуре выдает ошибку
Pascal
1
arr1: arr[6]=(@snulya,@spervogo,@svtorogo,@stretiego,@schetvyortogo,@spyatogo);
как это сделать правильно? подскажите. в учебниках именно такого нет.

Добавлено через 3 минуты
Прошу прощения, нашёл
Pascal
1
2
3
procedure TForm1.filteringByY;
const
  arr : array[1 .. 3] of TProc =  (@smaller, @average, @bigger);
Добавлено через 5 минут
Но выдает ошибку.
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
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
 procedure TForm1.vyvedetTablicu;//выведет таблицу
 
procedure snulya;
var
counter1, counter2,counter1R, counter2R, y : integer;
begin
counter1R:= high(arraygrid);
 with StringGrid1 do
  begin
  y:=2;
  ColCount :=counter1R+2;
  RowCount :=y;
  end;
for counter1:=0 to counter1R do  // заполнять ячейкм
 begin
 counter2R := high(arraygrid[counter1]);
 StringGrid1.Cells[counter1+1,0]:=IntToStr(counter2R+1);
  if y<counter2R+2 then
 y:=counter2R+2;
 with StringGrid1 do
  begin
  RowCount :=y;
 end;
 for counter2:=0 to counter2R do
 begin
 with StringGrid1 do
  begin
 StringGrid1.Cells[counter1+1,counter2+1]:=IntToStr(length(arraygrid[counter1,counter2]));//////////////////////////////////////////////
 //Writeln(izmerenie[0],'=izmerenie[0]; ', counter1,'=counter1; ',counter2,'=counter2');////////////////////////////////////////////////////////////////////
  end;
 end;
end;
end;
procedure spervogo;
var
counter1, counter2,counter1R, counter2R, y : integer;
begin
 counter1R:= high(arraygrid[izmerenie[0]]);
 with StringGrid1 do
  begin
  y:=2;
  ColCount :=counter1R+2;
  RowCount :=y;
  end;
 for counter1:=0 to counter1R do  // заполнять ячейкм
 begin
 counter2R := high(arraygrid[izmerenie[0],counter1]);
 StringGrid1.Cells[counter1+1,0]:=IntToStr(counter2R+1);
 if y<counter2R+2 then
 y:=counter2R+2;
 begin
 with StringGrid1 do
  begin
  RowCount :=y;
  end;
 end;
 for counter2:=0 to counter2R do
 begin
 with StringGrid1 do
  begin
 StringGrid1.Cells[counter1+1,counter2+1]:=IntToStr(length(arraygrid[izmerenie[0], counter1,counter2]));
  end;
 end;
 end;/////////////////////////////////////////////
 end;
procedure svtorogo;
var
counter1, counter2,counter1R, counter2R, y : integer;
begin
counter1R := high(arraygrid[izmerenie[0],izmerenie[1]]);
with StringGrid1 do
  begin
  y:=2;
    ColCount :=counter1R+2;
    RowCount :=y;
  end;
for counter1:=0 to counter1R do  // заполнять ячейкм
begin
counter2R :=  high(arraygrid[izmerenie[0],izmerenie[1],counter1]);
StringGrid1.Cells[counter1+1,0]:=IntToStr(counter2R+1);
 if y<counter2R+2 then
   y:=counter2R+2;
 begin
 with StringGrid1 do
  begin
  RowCount :=y;
  end;
 end;
for counter2:=0 to counter2R do
begin
with StringGrid1 do
 begin
StringGrid1.Cells[counter1+1,counter2+1]:=IntToStr(length(arraygrid[izmerenie[0],izmerenie[1], counter1,counter2]));
end;
end;
end;
end;
 
procedure stretiego;
var
counter1, counter2,counter1R, counter2R, y : integer;
begin
counter1R := high(arraygrid[izmerenie[0],izmerenie[1],izmerenie[2]]);
with StringGrid1 do
  begin
   y:=2;
    ColCount :=counter1R+2;
    RowCount :=y;
  end;
for counter1:=0 to counter1R do  // заполнять ячейкм
begin
counter2R := high(arraygrid[izmerenie[0],izmerenie[1],izmerenie[2],counter1]);
StringGrid1.Cells[counter1+1,0]:=IntToStr(counter2R+1);
 if y<counter2R+2 then   y:=counter2R+2;
 begin
 with StringGrid1 do
  begin
  RowCount :=y;
  end;
 end;
for counter2:=0 to counter2R do
begin
with StringGrid1 do
 begin
StringGrid1.Cells[counter1+1,counter2+1]:=IntToStr(arraygrid[izmerenie[0],izmerenie[1], izmerenie[2],counter1,counter2]);
end;
end;
end;
end;
procedure schetvyortogo;
var
counter1, counter2,counter1R, counter2R, y : integer;
begin
counter1R := high(arraygrid[izmerenie[0],izmerenie[1],izmerenie[2],izmerenie[3]]);
with StringGrid1 do
  begin
  ColCount :=counter1R+2;
  RowCount :=2;
  end;
for counter1:=1 to counter1R do  // заполнять ячейкм
begin
with StringGrid1 do
 begin
StringGrid1.Cells[counter1+1,2]:=IntToStr(arraygrid[izmerenie[0],izmerenie[1],izmerenie[2],izmerenie[3], counter1]);
end;
end;
//end;
// writeln(UTF8ToConsole('это данные, таблица не выводится'));
end;
procedure spyatogo;
begin
//writeln(UTF8ToConsole('это данные, таблица не выводится'));
end;
 type tproc = procedure is nested;
 const
   arr1: array[1 .. 6] of TProc=(@snulya,@spervogo,@svtorogo,@stretiego,@schetvyortogo,@spyatogo);
begin
case navigation of
  0: Image1.Picture.loadfromfile('spervogo.jpg');
  1: Image1.Picture.loadfromfile('svtorogo.jpg');
  2: Image1.Picture.loadfromfile('stretiego.jpg');
  3: Image1.Picture.loadfromfile('schetvjortogo.jpg');
  4: Image1.Picture.loadfromfile('spjatogo.jpg');
  end;
// SetLength(arr1,6);
//arr1[0]:=@snulya;
//arr1[1]:=@spervogo;
//arr1[2]:=@svtorogo;
//arr1[3]:=@stretiego;
//arr1[4]:=@schetvyortogo;
//arr1[5]:=@spyatogo;
arr1[navigation];
end;
как её обойти? в строке 156
вот эта запись имеется и в глобальных переменных и типах
Pascal
1
2
type tproc = procedure is nested;/////////////////////////////////////////////
  arr = array of TProc;
Добавлено через 34 минуты
Или в такой последовательности нельзя?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.12.2016, 15:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос По массивам (Lazarus):

По массивам процедур - Lazarus
Если я в переменных программы объявлю массив процедур, то могу-ли я использовать его позднее как тип? То-есть, в процедуре объявляю...

задачи по массивам - Delphi
привет всем!!! помогите!!! мне надо решить задачи по делфи. Если сможите, помогите пожалуйста!!! 1) Создайте два одномерных...

По массивам... - C++
Задан случайный массив. Нужно получить без повторений элементы, встречающиеся в массиве более одного раза. Вот что получилось: ...

По массивам.... - C++
Добрый вечер:).На носу итоговая сессия, к сожалению для допуска на нее не могу справится с заданием который дал мне преподаватель (по...

по массивам - C++
Для одномерного массива, состоящего из n вещественных чисел: а) найти минимальный по модулю элемент массива; б) вычислить сумму...

Лабораторная по массивам - C++
Дан одномерный массив А, состоящий из N элементов. Переписать в одномерный массив В все элементы, заключенные между максимальным и...

6
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
24114 / 16095 / 4896
Регистрация: 22.10.2011
Сообщений: 28,536
Записей в блоге: 5
26.12.2016, 16:32 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Так - нельзя:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{$modeswitch nestedprocvars}
procedure p;
 
  procedure p1;
  begin
  end;
  procedure p2;
  begin
  end;
 
type
  tproc = procedure is nested;
var
  arr : array[1 .. 2] of tproc = (@p1, @p2);
 
begin
end;
 
begin
  p;
end.
Так - можно:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{$modeswitch nestedprocvars}
procedure p;
 
  procedure p1;
  begin
  end;
  procedure p2;
  begin
  end;
 
type
  tproc = procedure is nested;
var
  arr : array[1 .. 2] of tproc;
 
begin
  arr[1] := @p1;
  arr[2] := @p2;
end;
 
begin
  p;
end.
Чувствуешь разницу?
1
Hretgir
201 / 75 / 2
Регистрация: 25.01.2012
Сообщений: 2,767
Записей в блоге: 20
27.12.2016, 14:09  [ТС] #3
я всё понял, просто надо процедуры, которые нужно занести в массив при инициализации, вынести за пределы процедуры в которой работает массив.

Добавлено через 4 часа 13 минут
и вообще, я так понял, что организация программы должна быть несколько иной чем у меня. сейчас переструктурирую её.
0
Hretgir
201 / 75 / 2
Регистрация: 25.01.2012
Сообщений: 2,767
Записей в блоге: 20
29.12.2016, 15:13  [ТС] #4
Сделал, выбрал структуру, теперь вообще весь процесс представляется намного проще и код визуабельнее значительно становится, с которым работаю.
0
Hretgir
201 / 75 / 2
Регистрация: 25.01.2012
Сообщений: 2,767
Записей в блоге: 20
28.01.2017, 19:17  [ТС] #5
volvo, можно объяснить зачем два блока begin...end; в приведённом коде?
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure p;
 
  procedure p1;
  begin
  end;
  procedure p2;
  begin
  end;
 
type
  tproc = procedure is nested;
var
  arr : array[1 .. 2] of tproc;
 
begin
  arr[1] := @p1;
  arr[2] := @p2;
end;
 
begin
  p;
end.
это влияет как-то на программу, как если-бы этот блок был один?
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure p;
 
  procedure p1;
  begin
  end;
  procedure p2;
  begin
  end;
 
type
  tproc = procedure is nested;
var
  arr : array[1 .. 2] of tproc;
 
begin
  arr[1] := @p1;
  arr[2] := @p2;
  p;
end.
или это просто для наглядности какой-то?
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
24114 / 16095 / 4896
Регистрация: 22.10.2011
Сообщений: 28,536
Записей в блоге: 5
28.01.2017, 19:48 #6
Цитата Сообщение от Hretgir Посмотреть сообщение
зачем два блока begin...end; в приведённом коде?
Первый блок - тело процедуры p, второй - основной блок программы.

Добавлено через 49 секунд
Цитата Сообщение от Hretgir Посмотреть сообщение
это влияет как-то на программу, как если-бы этот блок был один?
Да. Твоя программа просто не будет компилироваться. Это достаточно веская причина не искать недочетов в моем коде?
1
Hretgir
201 / 75 / 2
Регистрация: 25.01.2012
Сообщений: 2,767
Записей в блоге: 20
28.01.2017, 23:25  [ТС] #7
Цитата Сообщение от volvo Посмотреть сообщение
Это достаточно веская причина не искать недочетов в моем коде?
я не ищу недочёты, я смотрю как мне удобнее можно применить этот пример.

Добавлено через 1 час 12 минут
Кажется придумал, нужно сделать процедуру, которая в первом прогоне заполняет массив процедур описанных рядом с ней, а во всех остальных выполнениях процедуры её содержащей - игнорируется. но как это сделать без счётчика...ну так-то есть вариант...

Добавлено через 9 минут
Просто при вызове процедуры в первый раз она заполнит все ячейки массива своих процедур с помощью процедуры в ней и из неё-же вызовется, а потом эта процедура в ней будет всегда обходится. Я потом приведу код.

Добавлено через 2 часа 0 минут
Я ищу своё, я не ищу недостатков в чужом коде, извиняюсь за повтор.
Итак вот код:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure p;
  procedure p1;
  begin
  end;
  procedure p2;
  begin
  end;
 type
  tproc = procedure is nested;
var
  arr : array[1 .. 2] of tproc;
begin
  arr[1] := @p1;
  arr[2] := @p2;
end;
 
begin
  p;
end.
я понимаю, что он был приведён в ответ на мой вопрос, но он ведь равнозначен такому коду
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure p;
 type
  tproc = procedure is nested;
var
  arr : array[1 .. 2] of tproc;
  procedure p1;
  begin
  end;
  procedure p2;
  begin
  end;
 
begin
  arr[1] := @p1;
  arr[2] := @p2;
end;
 
begin
  p;
end.
?
Но даже и это не то, он равнозначен. Мне надо не так, я постараюсь найти способ как это написать.
0
28.01.2017, 23:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2017, 23:25
Привет! Вот еще темы с ответами:

Задачи по массивам - JavaScript
Здравствуйте! Помогите пожалуйста сделать задачки по JavaScript, с использованием класса array. 1) Нaйти сумму элeмeнтов мaссивa...

Задача по массивам - C++
Помогите пожалуйста с задачей на с++ Количество студентов N=40. Имена студентов-символьный массив Nam. Каждый элемент-буква,код...

Программы по массивам - Pascal
21 Дан массив, содержащий как положительные, так и отрицательные числа. Сформировать массив, содержащий только элементы исходного массива,...

Поиск по массивам - C++ Builder
{ FILE* store = fopen(&quot;store.txt&quot;, &quot;a&quot;); for (i=1;i&lt;n;i++) for (j=1;j&lt;c;j++) { fscanf(store, &quot;%d,%d-%d-%d-%d;&quot;,&amp;i,&amp;j,&amp;A,&amp;C,&amp;B); ...


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

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

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