Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/41: Рейтинг темы: голосов - 41, средняя оценка - 4.83
1 / 1 / 4
Регистрация: 05.12.2012
Сообщений: 15
1

Project raised exception class eaccessviolation with message

01.03.2014, 03:03. Показов 8037. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Очередная тема про наболевшую тему (извиняюсь за каламбурчик и за глупую тему).
Пишу программку-редактор. Редактирую я элементы, каждый элемент - строка в массиве "f".
Каждая строка заполняется согласно маске:
первые 3 символа - координата "Х", пробел, еще 3 символа - координата "У".
При клике ПКМ по/рядом с элементу(ом) надо запомнить его как выделенный.
Таким образом, я перебираю все элементы в поисках ближайшего, если он достаточно близко (не далее 99 пикселей), я его запоминаю, как выделенный.
Но лиха беда начало ловлю "ерор" в строчке
Delphi
1
s2[j]:=s1[j];
при первом прохождении обоих циклов. Появляется окошко уведомлений с таким содержанием:
"Project lalka.exe raised exception class EAccessViolation with message 'Access violation at address 0045AED3 in module 'lalka.exe'. Write of address 00000000'. Process stopped. Use Step or Run to continue."
Код проблемной функции прилагается. До написания данной функции весь код компилился и выполнялся успешно.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  i,j,a,b,c: byte;
  s1,s2,s3: string;
begin
if Button=mbRight then
  begin
  a:=0;
  b:=100;
  if length(f[0])>0 then
    for i:=1 to StrToInt(f[0]) do
      begin
      s1:=f[i];
      if length(s1)<7 then break;
        for j:=1 to 3 do
          begin
          s2[j]:=s1[j];
          s3[j]:=s1[j+4];
          end;  //for j
      a:=round(sqrt(sqr(x-StrToInt(s2))+sqr(y-StrToInt(s3))));
      if a<b then
        begin
        b:=a;
        c:=i;
        end;  //if a<b
      end;  //for i
  if b<100 then fs:=c
  else fs:=0;
  access;
  end;  //if length, for i
end;  //procedure
Заранее благодарен.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.03.2014, 03:03
Ответы с готовыми решениями:

Project raised exception class EAccessViolation with message...
var Form1: TForm1; Bana:TStringList; procedure TForm1.button1Click(Sender: TObject); var...

Project Incassaciya.exe raised exception class EAccessViolation with message 'Access violation at address
Помогите пожалуйста. При запуске программы вылезает ошибка: Project Incassaciya.exe raised...

Ошибка: Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address
Работаю с файлом *.xls через OpenOffice Calc. На форме 2 элемента RadioButton1 и RadioButton2. Если...

Project Hotel.exe raised exception class EAccessViolation with message"Access violation at address 007B90DA
будет много букв \ сорян При Запуске выходит такая ошибка Project Hotel.exe raised exception...

12
angstrom
01.03.2014, 03:10 2
Если я правильно понял, то строка в массиве представлена таким образом - "123 456". Тогда как можно использовать для такой записи StrToInt(f[0])?
1 / 1 / 4
Регистрация: 05.12.2012
Сообщений: 15
01.03.2014, 03:17  [ТС] 3
Нулевая строчка хранит в себе длину массива, а записи начинаются с 1 строчки, все записи туда идут программно, потому проверки не требуют. Проверил, в моем примере массив имеет вид:
Pascal
1
{'1', '050 050 3W12+43'}
После координат идет описание других характеристик объекта.
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
01.03.2014, 07:51 4
Если массив f динамический, то нужно
Delphi
1
for i:=1 to StrToInt(f[0])-1 do
0
139 / 137 / 66
Регистрация: 15.05.2012
Сообщений: 515
01.03.2014, 12:21 5
Delphi
1
2
3
4
  if length(f[0])>0 then
    for i:=1 to StrToInt(f[0]) do
      begin
      s1:=f[i];
Если массив динамический то цикл от 0 до ....
Правильно будет
Delphi
1
for i:=0 to StrToInt(f[0])-1 do
Так же нужна проверка на "число", вдруг туда впишут букву или спец символ.
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
01.03.2014, 12:25 6
Так написано
Цитата Сообщение от Morik666 Посмотреть сообщение
Нулевая строчка хранит в себе длину массива, а записи начинаются с 1 строчки
Потому и от 1
0
пофигист широкого профиля
4735 / 3168 / 860
Регистрация: 15.07.2013
Сообщений: 18,255
01.03.2014, 17:35 7
Лучший ответ Сообщение было отмечено Morik666 как решение

Решение

Цитата Сообщение от Morik666 Посмотреть сообщение
ловлю "ерор" в строчке
s2[j]:=s1[j];
А память под s2 кто выделять будет? И под s3 кстати тоже.
1
1 / 1 / 4
Регистрация: 05.12.2012
Сообщений: 15
01.03.2014, 17:46  [ТС] 8
Спасибо. Завтыкал. Давно не работал со стрингами.
Хотел бы спросить, как правильно выделять память. У себя в программе вылечил таким макаром:
Delphi
1
2
s2:='000';
s3:='000';
, но это явный костыль.
0
пофигист широкого профиля
4735 / 3168 / 860
Регистрация: 15.07.2013
Сообщений: 18,255
01.03.2014, 19:08 9
Лучший ответ Сообщение было отмечено Morik666 как решение

Решение

Цитата Сообщение от Morik666 Посмотреть сообщение
как правильно выделять память.
Delphi
1
SetLength(s2,3);
Выделяет память под строку длиной в 3 символа.
1
1 / 1 / 4
Регистрация: 05.12.2012
Сообщений: 15
02.03.2014, 02:53  [ТС] 10
BTW.
Нашел прекрасную функцию: "copy". Для моего примера будет выглядеть так:
Delphi
1
s2:=copy(s1,1,3)
что значит копирование из s1 трех элементов, начиная с первого (память выделяет само).
0
angstrom
02.03.2014, 02:58
  #11

Не по теме:

Чтение справки могло давно помочь в решении проблемы.

пофигист широкого профиля
4735 / 3168 / 860
Регистрация: 15.07.2013
Сообщений: 18,255
02.03.2014, 03:11 12
Цитата Сообщение от Morik666 Посмотреть сообщение
что значит копирование из s1 трех элементов, начиная с первого (память выделяет само).
Естественно. Все функции работающие именно со строками дядюшка Борланд изначально сделал (и продолжает делать) так, что они сами заботятся о выделении/освобождении памяти. Даже свой менеджер памяти для этого написал. Точнее не только для строк, а ещё и для динамических массивов.
Вот только со строками можно работать как собственно со строками, так и как с динмассивами. Последнее не запрещено, но оставлено на совесть программисту..

Добавлено через 2 минуты
Цитата Сообщение от angstrom Посмотреть сообщение
Чтение справки могло давно помочь в решении проблемы.
Не соглашусь. Справка о таких тонкостях либо молчит, либо адресуется к тем, кто уже и так все знает.
0
angstrom
02.03.2014, 22:44 13
Не соглашайся, у каждого свой опыт.
02.03.2014, 22:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.03.2014, 22:44
Помогаю со студенческими работами здесь

Project Project2.exe raised exception class EAccessViolation with message 'Access violation at address 00467ECA in modul
Впервые решил обратится сюда,вообщем проблема пустяковая Суть в том что нужно в делфи подгрузить...

Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 007B90DA in module 'Project1.exe'...
При нажатии кнопки &quot;Добавить запись&quot; должна показываться вторая форма, вместо этого ошибка ...

Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 0045DC8E in module 'Project1.exe'. Write of ad'
Всем доброго времени суток, у меня возникла вот такая проблема, после компиляции проекта, при...

Project project1.exe raised exception class EConvertError with message
Доброго времени суток! Прошу помочь с программой. После нажатия на кнопку действия, программа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru