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
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1