type
TShortInfo = record
IsNew:string[1];
Attribute:string[1];
Size:string[12];
DateTime:string[12];
FileName:string[100];//????????Неизвестный размер
end;
TTree = class
public
DirName:string;
Node:TTreeNode;
Parent:TTree;
SubDirs:array of TTree;
Files:array of TShortInfo;
constructor Create;
destructor Destroy;override;
end;
Если ставлю тип просто string, то Delphi принимает его как string[255] и на загрузку дерева уходит порядка 200Мб памяти. Если ставлю string[100] то порядка 70Мб, но встречаются более длинные имена. Как быть? Как можно еще описать? Если использовать другой тип, например, PChar, то у меня какие-то ошибки появляются, может я PChar в string потом неправильно преобразовываю.
- Чем юзер похож на обезьяну?
- Он жмет на все, что жмется, дергает все, что дергается и крутит все, что крутится.
- Чем юзер отличается от обезьяны?
- У обезьяны хватает ума не воспроизводить ту последовательность, которая приводит к краху системы.
нет, выделяемый по умолчанию размер 255, не нужно вводить в заблуждение,- типа стоит некоторым книжки почитать, а почему PChar советуем - так потому что он памяти меньше зажирает...
На самом деле, давным давно в языке Pascal был тип String[N]. Значение N по умолчанию равнялось 255, так как внутренний формат представления String - LASCII, т.е. 1 байт на длину + массив Char-ов.
Delphi использует язык Object Pascal, в котором опрелделено 3 стандартных типа:
1) ShortString - аналог старого String
2) AnsiString - 2GB-ные ASCII строки (8-битные)
3) WideString - 2GB-ные UNICODE-строки
Идентификатор String в Object Pascal по умолчанию эквивалентен AnsiString, однако, для совместимости заставить компилятор интерпретировать String как ShortString (см директивы {$H–/+} и настройки компилятора (Project/Options))
Итак, скорее всего вы имеете дело с AnsiString. Разумеется 2GB не выделяется под переменную сразу. По формальным признакам выделяется столько, сколько нужно, но менеджер памяти видимо фрагментирует память (умышленно, чтобы не заниматься перераспределением памяти, если к строке прибавят несколько символов).
Есть еще тип OpenString, но его можно не брать в расчет вообще, он нужен только для совместимости, для вызова некоторых 16-разрядных функций WinAPI. (Если, скажем, Вы решите написать что-нибудь для Windows 3.11)
В Вашем случае, очевидно, не стоит полагаться на работу менеджера памяти с AnsiString....
AnsiString совместим с PChar настолько, что даже #0 в конце строки добавлять не надо.
Попробуйте использовать PChar(str), как советовал Duncon. Если результат останется прежним, то переделаем по-другому - будем выделять память из кучи ручками.
если просто заменить FileName:string[100]; на FileName:PChar;, то выдает ошибку, я так понял, GetMem использовать надо
- Чем юзер похож на обезьяну?
- Он жмет на все, что жмется, дергает все, что дергается и крутит все, что крутится.
- Чем юзер отличается от обезьяны?
- У обезьяны хватает ума не воспроизводить ту последовательность, которая приводит к краху системы.