zub писал(а):строки какраз SetLength`ом не инятятся, в там только в конце 0 пишется, в середине мусор будет.
Я конечно же имел в виду массив строк(длинных).
Модератор: Модераторы
zub писал(а):строки какраз SetLength`ом не инятятся, в там только в конце 0 пишется, в середине мусор будет.
zub писал(а):>>Классические массивы могут динамически менять размер?
а че нет? выделяешь память, копируешь старое, и не инитишь новое. какраз ка ты хочешь
type
Ary = type pointer; // Тип, к которому можно кастовать динамические массивы.
AryHelper = type helper for Ary // Методы для работы с ними.
...
function Grow(typeInfo: pointer; var n: SizeUint): pointer;
end;
SomeType = record
...
procedure Setup(...);
end;
var
a: array of SomeType;
na: SizeUint; // логическое количество элементов 'a'
begin
na := 0;
SomeType(Ary(a).Grow(TypeInfo(a), na)^).Setup(...);
// Теперь na = 1, а length(a) — аналог capacity у TList и может быть больше.
end.
iskander писал(а): попробуйте проверить это предположение для строк, например.
program test;
{$mode objfpc}{$h+}
uses
SysUtils;
procedure StrArrayTest;
var
StrArray: PString = nil;
I: Integer;
const
Len = 100;
begin
GetMem(StrArray, Len * SizeOf(string));
try
FillChar(StrArray^, Len * SizeOf(string), 42); //замусорим выделенную память
Initialize(StrArray^, Len); //если закомментировать Initialize(), оно брякнется
for I := 0 to Len - 1 do
StrArray[I] := I.ToString;
WriteLn(StrArray[Len - 1]);
Finalize(StrArray^, Len); //если закомментировать Finalize(), 100 строк утекут
finally
FreeMem(StrArray);
end;
end;
begin
StrArrayTest;
ReadLn;
end.
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}
cthreads,
{$ENDIF}
Classes,
SysUtils { you can add units after this };
var
Ar: array of byte;
P: PByteArray;
i,t : longint;
begin
t := GetTickCount64;
for i := 0 to 100000 do
begin
SetLength(Ar, 1000000);
Ar[100] := 100;
SetLength(Ar, 500);
if Ar[100] <> 100 then writeln('error:SetLength');
Ar[9] := 9;
SetLength(Ar, 0);
end;
writeln(GetTickCount64 - t);
t := GetTickCount64;
for i := 0 to 100000 do
begin
GetMem(P, 1000000);
(P^)[100000] := 100;
ReallocMem(P, 500);
if (P^)[100000] <> 100 then writeln('error:ReallocMem');
(P^)[9] := 9;
FreeMem(P);
end;
writeln(GetTickCount64 - t);
readln;
end.
first@my:~/mysoft/testdynarr$ fpc t2.pas
Free Pascal Compiler version 3.2.2 [2021/05/16] for x86_64
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling t2.pas
t2.pas(32,10) Warning: range check error while evaluating constants (100000 must be between 0 and 32767)
t2.pas(34,12) Warning: range check error while evaluating constants (100000 must be between 0 and 32767)
Linking t2
39 lines compiled, 0.4 sec
2 warning(s) issued
first@my:~/mysoft/testdynarr$ ./t2
13923
12
Только на что бы заменить PByteArray для снятия ограничение размера в type TByteArray = array [0..32767] of Byte; и warning при компиляции со значением больше 32767 ?
9079
12742320
19900
9079
12742320
19900
zub писал(а):там в основе классический массив
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3