Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2013, 16:00   #1
Fealhas
Новичок
Джуниор
 
Регистрация: 22.03.2013
Сообщений: 3
По умолчанию Ошибка access violation at adress

Всем доброго времени суток, товарищи!
После закрытия формы выходит ошибка
Цитата:
access violation at adress ******* in module *****.exe. Reed of address 00000010
Помогите, пожалуйста, выявить проблему.

заранее извиняюсь за глупые вопросы. В delphi новичок.
вот код:
Код HTML:
var
  Form2: TForm2;
  TS :TStringList;
implementation

{$R *.dfm}

function Unic(var flag: array of boolean; range: integer): integer;
begin
  result := random(range);
  while flag[result] do
    result := random(range); 
  flag[result] := true; 
end;

procedure MassRand(range: integer; var inputMass: array of integer);
var
  j: integer;
  bm: array of boolean;
begin
  SetLength(bm, 10);
  for j := 0 to length(inputMass)  do
  begin
    inputMass[j] := Unic(bm, range); 
  end;
end;


procedure TForm2.Button1Click(Sender: TObject);
var
  i : integer;
  mass: array of integer; 
begin
  timer1.Enabled := true;
  Randomize;
  i := TS.Count;
  SetLength(mass,10);
  MassRand(i, mass);
  label1.Caption := TS.Strings[mass[1]];
  label2.Caption := TS.Strings[mass[2]];
  label3.Caption := TS.Strings[mass[3]];
  label4.Caption := TS.Strings[mass[4]];
  label5.Caption := TS.Strings[mass[5]];
  label6.Caption := TS.Strings[mass[6]];
  label7.Caption := TS.Strings[mass[7]];
  label8.Caption := TS.Strings[mass[8]];
  label9.Caption := TS.Strings[mass[9]];
  label10.Caption := TS.Strings[mass[10]];

end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ts.Free;
timer1.Enabled := false;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
 gauge1.Progress := 50;
 TS :=TStringList.Create;
 TS.LoadFromFile('words.txt');
 label1.Caption :='';
 label2.Caption :='';
 label3.Caption :='';
 label4.Caption :='';
 label5.Caption :='';
 label6.Caption :='';
 label7.Caption :='';
 label8.Caption :='';
 label9.Caption :='';
 label10.Caption :='';
end;

procedure TForm2.Timer1Timer(Sender: TObject);
begin
gauge1.Progress := gauge1.Progress - 1;
if gauge1.Progress=0 then begin
MessageBeep(MB_ICONEXCLAMATION);
timer1.Enabled := false;
end;

end;
end.
Fealhas вне форума Ответить с цитированием
Старый 22.03.2013, 16:45   #2
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

Код:
  label10.Caption := TS.Strings[mass[10]];
Динамически массивы нумеруются с 0
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 22.03.2013, 17:39   #3
Fealhas
Новичок
Джуниор
 
Регистрация: 22.03.2013
Сообщений: 3
По умолчанию

Цитата:
Динамически массивы нумеруются с 0
исправил, проблема не исчезла. Еще вот что : ошибка появляется не сразу после закрытия программы, и не всегда. К примеру запускаю форму, запускаю процедуру нажатия кнопки, закрываю форму. Потом снова компилирую, и он мне выдает
Цитата:
[dcc32 Fatal Error] F2039 Could not create output file '.\Win32\Debug\Project2.exe'
, и ошибка с адресом памяти через несколько секунд
Fealhas вне форума Ответить с цитированием
Старый 22.03.2013, 18:50   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

П.1
Цитата:
Код:
  Form2: TForm2;
  TS :TStringList; // для чего ?
используется ли где-то кроме данной формы ?
поскольку в приведенном коде нет создания данного объекта
Код:
ts:=TstringList.Create;
п.2
Цитата:
Код:
  while flag[result] do
    result := random(range);
условие внутри цикла не меняется =>бесконечный цикл (если он хотя бы раз будет выполнен)

п.3
Код:
  SetLength(bm, 10); //потенциальная ошибка если значение захотим увеличить range (>10)
  for j := 0 to length(inputMass) -1  do begin //  первый номер =0  //  последний номер =N{число лементов} -1
    inputMass[j] := Unic(bm, range); 
  end;
Цитата:
Код:
  i := TS.Count;
если объекта нет(не создан смотри п. 1) то вот оно AV Read of adress 000000..
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 22.03.2013 в 18:52.
evg_m вне форума Ответить с цитированием
Старый 22.03.2013, 21:06   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
for j := 0 to length(inputMass)  do
кстати, тоже неверно.
По той же причиние. Раз нумерация с нуля,
то первый элемент массива 0, последний — length(inputMass)-1
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.03.2013, 13:33   #6
Fealhas
Новичок
Джуниор
 
Регистрация: 22.03.2013
Сообщений: 3
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
П.1
используется ли где-то кроме данной формы ?
Форма всего одна
Цитата:
Сообщение от evg_m Посмотреть сообщение
поскольку в приведенном коде нет создания данного объекта
Код:
ts:=TstringList.Create;
Создание выполняется в событии FormCreate

Цитата:
Сообщение от evg_m Посмотреть сообщение
п.2
условие внутри цикла не меняется =>бесконечный цикл (если он хотя бы раз будет выполнен)
п.3
Код:
SetLength(bm, 10); //потенциальная ошибка если значение захотим увеличить range (>10)
  for j := 0 to length(inputMass) -1  do begin //  первый номер =0  //  последний номер =N{число лементов} -1
    inputMass[j] := Unic(bm, range); 
  end;
Простите, но тут я вас не понимаю... Подскажите как должно быть,

Цитата:
Код:
  {данная функция возвращает одно случайное число}
  result := random(range);
  while flag[result] do
    result := random(range); //ищем какого числа еще нет
  flag[result] := true; //это чтобы не было повторений
Fealhas вне форума Ответить с цитированием
Старый 26.03.2013, 12:32   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
п.2
Цитата:Код:

while flag[result] do
result := random(range);


условие внутри цикла не меняется =>бесконечный цикл (если он хотя бы раз будет выполнен)
замечание снимаю.

очень полезная опция при работе с массивами
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 26.03.2013 в 12:38.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Access violation at adress Volkogriz Общие вопросы Delphi 10 19.02.2013 15:41
Access violation at adress... eatlant Общие вопросы Delphi 4 12.04.2011 12:34
Ошибка access violation at adress Godod Помощь студентам 2 02.02.2011 11:11
Получаю ошибку Access violation at adress fs444 Общие вопросы C/C++ 9 16.12.2009 08:04