![]() |
|
#1
|
|||
|
|||
![]() Алгоритм пузырьковой сортировки и функция вывода элементов в поле Мемо.
код компилируется но вылетает ошибка смотрел в 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
|
||||
|
||||
![]() Код:
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; jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 25.11.2012 в 18:47. |
#3
|
|||
|
|||
![]() я уже по всякому менял параметры окончания цикла и N-1 ставил и менял порядок сортировки(в данном случаеначинается со сравнения первой пары элементов и перемещается к концу, можно и с конца начинать только надо задать цикл так...
Код:
for i:=0 to N do for j:=N-1 downto i do |
#4
|
||||
|
||||
![]() Цитата:
З.Ы. давно бы уже написали, что за ошибка "вылетает"... Скриншот там или текст... jmp $ ; Happy End! The Cake Is A Lie. |
#5
|
||||
|
||||
![]() Скопировал в новый проект (форма,мемо,баттон) код, почти ничего не трогал - работает без ошибок:
Код:
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
|
|||
|
|||
![]() 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
|
|||
|
|||
![]() Alegun, ваша версия действительно работает, спасибо! но хотелось бы разобраться что не так с моей.
|
#8
|
||||
|
||||
![]() Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#9
|
||||
|
||||
![]() Эта ошибка в 99% случаев значит, что используется неинициализированный указатель или несозданный объект. Переводится как "нарушение доступа при чтении адреса такого-то", адрес явно в районе нулей. По всей видимости при передаче массива в функцию.
jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Black_Bear (25.11.2012)
|
#10
|
|||
|
|||
![]() Цитата:
Вывод в 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; |
#11
|
||||
|
||||
![]() Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#12
|
||||
|
||||
![]() Не надо ничего менять в сортировке - она и так работает, будет хуже (испытывал предложенные модернизации - начинаются ошибки:-). Вот ещё вариант обёртки:
Код:
procedure SortArr(var X: array of integer); var i, j, m: integer; begin for i:= Low(X) to High(X) do for j:= Low(X) to High(X) do if X[j] > X[j+1] then begin M:= X[j]; X[j]:= X[j+1]; X[j+1]:= M; end; end; procedure TForm1.Button1Click(Sender: TObject); var A:array[0..4] of integer; i: integer; begin memo1.Clear; A[0]:=5; A[1]:=3; A[2]:=4; A[3]:=1; A[4]:=2; SortArr(A); //можно любой массив передавать for i:=0 to High(A) do Memo1.Lines.Add(IntToStr(A[i])); end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#13
|
|||
|
|||
![]() Цитата:
Угу, работает, с выходом за границу массива. Т.е. если в настройках проекта включить соотв. проверку, то программа будет "валиться" ВСЕГДА. Ну и сложность данного алгоритма N^2, а моего - N*log(N), что для больших массивов очень существенно. |
#14
|
|||
|
|||
![]() функция получает массив в качестве параметра и должна вывести его в мемо. возвращать по сути ничего и не надо. я пробовал в описании функции в качестве параметра задавать открытый массив. также пробовал в следующем виде:
Код:
type TMas=array[0..4] of integer; procedure OutMemo(X:TMas); |
#15
|
||||
|
||||
![]() Цитата:
Код:
for i:= Low(X) to High(X)-1 do for j:= Low(X) to High(X)-1 do if X[j] > X[j+1] then begin M:= X[j]; X[j]:= X[j+1]; X[j+1]:= M; end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 25.11.2012 в 21:36. |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Black_Bear (25.11.2012)
|