Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка в памяти при выполнении кода 
:(
    Опции темы
digitech
Дата 17.11.2007, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 1.4.2007

Репутация: нет
Всего: 1



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

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

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.
 
PM MAIL   Вверх
Ofer
Дата 18.11.2007, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 293
Регистрация: 15.10.2006
Где: КривбаСС

Репутация: нет
Всего: 5



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

Это сообщение отредактировал(а) Ofer - 18.11.2007, 00:21
PM MAIL ICQ   Вверх
Ofer
Дата 18.11.2007, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 293
Регистрация: 15.10.2006
Где: КривбаСС

Репутация: нет
Всего: 5



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

Код

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.

PM MAIL ICQ   Вверх
volvo877
Дата 18.11.2007, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



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;

PM MAIL   Вверх
digitech
Дата 18.11.2007, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 1.4.2007

Репутация: нет
Всего: 1



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

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

_______________________________________________-
А почему сам компилятор паскаля об этой ошибке не выдаёт отчёт/справку? 
PM MAIL   Вверх
Ofer
Дата 18.11.2007, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 293
Регистрация: 15.10.2006
Где: КривбаСС

Репутация: нет
Всего: 5



Цитата

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

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

Цитата

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


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

Это сообщение отредактировал(а) Ofer - 18.11.2007, 23:01
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0450 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.