Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Записи в массивах

11K
13 декабря 2006 года
Salamansar
83 / / 29.11.2006
Здравствуйте всем! У меня такая проблема:
Задан массив, элементами которого являются записи.
Так вот поле записи этого массива не заполняется, почему?

Код:
...
type koords=record
         point:boolean
          c:byte
          poz:boolean
          end;
        ms=array[1..10] of koords;
var m:ms
begin
...
m[1].point:=true; {Почему-то не присваевается}
...
end.
257
13 декабря 2006 года
kosfiz
1.6K / / 18.09.2005
Код:
type koords=record //у тебя что на begin не ругается?
          point:boolean;
          c:byte;
          poz:boolean;
          end;
ms=array[1..10] of koords;
var m:ms;
begin
...
m[1].point:=true;
...
end.
11K
13 декабря 2006 года
Salamansar
83 / / 29.11.2006
Да у меня и без begin стояло, просто я зашился - случайно прилепил. :)
Но все равно не получается.
257
13 декабря 2006 года
kosfiz
1.6K / / 18.09.2005
у меня нормально работает(присваивается). покажи тогда, что в коде делаешь. непонятно почему не получается. ошибку что ли выдает? или просто ты сам как-то определяешь присвоилось true или нет?
11K
13 декабря 2006 года
Salamansar
83 / / 29.11.2006
В том то и дело, что ошибок не выдает, а проверяю через Watch при пошаговом запуске. Если поможет, то вот код процедуры
Код:
...
type koords=record
          point:boolean;
          c:byte;
          napr:boolean;
          end;
ms1=array[1..10] of koords;
ms=array[1..12,1..12] of byte
...

procedure zap(e,h,q,i1:byte;fl:boolean;var m1:ms;m2:ms1);
var r,k,k1:byte
begin
if fl then begin r:=e+2;
        for k:=h to h+1+q do for k1:=e to r do m1[k1,k]:=1;
          for k:=h+1 to h+q do m1[e+1,k]:=2;
else begin r:=h+2
       for k1:=e to e+q+1 do for k:=h to r do m1[k1,k]:=1;
          for k1:=e to e+q do m1[k1,h+1]:=2;
{Вот здесь начинается присваивание полям}
with m2[e,h] do
         begin point:=true;
         c:=q;
         napr:=fl
         end  
end;
257
13 декабря 2006 года
kosfiz
1.6K / / 18.09.2005
а тебя не смущает:
 
Код:
ms1=array[1..10] of koords;
ms=array[1..12,1..12] of byte
...
procedure zap(e,h,q,i1:byte;fl:boolean;var m1:ms;m2:ms1);
.....
with m2[e,h] do
         begin point:=true;
         c:=q;
         napr:=fl;
         end;

или ты опять
[quote=Salamansar]зашился[/quote]?
ты еще кстати пару end'ов пропустил.
и еще я вызвал процедуру для проверки(исправив m2[e,h] на m2[e], уж не знаю как должно быть на самом деле, просто чтобы проверить присваивание) смотрел с помощью Watch: все меняется как надо.
11K
13 декабря 2006 года
Salamansar
83 / / 29.11.2006
Блин, да что ж такое: конечно там должно быть m2:[i1], прости за неудобства.
257
13 декабря 2006 года
kosfiz
1.6K / / 18.09.2005
просмотрел с m2[i1]. процедуру вызывал так:
 
Код:
var a:ms1;b:ms;
...
zap(1,1,1,1,false(потом true),b,a);

нормально присваивается. ты как процедуру вызываешь, с какими параметрами?
11K
13 декабря 2006 года
Salamansar
83 / / 29.11.2006
 
Код:
var x,y,c,l:byte; flag:boolean; m:ms; mm:ms1
...
begin
...
zap(x,y,c,l,flag,m,mm);
...
end.

Меня обнадеживает одно: хоть у тебя все получилось - а то я уже подумал, что нельзя такие массивы применять (я сам в это не верил, ну а вдруг...)

Может быть у меня ошибка вот в чем:
я эти поля ячейки массива использую параметрами для другой процедуры?
257
13 декабря 2006 года
kosfiz
1.6K / / 18.09.2005
приложи архивчик со всем кодом, так проще разобраться будет что? где? и как?.
11K
13 декабря 2006 года
Salamansar
83 / / 29.11.2006
Ну, если тебе и впрямь интересно разбирать мои письмена, то вот он:




P.S. Если влом будет с этим разбираться, то я тебя пойму (сам бывает путаюсь)
257
14 декабря 2006 года
kosfiz
1.6K / / 18.09.2005
я че то с самого начала не обратил внимания - старею. смотри в архиве как надо делать.
11K
14 декабря 2006 года
Salamansar
83 / / 29.11.2006
Как я понял ты заменил локальные переменные на глобальные, так? Если так, то я чего-то непойму - какая разница, по идее оно должно и так, и так работать - не мог бы ты объяснить мне?
257
14 декабря 2006 года
kosfiz
1.6K / / 18.09.2005
изменения параметров функции(процедуры) действительны только в теле функции(процедуры), но не за её пределами. например:
Код:
function test(a:word):boolean;
begin
a:=6;
writeln(a); //выведет 6
test:=true;
end;
...
begin
a:=1;
test(a);
writeln(a); //выведет 1
end.

тоже самое и с массивами в твоем коде, поэтому мы используем глобальные переменные, чтобы изменения сохранились.
11K
14 декабря 2006 года
Salamansar
83 / / 29.11.2006
Но я же задаю в заголовке процедуры var m1 - если я не ошибаюсь, то это означает, что для этих переменных не выделяется новых ячеек памяти - а значит записывается в переменную, которую мы зададим. Разве не так?:confused:
257
14 декабря 2006 года
kosfiz
1.6K / / 18.09.2005
так: можно либо var писать либо глобальные переменные использовать. но var то ты перед m1 поставил, а перед m2 кто его ставить тогда будет, вот я и сделал все так как сам привык: через глобальные переменные. вот строчка из приложенного тобой исходника:
 
Код:
procedure zap(e,h,q,i1:byte; fl:boolean;var m1:ms; m2:ms1);

а так как ты var m2:ms1 не написал, то здесь будет так как я показал в прошлом сообщении, если помнишь, то проблема у тебя как раз с m2 и была.
11K
14 декабря 2006 года
Salamansar
83 / / 29.11.2006
Ах вот оно что - я то думал, что var относится ко всем переменным после него. Ну теперь понятно, и заработало все сразу. :)
СПАСИБО тебе ОГРОМЕННОЕ!!!!


P.S. Я че-то не понял, почему мне не разрешили тебе отзыв добавить?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог