Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Ошибка в памяти при выполнении кода


Автор: digitech 17.11.2007, 23:55
Вот я написал код, который должен выполнять вот такое задание:
Главную диагональ заменить на единицы, выше главной - элементы равны сумме индексов, ниже главной диагонали - разности индексов.
первые два этапа выполняются правильно и вообще выполняются, а вот при выполнении третьего винда пишет, что произошла ошибка в памяти по адресу ....... пропустить / закрыть

Вот исходник:
Код

program diagonal;
uses crt;
const n=7;
var a:array[1..n,1..n] of integer;
i,k,s,g:shortint;

procedure zapoln;
begin
randomize;
for i:=1 to n do
begin
    for k:=1 to n do
    begin
    a[i,k]:=random(100)-random(50);
    end;
end;
end;

procedure vivod;
begin
Writeln('‚лў®¤ ¬ ббЁў  ў ўЁ¤Ґ ¬ ваЁжл');
for i:=1 to n do
begin
    for k:=1 to n do
    begin
    if i=k then textcolor(2) else textcolor(15);
    Write(a[i,k]:5);
    end;
Writeln;
end;
textcolor(15);
end;

procedure ex1;
BEGIN
for i:=1 to n do
a[i,i]:=1;
END;

procedure ex2;
BEGIN
s:=0;
for i:=2 to n do
begin
s:=s+1;
a[i,s]:=i-s;
end;
END;

procedure ex3; {вот при выполнении этой процедуры происходит ошибка и паскаль зависает}
BEGIN
s:=1;
for i:=1 to n do
begin
s:=s+1;
g:=i+s;
a[i,s]:=g; {пробовал и так a[i,s]:=i+s -разницы никакой}
end;
END;

BEGIN
clrscr;
zapoln;
vivod;
ex1;
ex2;
ex3; {подключение процедуры 3}
vivod;
readln;
END.
 

Автор: Ofer 18.11.2007, 00:19
digitech, конечно у тебя в ex3 будет обращение к незарезервированной области памяти, ведь ты даеш начальное значение S равным 1 и повторяеш цикл от 1 до 7, при этом каждый раз увеличиая S. В итоге ты обращаешся к 7-му, несуществующему, столбцу(эт если с 0 отсчет smile ). Присвой S не 1, а 0.

Автор: Ofer 18.11.2007, 00:35
А вообще, судя по заданию у тебя должно быть что-то такое. По крайней мере я так понял.

Код

program diagonal;
uses crt;
const n = 7;
var
  a : array [1..n,1..n] of Integer;
  i, j, k, s, g : Integer;

procedure zapoln;
begin
  Randomize;
  for i := 1 to n do
  for j := 1 to n do
  a[i,j] := random(100) - random(50);
end;

procedure vivod;
begin
  Writeln('Вывод матрицы');
  for i := 1 to n do
  begin
  for j := 1 to n do
  begin
    if i = j then
    textcolor(2)
    else
    textcolor(15);
    Write(a[i,j]:5);
  end;
  Writeln;
  end;
  textcolor(15);
end;

procedure ex1;
begin
  for i := 1 to n do
  a[i,i] := 1;
end;

procedure ex2;
begin
  for i := 1 to n - 1 do
  for j := 2 to n do
  if j > i then
  a[i,j] := i - j;
end;

procedure ex3;
begin
  for i := 2 to n do
  for j := 1 to n - 1 do
  if j < i then
  a[i,j]:=i + j;
end;

begin
  ClrScr;
  zapoln;
  vivod;
  ex1;
  ex2;
  ex3;
  vivod;
  ReadLn;
end.

Автор: volvo877 18.11.2007, 02:30
Ofer, а не боишься, что с установленной {$R+} под Турбо Паскалем программа начнет вылетать на строке:

Код

procedure zapoln;
begin
  Randomize;
  for i := 1 to n do
  for j := 1 to n do
  a[i,j] := random(100) - random(50); { <--- Вот этой !!! }
end;

?

Я бы все-таки написал:

Код

procedure zapoln;
begin
  Randomize;
  for i := 1 to n do
  for j := 1 to n do
  a[i,j] := Integer(random(100) - random(50));
end;

Автор: digitech 18.11.2007, 14:15
Цитата(Ofer @  18.11.2007,  00:19 Найти цитируемый пост)
digitech, конечно у тебя в ex3 будет обращение к незарезервированной области памяти, ведь ты даеш начальное значение S равным 1 и повторяеш цикл от 1 до 7, при этом каждый раз увеличиая S. В итоге ты обращаешся к 7-му, несуществующему, столбцу(эт если с 0 отсче

А! Получается я присваиваю значение элементу, которого вообще не существует?

_______________________________________________-
А почему сам компилятор паскаля об этой ошибке не выдаёт отчёт/справку? 

Автор: Ofer 18.11.2007, 22:06
Цитата

Ofer, а не боишься, что с установленной {$R+} под Турбо Паскалем программа начнет вылетать на строке:

Нет, лично я не боюсь
a[i,j] := random(100) - random(50); это идея автора вопроса и я только предложил решение самого задания. Вообще, углубляясь в этот вопрос можно предложить множество решений, так что тут тебе карты в руки. К тому же, я не понимаю зачем заполнять массив начальными данными, ведь они потом не используются.

Цитата

А почему сам компилятор паскаля об этой ошибке не выдаёт отчёт/справку? 


Компилятор делает только проверку синтаксиса и семантики. А выход за диапозон это уже ошибка периода исполнения. Ведь в исходном коде ты можеш указать граници цикла переменными и компилятор уже никак ни проверет это smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)