Непонятки с динамическим массивом...

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Сообщение faga » 04.07.2005 08:53:18

Есть программка использующая динамический массив, собирается без проблем, но при исполнении вываливает кучу "An unhandled exception occurred at $XXXXXX"
Куда копать непонятно.

Собственно код программы:
type
PUsers = ^pusersar;
users = record
ip: string[16];
traff: qword;
end;
pusersar = array of users;
const
FName = 'ulogd.syslogemu';
UName = 'users';
SAddrPrefix = 'DST=';
Protocol = 'PROTO';
Traff = 'LEN=';
var
LogF: Text;
UsersAr: pusers;
IP: TStringList;
I, J, Num, Num2, ErrC: word;
LenPos: longint;
STraff, Source: string;
DigTraff: qword;
begin
//create objects
IP := TStringList.Create;
//complite create objects
AssignFile(LogF, FName);
Reset(LogF);
IP.LoadFromFile(UName);
Num := IP.Count;
GetMem(UsersAr, Num*Sizeof(Users));
for I := 0 to Num - 1 do
begin
UsersAr^[I].IP := IP.Strings[I];
while not EOF(LogF) do
begin
readln(LogF, Source);
if pos(IP.Strings[I], Source)<>0 then
begin
LenPos := pos(Traff, Source);
delete(Source, 1, LenPos+3);
LenPos := pos(' ', Source);
delete(Source, LenPos, length(Source));
STraff := Source;
val(STraff, DigTraff, ErrC);
if ErrC<>0 then
begin
writeln('Parsing error with code -- ', ErrC);
exit;
end
else
begin
UsersAr^[I].Traff := UsersAr^[I].Traff + DigTraff;
end;
end;
end;
end;
for I := 0 to Num -1 do
writeln(UsersAr^[I].IP, ' -- ', UsersAr^[I].Traff, ' bytes');
//Destroing objects
FreeMem(UsersAr);
IP.Destroy;
CloseFile(LogF);
end.

В турбо паскале такая конструкция работала.
подскажите где ошибка...
faga
незнакомец
 
Сообщения: 2
Зарегистрирован: 04.07.2005 08:45:25

Сообщение PVOzerski » 04.07.2005 11:44:57

Ну не могла такая конструкция работать в TP - уже потому, сто синтаксис вида array of ... там есть только для открытых массивов (т. е. при передаче параметров).

Вот так устроит?

{$mode delphi}
uses
classes;
type
users = record
ip: string[16];
traff: qword;
end;
pusersar = array of users;
const
FName = 'ulogd.syslogemu';
UName = 'users';
SAddrPrefix = 'DST=';
Protocol = 'PROTO';
Traff = 'LEN=';
var
LogF: Text;
UsersAr: pusersar;
IP: TStringList;
I, J, Num, Num2, ErrC: word;
LenPos: longint;
STraff, Source: string;
DigTraff: qword;
begin
//create objects
IP := TStringList.Create;
//complite create objects
AssignFile(LogF, FName);
Reset(LogF);
IP.LoadFromFile(UName);
Num := IP.Count;
SetLength(UsersAr, Num);

for I := 0 to Num - 1 do
begin
UsersAr[I].IP := IP.Strings[I];
while not EOF(LogF) do
begin
readln(LogF, Source);
if pos(IP.Strings[I], Source)<>0 then
begin
LenPos := pos(Traff, Source);
delete(Source, 1, LenPos+3);
LenPos := pos(' ', Source);
delete(Source, LenPos, length(Source));
STraff := Source;
val(STraff, DigTraff, ErrC);
if ErrC<>0 then
begin
writeln('Parsing error with code -- ', ErrC);
exit;
end
else
begin
UsersAr[I].Traff := UsersAr[I].Traff + DigTraff;
end;
end;
end;
end;
for I := 0 to Num -1 do
writeln(UsersAr[I].IP, ' -- ', UsersAr[I].Traff, ' bytes');
//Destroing objects
IP.Free;
CloseFile(LogF);
end.
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Сообщение faga » 04.07.2005 12:24:48

Понял, спасибо.

Видимо я где-то протупил просто.

Все работает :)
faga
незнакомец
 
Сообщения: 2
Зарегистрирован: 04.07.2005 08:45:25


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23

Рейтинг@Mail.ru