Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SetLength дла массива Record - в.


Страницы:   1 2

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'.


Галинка   (2006-09-22 16:24:00) [21]

Открытые массивы используются как параметры функций и у них нельзя вроде назначать длину ))


Anatoly Podgoretsky   (2006-09-22 16:23:00) [22]

Какой то странно бессмысленный код, да и ошибка наверно в другом месте.


Zeqfreed   (2006-09-22 16:23:00) [23]

А вообще, это какие-то извращения. Зачем делать цикл while если кол-ва итераций заранее известны? Зачем постоянно перераспределять память?


Галинка   (2006-09-22 16:22:00) [24]

Я конечно могу ошибаться. Но тут недавно про это уже спрашивали. тут путается понятия динамического и открытого массивов. Попробуй завести внутри поцедуры переменную динамического массива, а потом присвой этот динам открутомы. Может так лучше будет.


Kolan   (2006-09-22 16:15:00) [25]

Ну пройдитесь отладчиком, посмотрите как там и что в Watches...


Zeqfreed   (2006-09-22 16:12:00) [26]

 if Length(LenArr) < aCount then SetLength(LenArr, aCount + StandartLen);

В этой строчке заменить < на <=. Много думать.

P.S. Во всех строчках заменить Standart на Standard, а ещё лучше Default. ;)


learner   (2006-09-22 15:59:00) [27]

>на какой строке?
Все время на разных. От расположения планет зависит :)
Уже и в отдельный проект это перенесла. То же самое :((


clickmaker   (2006-09-22 15:49:00) [28]


> получаю AccessViolation

на какой строке?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо