|
#1
|
|||
|
|||
Всем добрый день. Помогите найти ошибку:
Код:
procedure TForm1.open_drlClick(Sender: TObject); var N,i, probel, N_strok, l: integer; st: string; a:array[1..1000] of string; drl_string: array [1..1000] of string; flag: boolean; begin if OpenDialog1.Execute then begin AssignFile(f, OpenDialog1.FileName); reset(f); // Удаляем из файла повторяющиеся строки и переводим строки в массив while not Seekeof(f) do begin readln(f, st); { считываем из файла строки } probel:= Pos (' ',st); {находим координаты символа 'пробел' в конце строки} Delete (st,probel,200); {удаляем все пробелы в конце каждой строки} N := N + 1; { увеличиваем переменную на единицу } repeat begin i := i + 1; { увеличиваем переменную на единицу } a[i] := st; { записываем строки в массив } end; until i = N; { условие для окончания циклы } end; N_strok := 1; for i := 1 to N do begin flag := true; for l := 1 to N_strok do if drl_string[l] = a[i] then flag := false; if flag = true then begin drl_string[N_strok] := a[i]; N_strok := N_strok + 1; end; end; closefile(f); {закрываем исходный файл} end; // Выводим массив в TMemo--------------------------------------------------- for i := 1 to N_strok do DrlText.Lines[i]:= drl_string[i]; end; Забыл написать про ошибку. Программа компилируется, но при открытии файла вылетает следующее Access violation at addess 00407296 in module 'DrlToAutoCad.exe'. Write of addess 02B5BF04 Последний раз редактировалось M.A.D.M.A.N., 14.10.2013 в 12:06. |
#2
|
||||
|
||||
Цитата:
сколько пунктов нарушил? по теме, обычно такая ошибка, когда где-то че-то пытаешься делать с несуществующими данными в delete строка существует? Я за здоровый экстрим! Спасибо за "спасибо") Последний раз редактировалось Mrak, 14.10.2013 в 11:19. |
#3
|
||||
|
||||
Массивы не от 1цы! А от нуля создавайте!
Основы паскаля, чёрт возьми. |
#4
|
||||
|
||||
Цитата:
а че у меня с 123 стоит и работает? Я за здоровый экстрим! Спасибо за "спасибо") |
#5
|
||||
|
||||
У тебя
Код:
a:array[1..1000] of string; drl_string: array [1..1000] of string; Ошибка что выскакивает говорит - что выход за пределы ареса выделенной памяти, - доступ запрещен. (вычерный перевод). Это бывает по нескольким причинам, в данном случае у тебя больше всего смахивает на то, что при цикле: Код:
for i := 1 to N do begin flag := true; for l := 1 to N_strok do if drl_string[l] = a[i] then flag := false; if flag = true then begin drl_string[N_strok] := a[i]; N_strok := N_strok + 1; end; end; closefile(f); {закрываем исходный файл} end; Код:
begin i := i + 1; { увеличиваем переменную на единицу } a[i] := st; { записываем строки в массив } end; until i = N; { условие для окончания циклы } Програмистами не рождаются, ими становятся! Последний раз редактировалось SCrat.ORS, 14.10.2013 в 11:57. |
#6
|
|||
|
|||
В pascalABC все работает.
Цитата:
Массивы создаю, как мне удобней Последний раз редактировалось M.A.D.M.A.N., 14.10.2013 в 12:05. |
#7
|
||||
|
||||
вот хорошая статья
http://www.gunsmoker.ru/2009/05/access-violation.html Я за здоровый экстрим! Спасибо за "спасибо") |
#8
|
||||
|
||||
Совсем охренели. Может вам еще ключ от квартиры, где деньги лежат?
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#9
|
|||||||
|
|||||||
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Количество ошибок зашкаливает. 5 штук на такой короткий код. 4 из 5 могут привести к той самой ошибке A/V. jmp $ ; Happy End! The Cake Is A Lie. |
#10
|
|||
|
|||
я не инициализировал N и i. С остальным разберусь.
|