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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.10.2013, 11:06
ua3rad ua3rad вне форума
Прохожий
 
Регистрация: 21.12.2012
Сообщения: 17
Репутация: 10
По умолчанию

Всем добрый день. Помогите найти ошибку:
Код:
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  
Старый 14.10.2013, 11:15
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

Цитата:
Часть II – Сообщения

2.1. Перед тем как задать вопрос не поленитесь поискать ответ на него в Интернет, в разделе FAQ или на форуме. Вполне возможно, что Вы не первый кто столкнулся с такой проблемой.
2.2. Старайтесь выбирать ветку форума в соответствии с Вашим вопросом.
2.3. Один вопрос – одна тема.
2.4. Делайте заголовок темы информативным, старайтесь избегать заголовков типа: "Помогите!!!". Так же настоятельно советуем избегать излишнего использования ЗАГЛАВНЫХ букв.
2.5. Не рекомендуется задавать один и тот же вопрос несколько раз подряд. Если по какой-то причине Вы все же создали 2 и более одинаковые темы, советуем удалить лишние дубли самостоятельно или, если Вам это не удалось, связаться с администрацией форума.
2.6. Пользовательская подпись не должна превышать 4 строк (включая пустые), и не должна содержать ссылок (ссылку на свой сайт Вы можете вставить в соответствующее поле профиля). Рекламируйте себя другими способами, форум не рекламная площадка.
2.7. На форуме запрещено обсуждать все, что относится к взлому, незаконному использованию и распространению программного обеспечения.
2.8. Используйте тег [C0DE]...[/C0DE].
http://www.delphisources.ru/pages/forum_rules.html

сколько пунктов нарушил?

по теме, обычно такая ошибка, когда где-то че-то пытаешься делать с несуществующими данными
в delete строка существует?
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")

Последний раз редактировалось Mrak, 14.10.2013 в 11:19.
Ответить с цитированием
  #3  
Старый 14.10.2013, 11:32
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Массивы не от 1цы! А от нуля создавайте!
Основы паскаля, чёрт возьми.
Ответить с цитированием
  #4  
Старый 14.10.2013, 11:35
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

Цитата:
Сообщение от Uniq!
Массивы не от 1цы! А от нуля создавайте!
Основы паскаля, чёрт возьми.
да ладно?
а че у меня с 123 стоит и работает?
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
Ответить с цитированием
  #5  
Старый 14.10.2013, 11:50
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
По умолчанию

У тебя
Код:
    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; { условие для окончания циклы }
переменная i или N_strok становится больше чем 1000. т.е. программа пытается получить ячейку номером более 1000 из массива, а он состоит из 1000 ячеек (например drl_string[1001] или a[1001]) и в следствии - ошибка. Думаю суть понятна. Используй какой-нибудь примитивный showmessage(inttostr(i)) перед записью/считыванием в массив - что бы видеть какой номер ячейки используется. Более чем уверен, что 1001 будет.
__________________
Програмистами не рождаются, ими становятся!

Последний раз редактировалось SCrat.ORS, 14.10.2013 в 11:57.
Ответить с цитированием
  #6  
Старый 14.10.2013, 12:01
ua3rad ua3rad вне форума
Прохожий
 
Регистрация: 21.12.2012
Сообщения: 17
Репутация: 10
По умолчанию

В pascalABC все работает.

Цитата:
Сообщение от Uniq!
Массивы не от 1цы! А от нуля создавайте!
Основы паскаля, чёрт возьми.

Массивы создаю, как мне удобней

Последний раз редактировалось M.A.D.M.A.N., 14.10.2013 в 12:05.
Ответить с цитированием
  #7  
Старый 14.10.2013, 12:05
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

вот хорошая статья
http://www.gunsmoker.ru/2009/05/access-violation.html
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
Ответить с цитированием
  #8  
Старый 14.10.2013, 12:06
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Совсем охренели. Может вам еще ключ от квартиры, где деньги лежат?
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #9  
Старый 14.10.2013, 12:41
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
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); {удаляем все пробелы в конце каждой строки}
А если там 203 пробела? Поискали бы получше в гугле, нашли бы Trim.
Цитата:
N := N + 1; { увеличиваем переменную на единицу }
А где инициализация N?
Цитата:
repeat
begin
i := i + 1; { увеличиваем переменную на единицу }
А где инициализация I?
Цитата:
N := N + 1; { увеличиваем переменную на единицу }
repeat
begin
i := i + 1; { увеличиваем переменную на единицу }
a[i] := st; { записываем строки в массив }
end;
until i = N; { условие для окончания циклы }
No comment... Вам за количество строк кода платят?
Цитата:
end;

N_strok := 1;
for i := 1 to N do
begin
А если в файле 1007 строк, а массив до 1000?
Цитата:
flag := true;
for l := 1 to N_strok do
А если в файле 1005 уникальных строк, а массив до 1000?
Количество ошибок зашкаливает. 5 штук на такой короткий код. 4 из 5 могут привести к той самой ошибке A/V.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #10  
Старый 14.10.2013, 12:57
ua3rad ua3rad вне форума
Прохожий
 
Регистрация: 21.12.2012
Сообщения: 17
Репутация: 10
По умолчанию

я не инициализировал N и i. С остальным разберусь.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter