#memory-management #pascal
#управление памятью #pascal
Вопрос:
Я читал, что я не могу динамически распределять массив в pascal, но я также подумываю о реализации string struct .
В C я бы сделал это, создав a struct
, содержащий указатель на массив символов (содержащий символы), целое число длины и единицу размера. Затем я бы malloc
char *
использовал and realloc
it, когда его нужно изменить.
typedef struct {
size_t size;
size_t length;
char* contents;
} String;
Можно ли это сделать в (ISO) pascal? Если да, то как бы это сделать? Я не хочу использовать встроенный динамический массив pascal, потому что это как бы противоречит цели создания моего собственного строкового типа.
Из комментариев кажется, что ISO pascal (как стандартный, так и расширенный) не поддерживает такие вещи. Как мне тогда это сделать в free pascal?
Комментарии:
1. Да, это можно сделать, и это можно сделать многими различными способами. Это также немного зависит от того, какой тип Pascal вы используете. Сегодня используется несколько разных версий Pascal. (FreePascal и Delphi — два из них.) Кроме того, в зависимости от типа используемого вами языка Pascal, подход с использованием массива dyn может не сильно повлиять на цель. Наконец, я не знаю, что вы имеете в виду, когда говорите, что вы не можете «действительно динамически распределять массив в Pascal».
2. @AndreasRejbrand я думал об ISO pascal. Я имел в виду, что, поскольку массивы имеют свой собственный тип, и поэтому динамически создаваемые типы не будут работать.
3. Стандартный Pascal (ISO 7185) не имеет malloc, GetMem или других функций выделения переменной длины, поэтому кажется, что переменная длина
contents
не может быть выделена в соответствующей программе. В расширенном Pascal (ISO 10206) их тоже нет.4. @Doj итак, расширенный pascal — это стандартный pascal? хорошо, отмечено. Значит, pascal действительно ограничен? грустно. кажется, такой хороший язык
5. Широко используется термин «Стандартный Паскаль», который относится только к ISO 7185. Термин «Расширенный Паскаль» относится только к ISO 10206. Оба стандарта ISO считаются устаревшими и используются в основном в образовательных целях. Free Pascal и Delphi имеют свои собственные диалекты pascal.
Ответ №1:
В Free Pascal это может быть реализовано аналогично упомянутому подходу C:
type
TMyString = record
size: SizeUInt;
length: SizeUInt;
contents: PAnsiChar;
end;
...
procedure AllocMyString(var S: TMyString; L: SizeUInt);
begin
S.size := 0;
S.length := L;
GetMem(Pointer(S.contents), L);
end;
procedure ReallocMyString(var S: TMyString; L: SizeUInt);
begin
S.size := 0;
S.length := L;
ReAllocMem(Pointer(S.contents), L);
end;