Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как проверить существует ли переменная [D7, 2003]


Страницы:   1 2

Andrey_ka ©   (2008-11-13 14:11:00) 

как проверить существует ли переменная на которую ссылается указатель?

например

p,s:pinteger;

new(p);
p^:=4;
s:=p;
dispose(p);
.....

showmessage(inttostr(s));


oxffff   (2008-11-20 12:05:00) [1]


> кодоблудие


Дык если страница в памяти присутствует, и адрес попадает пользовательское пространство, то чего ты ожидаешь получить.
Чтобы твоя функция работала, нужно детерминированно деинициализировать указатель. Но тогда и смысла в фукнции нет.


StriderMan   (2008-11-20 10:52:00) [2]


> oxffff ©   (20.11.08 10:17) [20]
> Что это?

кодоблудие


oxffff   (2008-11-20 10:17:00) [3]


> StriderMan   (19.11.08 16:15) [11]
> function IsBadVariable(var A: TSomeType): boolean
> var t: TSomeType;
> begin
>  Result := false;
>  try
>    t := A;
>    A := TSomeType(0);
>    A := t;
>  except
>    on E: Exception do
>      Result := true;
>  end;
> end;


Что это?


Anatoly Podgoretsky   (2008-11-19 19:43:00) [4]

> StriderMan  (19.11.2008 17:41:16)  [16]

Но результат будет более зловещим, чем если бы выдало исключение.


Плохиш   (2008-11-19 18:09:00) [5]


> как проверить существует ли переменная

Чё тут проверять-то? Delphi в этом смысле строг, все переменные должны быть описаны до применения, значит результат проверки всегда истина.

> я понимаю что уничтожил, вот и спашиваю есть какой нибудь
> способ это проверить или нет

В чём смысл этой проверки? Программе, выполняющей какие-то полезные действия, совершенно пофигу проверишь ты это или нет, ей всё-равно придётся исключение инициализировать. Или может ты желаешь переписать встроенную обработку исключений?


Palladin   (2008-11-19 17:55:00) [6]


> Andrey_ka

вместо того, что бы искать "спасателей малибу" занялся бы своей дисциплиной кодирования, дабы не допускать ситуаций, в которой необходима проверка действительности указания...


StriderMan   (2008-11-19 17:41:00) [7]


> А если Exception не будет?

значит и в основном коде не будет :)))

конечно гарантию никто не даст что после таких экзерсизов все будет работать нормально


Anatoly Podgoretsky   (2008-11-19 16:29:00) [8]

> Григорьев Антон  (19.11.2008 16:19:12)  [12]

Тrue
Правда эта функция ничего не дает, о чем даже сказано в примечаниях.


Anatoly Podgoretsky   (2008-11-19 16:25:00) [9]

> StriderMan  (19.11.2008 16:15:11)  [11]

А если Exception не будет?


Anatoly Podgoretsky   (2008-11-19 16:24:00) [10]

> StriderMan  (19.11.2008 14:43:09)  [9]

Тоже просто, никогда так не делай, что бы кто другой мог прибить.
Но если это случится, то пойди и прибей его!!!

Так программы нужно писать только из маркетинговых соображений или для защиты своего рабочего места, только надо чуть посложнее, что бы никто другой не мог разобраться и стояла бы дилема - прибить или на руках носить.


Григорьев Антон   (2008-11-19 16:19:00) [11]

Есть API-функции IsBadReadPtr и IsBadWritePtr. Если хотя бы одна из них вернула False, значит, такой переменной точно не существует. Но если они обе вернули True, это ещё ничего не значит.


StriderMan   (2008-11-19 16:15:00) [12]

function IsBadVariable(var A: TSomeType): boolean
var t: TSomeType;
begin
 Result := false;
 try
   t := A;
   A := TSomeType(0);
   A := t;
 except
   on E: Exception do
     Result := true;
 end;
end;


oxffff   (2008-11-19 14:49:00) [13]


> Andrey_ka   (13.11.08 14:11)  


Предлагаю простой вариант.

TTypeHandle<T: record> = class(Tobject)
public
class function WrapType(const A:T):Tfunc<T>;static;
end;

class function TTypeHandle<T>.WrapType(const A: T): Tfunc<T>;
begin
result:=function:T
       begin
       Result := A;
       end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var a,b:TFunc<integer>;
begin
a:=TTypeHandle<integer>.WrapType(4);
b:=a;
a:=nil;
showmessage(inttostr(b));
end;


StriderMan   (2008-11-19 14:43:00) [14]


> Ты так больше не делай.

а если ее кто другой прибил, а? какой-нибудь вражеский код


oxffff   (2008-11-19 14:38:00) [15]


> Andrey_ka   (13.11.08 14:11)  


100% способа на данный момент нет.
Нужна поддержка со стороны heap manager.


Anatoly Podgoretsky   (2008-11-19 14:36:00) [16]


> Amoeba ©   (19.11.08 14:12) [6]

Лишнее, совет [2] в силе.


Amoeba   (2008-11-19 14:12:00) [17]


> Andrey_ka   (19.11.08 12:22) [5]
>
>
> > А и проверять нечего.
> > Ты ее, переменную, только что уничтожил своими руками.
>
>
>
> я понимаю что уничтожил, вот и спашиваю есть какой нибудь
> способ это проверить или нет

Программист обязан сам следить за этим. Единственный способ такой. Присваивай переменной-указателю сразу после уничтожения nilи в дальнейшем перед обращением к ней проверяй
MyVar = nil или Assigned(MyVar)


Andrey_ka   (2008-11-19 12:22:00) [18]


> А и проверять нечего.
> Ты ее, переменную, только что уничтожил своими руками.


я понимаю что уничтожил, вот и спашиваю есть какой нибудь способ это проверить или нет


Сергей М.   (2008-11-13 15:15:00) [19]


> Andrey_ka   (13.11.08 14:11)  


А и проверять нечего.
Ты ее, переменную, только что уничтожил своими руками.


Andrey_ka   (2008-11-13 14:43:00) [20]

Anatoly Podgoretsky ©   (13.11.08 14:23) [2]

как не делать?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо