![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
![]() Никак не могу врубиться, а почему если оставить FillChar(P^, SizeOf(TData), 0) закомментированным, то выдаёт любимый Access Violation?
Код:
unit TestDataUnit; interface uses Forms; type TForm1 = class(TForm) procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } end; // TForm1 = class(TForm) TData = packed record FText: String; end; // TData = packed record var Form1: TForm1; P: Pointer; implementation {$R *.dfm} procedure TForm1.FormShow(Sender: TObject); begin P := GetMemory(SizeOf(TData)) ; // FillChar(P^, SizeOf(TData), 0); with TData(P^) do SetString(FText, PChar(nil), 30); end; // procedure TForm1.FormShow(Sender: TObject) end. |
#2
|
||||
|
||||
![]() Код:
type PData = ^TData; TData = record Text: String; end; var p: PData; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin p:=GetMemory(SizeOf(TData)); ZeroMemory(p, SizeOf(TData)); // необязательно вовсе p^.Text:='hello'; end; procedure TForm1.FormDestroy(Sender: TObject); begin p^.Text:=''; FreeMemory(p); end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(p^.Text); end; Пишу программы за еду. __________________ |
#3
|
||||
|
||||
![]() Ну во первых у меня Delphi 7, я там ZeroMemory не видел. Во-вторых, я полагаю, FillChar(P^, SizeOf(TData), 0) делает то же, что и ZeroMemory(p, SizeOf(TData)). Но вот для чего оно в данном контексте нужно? Знать бы как работает SetString... Исходника я не нашёл у себя. Мож в инете?
|
#4
|
||||
|
||||
![]() у меня тоже Delphi 7, о чем написано в профиле.
Код:
var s: String; begin SetString(s, PChar('hello'), 5); ShowMessage(s); end; Пишу программы за еду. __________________ |
#5
|
||||
|
||||
![]() Да, извиняюсь, про Delphi 7 просмотрел. А для чего тут-то SetString? Можно просто s := 'hello'. Но вопрос был не об этом. Вопрос: почему без FillChar выдаёт Access Violation? И, кстати, если написать так
Код:
procedure TForm1.FormShow(Sender: TObject); var s: String; begin s := 'hello'; ShowMessage(s); P := GetMemory(SizeOf(TData)) ; // FillChar(P^, SizeOf(TData), 0); with TData(P^) do SetString(FText, PChar(nil), 30); end; // procedure TForm1.FormShow(Sender: TObject) |
#6
|
||||
|
||||
![]() ZeroMemory, если мне не изменяет мой склероз вызывает FillChar
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#7
|
|||
|
|||
![]() Потому что строка в Дельфи - это объект с автоматическим временем жизни и подсчётом ссылок. В константно1 строке счётчик равен -1, во вновь созданной - 0;
Любое присваивание в строку - это: 1)Проверить, на Nil старый указатель. 2)Если там Nil, то перейти на 6) 3)Проверить счетчик ссылок, если там не 1, то перейти на 5) 4)Освободить память, занимаемую строкой, перейти на 6) 5)Если счётчик не -1, то уменьшить счётчик 6)Собственно присвоить новый указатель 7)Проверить на Nil новый указатель 8)Если там Nil, то Exit 9)Проверить счётчик. Если там не -1, то увеличить счётчик. В многопоточном режиме добавляются Interlocked операции Строковые локальные переменные процедур и поля классовых переменных после конструкторов инициализируются Nil`ами. GetMemory осуществляет только заказ памяти и ничем его не прописывает. Поэтому на шаге 1) у Вас будет не Nil, а на шаге 4) - Access Violation. |
Этот пользователь сказал Спасибо icWasya за это полезное сообщение: | ||
BBBCat (14.03.2013)
|