Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
44 / 43 / 7
Регистрация: 18.05.2010
Сообщений: 688
1

Ошибка обращения к памяти при работе цикла (access violation)

05.03.2013, 12:50. Показов 2007. Ответов 6
Метки нет (Все метки)

Есть нехитрая процедура, которая рассчитываем коэффициенты.
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
procedure TForm1.N6Click(Sender: TObject);
var
m1, m2, f, f1, f2: array of double;
r1, r2: double;
  I, j: Integer;
begin
j := 0;
if sPageControl1.ActivePageIndex = 0 then
begin
  try
    r1 := strtofloat(sLabelFX6.Caption);
    r2 := strtofloat(sLabelFX7.Caption);
  except
    showmessage('коэффициенты R1 или R2 имеют не числовой формат');
    exit;
  end;
end else
begin
  try
    r1 := strtofloat(sLabelFX13.Caption);
    r2 := strtofloat(sLabelFX14.Caption);
  except
    showmessage('коэффициенты R1 или R2 имеют не числовой формат');
    exit;
  end;
end;
Form17.show;
for I := 1 to 100 do
begin
  SetLength(m2, SizeOf(m2)+1);
  m2[i-1] := i*0.01;
  j := j+1;
  Form17.sGauge1.Progress := j;
end;
for I := 0 to 99 do
begin
  SetLength(m1, SizeOf(m1)+1);
  m1[i] := 1-m2[i];
  j := j+1;
  Form17.sGauge1.Progress := j;
end;
for I := 0 to 99 do
begin
//  SetLength(f, SizeOf(f)+1);
//  f[i] := m1[i]/m2[i];
  j := j+1;
  Form17.sGauge1.Progress := j;
end;
end;
Закомментированные строки вызывают
Delphi
1
First chance exception at $00403361. Exception class $C0000005 with message 'access violation at 0x00403361: read of address 0x3fc0a3cc'. Process Project1.exe (3068)
А именно первая из них, которая должна увеличивать размер массива.
но никак не могу понять почему...
Прошу подсказки
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.03.2013, 12:50
Ответы с готовыми решениями:

Ошибка access violation при работе с паролем
Здравствуйте! Помогите с кодом. Пароль хранится в dll.

Ошибка: access violation при работе с ini файлом
есть 2 формы. на одной форме создаю ini-файл, сохраняю туда логин пароль, а на другой форме для...

Ошибка "Access violation writing location" при работе с массивом.
Задание номер 2 #include <stdio.h> #include <cstdlib> #include <math.h> #include <cmath>...

Запуск DLL. При работе с потоками появляется ошибка "Access violation"
Здравствуйте, у меня вопрос. Я запускаю dll через консоль с помощью RUNDLL32.EXE В библиотеке...

6
2477 / 1853 / 242
Регистрация: 14.09.2012
Сообщений: 5,981
Записей в блоге: 2
05.03.2013, 13:08 2
Delphi
1
  SetLength(f, Length(f) + 1);
1
5623 / 2223 / 462
Регистрация: 20.11.2009
Сообщений: 7,460
Записей в блоге: 1
05.03.2013, 13:18 3
SetLength - устанавливаем размер в штуках
SizeOf - измеряем размер в байтах
Length - измеряет размер в штуках

а ты устанавливаешь длину массиву кол-вом байт
1
44 / 43 / 7
Регистрация: 18.05.2010
Сообщений: 688
05.03.2013, 13:33  [ТС] 4
angstrom, Arcor, благодарю, помогло.
Но возникла новая проблема.
Теперь строка
Delphi
1
f[i] := m1[i]/m2[i];
Выдаёт ошибку
Delphi
1
floating point overflow
Почитал, что это означает, что результат получается слишком большим и не может быть представлен данным видом переменной.
Но как можно решить эту проблему? Слабо себе представляю...
Да и число логически, не должно быть там такого рода чисел, которые выходят за рамки.
0
5623 / 2223 / 462
Регистрация: 20.11.2009
Сообщений: 7,460
Записей в блоге: 1
05.03.2013, 13:48 5
а откуда такая уверенность что считать нужно до 99, если ты выставляешь размер массива который завсит от другого размера ! Это не факт что там будет 100 значений, считай до Length(Array_Name) - 1
0
44 / 43 / 7
Регистрация: 18.05.2010
Сообщений: 688
05.03.2013, 14:24  [ТС] 6
Цитата Сообщение от Arcor Посмотреть сообщение
а откуда такая уверенность что считать нужно до 99, если ты выставляешь размер массива который завсит от другого размера ! Это не факт что там будет 100 значений, считай до Length(Array_Name) - 1
Отличный вопрос!)
Я только что понял, что по условию задачи дано что значений 100, а значит динамический массивы мы нафиг не нужны.
Сделал статическими, все ошибки пропали.
0
5623 / 2223 / 462
Регистрация: 20.11.2009
Сообщений: 7,460
Записей в блоге: 1
05.03.2013, 15:02 7
Delphi
1
2
3
4
5
6
7
for I := 1 to 100 do
begin
  SetLength(m2, SizeOf(m2)+1);
  m2[i-1] := i*0.01;
  j := j+1;
  Form17.sGauge1.Progress := j;
end;
вот что у тебя тут происходило

у тебя есть цикл считает от 1 до 100
в цикле даешь массиву длину равную длине в байтах + 1, а когда надо в штуках !

ну и так в остальных массивах

Delphi
1
2
3
4
5
6
7
for I := 1 to 100 do
begin
  SetLength(m2, i + 1); // тогда точно массив был бы длиной в 100 элементов
  m2[i-1] := i*0.01;
  j := j+1;
  Form17.sGauge1.Progress := j;
end;
или вообще
Delphi
1
Setlength(название массива, нужный размер)
потом счет
Delphi
1
for i := 0 to Length(нужный массив) - 1 do
0
05.03.2013, 15:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.03.2013, 15:02

Access Violation при работе потока
var Stream:TStringStream; //поток List1: TStringList; // для загрузки из...

Access Violation при работе с очередью
Здравствуйте. Есть такая проблема. Необходимо создать очередь массивов и соответственно работать с...

Access Violation при работе с двухмерным массивом
Написал маленькую программу которая заполняет двумерный массив #include<stdio.h>...

Access Violation при работе с регулярными выражениями
иногда когда строку надо обработать регулярным выражением, то в начале процесса выкачивает ошибка,...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru