![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как проверить существует ли переменная [D7, 2003]
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]
как не делать?