![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SetLength дла массива Record - в.
learner © (2006-09-22 15:46:00)Здравствуйте !
Помогите разобраться.
Меняю длину динамического массива и получаю AccessViolation.
Как можно исправить ?
type
TTestData = record
Attr: DWord;
Name: string;
Size: Int64;
end;
TDataArr = array of TTestData;
function Test_SetLength(var LenArr: TDataArr): DWord;
const
StandartLen = 2;
var
GetNext: Boolean;
aCount: integer;
begin
aCount:=0;
Result:=0;
GetNext:=True;
try
if Length(LenArr) < StandartLen then SetLength(LenArr, StandartLen);
while GetNext do
begin
if Length(LenArr) < aCount then SetLength(LenArr, aCount + StandartLen);
LenArr[aCount].Attr:=6 + aCount;
LenArr[aCount].Name:='DataName' + IntToStr(aCount);
LenArr[aCount].Size:=aCount * 2;
Result:=Result + LenArr[aCount].Size;
inc(aCount);
if aCount > 25 then GetNext:=False;
end;
finally
end;
if Length(LenArr) <> aCount then SetLength(LenArr, aCount);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
DataArr: TDataArr;
begin
DataArr:=nil;
Test_SetLength(DataArr);
end;
Project Project1.exe raised exception class EAccessViolation with message
'Access violation at address 77124874 in module 'oleaut32.dll'. Read of address 00000008'.
Project Project1.exe raised exception class EAccessViolation with message
'Access violation at address 00403F3E in module 'Project1.exe'. Read of address FFFFFFF9'.
Zeqfreed (2006-09-22 17:22:00) [1]> [27] Галинка © (22.09.06 17:18)
Нет, там было обращение к несуществующему элементу.
Галинка (2006-09-22 17:18:00) [2]Автор, помогло исправление на <=? Там просто пропускался один элемент массива?
learner (2006-09-22 17:08:00) [3]>Смысл кода в том, чтобы заполнить 26 элементов начальными
>значениями вочень извращенной форме :)
Это специально сделаный и вынесенный в новый проект код для воссознания
ошибки. Он не предназаначен для работы :))
Zeqfreed (2006-09-22 16:57:00) [4]> [24] Anatoly Podgoretsky © (22.09.06 16:52)
Вы меня спрашиваете? :) Я примерно о том же говорил в [6].
Anatoly Podgoretsky (2006-09-22 16:52:00) [5]
Смысл кода в том, чтобы заполнить 26 элементов начальными значениями в очень извращенной форме :)
И для этого такие извращения с кодом? Почему бы сразу не сделать SetLength , 26 и потом обычный цикл, без всякой этой ерунды.
Галинка (2006-09-22 16:51:00) [6]А если массив равен нил, то он пустой или его вообще нет?
Zeqfreed (2006-09-22 16:43:00) [7]> [21] Kolan © (22.09.06 16:39)
Смысл кода в том, чтобы заполнить 26 элементов начальными значениями в очень извращенной форме :)
> Код я так и не понял, но чтобы не получаать AV работая с
> массивами полезно писат так:
> for I := Low(Arr) to High(Arr) do
Как ни пиши, AV можно словить :)
Kolan (2006-09-22 16:39:00) [8]Код я так и не понял, но чтобы не получаать AV работая с массивами полезно писат так:
for I := Low(Arr) to High(Arr) do
Галинка (2006-09-22 16:38:00) [9]Спасибо. Я тоже часто пропускаю такие вещи. Но зачем проверять на отрицательность длины массива? Разве такое вообще может быть?
Zeqfreed (2006-09-22 16:38:00) [10]> [18] Галинка © (22.09.06 16:36)
Это помещено в цикл, в котором значение aCount изменяется.
Галинка (2006-09-22 16:36:00) [11]а в чем смысл строки
if Length(LenArr) < aCount
если aCount равно нулю? Проверка на отрицательную длину входного массива? Странно...
Zeqfreed (2006-09-22 16:33:00) [12]> [11] Галинка © (22.09.06 16:29)
Тут нет открытых массивов.
umbra (2006-09-22 16:32:00) [13]2 Галинка © (22.09.06 16:24) [8]
здесь нет открытых массивов
Kolan (2006-09-22 16:32:00) [14]
> Галинка © (22.09.06 16:24) [8]
Тут не открытый массив:
var LenArr: TDataArr
Zeqfreed (2006-09-22 16:31:00) [15]> [10] learner © (22.09.06 16:26)
На самом деле ошибка там действительно может проявляться на разных итерациях, т.к. в некоторых «особо счастливых» раскладах, память оказывается доступной для записи и AV не выскакивает на третьей итерации, как ему полагается.
Советую все-таки пересмотреть подход, т.к. текущий код очень-очень некрасивый и кривоватый :) Для чего он используется?
Dmitrij_K (2006-09-22 16:30:00) [16]Опаздал.
Dmitrij_K (2006-09-22 16:30:00) [17]...
if Length(LenArr)<=aCount then
SetLength(LenArr, aCount + StandartLen);
...
Галинка (2006-09-22 16:29:00) [18]Дима, точно? Я щас поищу тему. Но там как раз такая ошибка и была вроде.
learner (2006-09-22 16:26:00) [19]>В этой строчке заменить < на <=. Много думать.
!!! А ведь часа два смотрела и не видела :((
Спасибо !
Dmitrij_K (2006-09-22 16:25:00) [20]
> Открытые массивы используются как параметры функций и у
> них нельзя вроде назначать длину ))
Точно.
Но к этой проблеме это не относится