Форум: "Начинающим";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];
ВнизSetLength дла массива Record - в. Найти похожие ветки
← →
learner © (2006-09-22 15:46) [0]Здравствуйте !
Помогите разобраться.
Меняю длину динамического массива и получаю 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".
← →
clickmaker © (2006-09-22 15:49) [1]
> получаю AccessViolation
на какой строке?
← →
learner © (2006-09-22 15:59) [2]>на какой строке?
Все время на разных. От расположения планет зависит :)
Уже и в отдельный проект это перенесла. То же самое :((
← →
Zeqfreed © (2006-09-22 16:12) [3]
if Length(LenArr) < aCount then SetLength(LenArr, aCount + StandartLen);
В этой строчке заменить < на <=. Много думать.
P.S. Во всех строчках заменить Standart на Standard, а ещё лучше Default. ;)
← →
Kolan © (2006-09-22 16:15) [4]Ну пройдитесь отладчиком, посмотрите как там и что в Watches...
← →
Галинка © (2006-09-22 16:22) [5]Я конечно могу ошибаться. Но тут недавно про это уже спрашивали. тут путается понятия динамического и открытого массивов. Попробуй завести внутри поцедуры переменную динамического массива, а потом присвой этот динам открутомы. Может так лучше будет.
← →
Zeqfreed © (2006-09-22 16:23) [6]А вообще, это какие-то извращения. Зачем делать цикл while если кол-ва итераций заранее известны? Зачем постоянно перераспределять память?
← →
Anatoly Podgoretsky © (2006-09-22 16:23) [7]Какой то странно бессмысленный код, да и ошибка наверно в другом месте.
← →
Галинка © (2006-09-22 16:24) [8]Открытые массивы используются как параметры функций и у них нельзя вроде назначать длину ))
← →
Dmitrij_K (2006-09-22 16:25) [9]
> Открытые массивы используются как параметры функций и у
> них нельзя вроде назначать длину ))
Точно.
Но к этой проблеме это не относится
← →
learner © (2006-09-22 16:26) [10]>В этой строчке заменить < на <=. Много думать.
!!! А ведь часа два смотрела и не видела :((
Спасибо !
← →
Галинка © (2006-09-22 16:29) [11]Дима, точно? Я щас поищу тему. Но там как раз такая ошибка и была вроде.
← →
Dmitrij_K (2006-09-22 16:30) [12]...
if Length(LenArr)<=aCount then
SetLength(LenArr, aCount + StandartLen);
...
← →
Dmitrij_K (2006-09-22 16:30) [13]Опаздал.
← →
Zeqfreed © (2006-09-22 16:31) [14]> [10] learner © (22.09.06 16:26)
На самом деле ошибка там действительно может проявляться на разных итерациях, т.к. в некоторых «особо счастливых» раскладах, память оказывается доступной для записи и AV не выскакивает на третьей итерации, как ему полагается.
Советую все-таки пересмотреть подход, т.к. текущий код очень-очень некрасивый и кривоватый :) Для чего он используется?
← →
umbra © (2006-09-22 16:32) [15]2 Галинка © (22.09.06 16:24) [8]
здесь нет открытых массивов
← →
Kolan © (2006-09-22 16:32) [16]
> Галинка © (22.09.06 16:24) [8]
Тут не открытый массив:var LenArr: TDataArr
← →
Zeqfreed © (2006-09-22 16:33) [17]> [11] Галинка © (22.09.06 16:29)
Тут нет открытых массивов.
← →
Галинка © (2006-09-22 16:36) [18]а в чем смысл строки
if Length(LenArr) < aCount
если aCount равно нулю? Проверка на отрицательную длину входного массива? Странно...
← →
Zeqfreed © (2006-09-22 16:38) [19]> [18] Галинка © (22.09.06 16:36)
Это помещено в цикл, в котором значение aCount изменяется.
← →
Галинка © (2006-09-22 16:38) [20]Спасибо. Я тоже часто пропускаю такие вещи. Но зачем проверять на отрицательность длины массива? Разве такое вообще может быть?
← →
Kolan © (2006-09-22 16:39) [21]Код я так и не понял, но чтобы не получаать AV работая с массивами полезно писат так:
for I := Low(Arr) to High(Arr) do
← →
Zeqfreed © (2006-09-22 16:43) [22]> [21] Kolan © (22.09.06 16:39)
Смысл кода в том, чтобы заполнить 26 элементов начальными значениями в очень извращенной форме :)
> Код я так и не понял, но чтобы не получаать AV работая с
> массивами полезно писат так:
> for I := Low(Arr) to High(Arr) do
Как ни пиши, AV можно словить :)
← →
Галинка © (2006-09-22 16:51) [23]А если массив равен нил, то он пустой или его вообще нет?
← →
Anatoly Podgoretsky © (2006-09-22 16:52) [24]
Смысл кода в том, чтобы заполнить 26 элементов начальными значениями в очень извращенной форме :)
И для этого такие извращения с кодом? Почему бы сразу не сделать SetLength , 26 и потом обычный цикл, без всякой этой ерунды.
← →
Zeqfreed © (2006-09-22 16:57) [25]> [24] Anatoly Podgoretsky © (22.09.06 16:52)
Вы меня спрашиваете? :) Я примерно о том же говорил в [6].
← →
learner © (2006-09-22 17:08) [26]>Смысл кода в том, чтобы заполнить 26 элементов начальными
>значениями вочень извращенной форме :)
Это специально сделаный и вынесенный в новый проект код для воссознания
ошибки. Он не предназаначен для работы :))
← →
Галинка © (2006-09-22 17:18) [27]Автор, помогло исправление на <=? Там просто пропускался один элемент массива?
← →
Zeqfreed © (2006-09-22 17:22) [28]> [27] Галинка © (22.09.06 17:18)
Нет, там было обращение к несуществующему элементу.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.036 c