![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Vit |
|
||||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Есть переменная типа record, нужен указатель на отдельное поле этой записи. Это можно сделать или нет? Столкнулся с такой трудностью, вот примеры моего кода (код для тестирования, ничего толкового не делает):
Здесь нет records и всё работает прекрасно. А теперь вот такой код:
Получаю AV! Ну думаю, наверное проблема в строке p:[email protected];, и конструкция воспринимается как указатель на всю структуру, пробую видоизменить эту строку: with c do p:=@b; // то же самое - AV! p:=PBool(c.b); // то же самое - AV! p:=pointer(c.b); // то же самое - AV! Может кто подскажет в чём прикол и можно ли это обойти, просто ну совершенно влом объявлять отдельно сотни переменных и писать громоздкие процедуры присвоения. PS. Указатель на всю структуру меня совершенно не устраивает, нужен на отдельное поле. -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
||||
|
|||||
| MBo |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 234 Регистрация: 10.6.2002 Репутация: 3 Всего: 18 |
p:^Boolean;
|
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: нет Всего: 12 |
Ну или уж PBoolean Типы разные получались... LongBool и Bool Если уж охото PBool, то тогда t=record a:bool; b:bool; end А о том, что указатель шел не на все структуру разом, а на конкретный элемент (второй в данном случае) говорит это: lea eax, [esp+$01], Смещение на 1 байт от начала стека это и есть наш c.b, а квадратные скобки - это значит, что мы адрес передаем. (это в отладчике видно). А что же получалось у нас? Вот структура t размером в 2 байта. И указатель PBool под 4 байта. Получается накладочка и мы вылезаем за размер структуры...Как проверить сие утверждение? Очень просто: type t=record a:boolean; b:boolean; c:boolean; d:boolean; e:boolean; end; var c:t; p:PBool; begin c.a := True; c.b := True; c.c := True; c.d := True; c.e := True; p := @c.b; p^ := false; if c.b then showmessage('true') else showmessage('false'); Поля от b до e будут равны false...Ежели написать p:= @c.a, то соотв. поля от a до d будут false, а е = true. -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Ах вот где собака порылась! Спасибо всем, всё получилось.
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |