Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.11.2012, 18:17
Black_Bear Black_Bear вне форума
Прохожий
 
Регистрация: 08.11.2012
Сообщения: 9
Репутация: 10
По умолчанию в чем загвоздка?!

Алгоритм пузырьковой сортировки и функция вывода элементов в поле Мемо.
код компилируется но вылетает ошибка
смотрел в Watch List зн-я переменных, индекс j
оказался недоступным как и элемент A[j].
Но массив в конце оказался отсортирован(тот же Watch List, да и после компиляции при наведении на 'А' показывается отсортированный массив)
А вот в Мемо ни в какую не хочет выводиться! Подскажите в чем подвох.


Код:
//объявление ф-ции
function TForm1.OutMemo(X:array of integer):integer;


//реализация метода вывода в Мемо
function TForm1.OutMemo(X:array of integer):integer;
var i,N:word;

begin

  N:=High(X);
  for i:=0 to N do
  Form1.Memo1.Lines.Add(IntToStr(X[i]));

   Result:=1;
end;



var A:array[0..4] of integer=(5,2,3,4,1);
    i,j,N,M:integer;
    begin

N:=High(A);
{A[0]:=5;
A[1]:=3;
A[2]:=2;
A[3]:=1;
A[4]:=4;}
//алгоритм пузырьковой сортировки
for i:=0 to N do
 for j:=0 to N do
   if A[j]>A[j+1]
   then begin
   M:=A[j];
   A[j]:=A[j+1];
   A[j+1]:=M;

end;

//вызов метода
OutMemo(A);
Ответить с цитированием
  #2  
Старый 25.11.2012, 18:31
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Код:
for i:=0 to N do
 for j:=0 to N do
   if A[j]>A[j+1]
   then begin
   M:=A[j];
   A[j]:=A[j+1];
   A[j+1]:=M;
 
end;
При j = 4 A[j+1] = A[5], а такого элемента не существует. Странно что вообще сортируется.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 25.11.2012 в 18:47.
Ответить с цитированием
  #3  
Старый 25.11.2012, 18:56
Black_Bear Black_Bear вне форума
Прохожий
 
Регистрация: 08.11.2012
Сообщения: 9
Репутация: 10
По умолчанию

я уже по всякому менял параметры окончания цикла и N-1 ставил и менял порядок сортировки(в данном случаеначинается со сравнения первой пары элементов и перемещается к концу, можно и с конца начинать только надо задать цикл так...
Код:
for i:=0 to N do
for j:=N-1 downto i do
) Во всех случаях одно и тоже, он пытается залезть в какой то раздел реестра процессора и естественно вылетает ошибка.
Ответить с цитированием
  #4  
Старый 25.11.2012, 20:03
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Во всех случаях одно и тоже, он пытается залезть в какой то раздел реестра процессора и естественно вылетает ошибка.
"Шо вы сказали?"(с) аноним

З.Ы. давно бы уже написали, что за ошибка "вылетает"... Скриншот там или текст...
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #5  
Старый 25.11.2012, 20:08
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Скопировал в новый проект (форма,мемо,баттон) код, почти ничего не трогал - работает без ошибок:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var A:array[0..4] of integer;
      i, j, N, M: integer;
begin
memo1.Clear;

A[0]:=5;
A[1]:=3;
A[2]:=4;
A[3]:=1;
A[4]:=2;

N:= High(A);
for i:= 0 to N do
 for j:= 0 to N do
   if A[j] > A[j+1] then 
 begin
   M:= A[j];
   A[j]:= A[j+1];
   A[j+1]:= M;
  end;
   for i:=0 to N do Memo1.Lines.Add(IntToStr(A[i]));
end;
Ответить с цитированием
  #6  
Старый 25.11.2012, 20:39
Black_Bear Black_Bear вне форума
Прохожий
 
Регистрация: 08.11.2012
Сообщения: 9
Репутация: 10
По умолчанию

project sort.exe raised exception class EAccessViolation with message 'Accesse
violation at adress 0044EC91 in module "Sort.exe". Read of adress 000002F8' Process stoped. Use Step or Run To continue.


Вот такое уведомление при запуске появляется. Я так понял это ошибка времени выполнения.
Ответить с цитированием
  #7  
Старый 25.11.2012, 20:44
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Black_Bear
'Accesse violation at adress 0044EC91 in module "Sort.exe". Read of adress 000002F8' Process stoped. Use Step or Run To continue.
Это попытка доступа к пустому месту в памяти, проблема в массиве.
Ответить с цитированием
  #8  
Старый 25.11.2012, 20:45
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Эта ошибка в 99% случаев значит, что используется неинициализированный указатель или несозданный объект. Переводится как "нарушение доступа при чтении адреса такого-то", адрес явно в районе нулей. По всей видимости при передаче массива в функцию.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
Black_Bear (25.11.2012)
  #9  
Старый 25.11.2012, 20:47
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Black_Bear
project sort.exe raised exception class EAccessViolation with message 'Accesse
violation at adress 0044EC91 in module "Sort.exe". Read of adress 000002F8' Process stoped. Use Step or Run To continue.


Вот такое уведомление при запуске появляется. Я так понял это ошибка времени выполнения.

Вывод в Memo правильный. Неправильно написана сама сортировка. Нужно так:
Код:
for i:= 0 to N-1 do 
  for j:= i+1 to N do   
    if A[j] < A[i] then 
      begin   
        M:= A[j];   
        A[j]:= A[i];   
        A[i]:= M;  
      end;
Ответить с цитированием
  #10  
Старый 25.11.2012, 20:43
Black_Bear Black_Bear вне форума
Прохожий
 
Регистрация: 08.11.2012
Сообщения: 9
Репутация: 10
По умолчанию

Alegun, ваша версия действительно работает, спасибо! но хотелось бы разобраться что не так с моей.
Ответить с цитированием
  #11  
Старый 25.11.2012, 20:49
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Black_Bear
...хотелось бы разобраться что не так с моей.
Определитесь с обёрткой функции: какая она должна быть - что получает и что возвращает. Массив фиксированный или динамический?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:12.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025