Текущий архив: 2008.12.28;
Скачать: CL | DM;
Вниз
как проверить существует ли переменная Найти похожие ветки
← →
Andrey_ka (2008-11-13 14:11) [0]как проверить существует ли переменная на которую ссылается указатель?
например
p,s:pinteger;
new(p);
p^:=4;
s:=p;
dispose(p);
.....
showmessage(inttostr(s));
← →
Ega23 © (2008-11-13 14:12) [1]Никак.
Зы, указатель не на переменную ссылается. Он ссылается на ячейку памяти.
← →
Anatoly Podgoretsky © (2008-11-13 14:23) [2]> Andrey_ka (13.11.2008 14:11:00) [0]
Ты так больше не делай.
← →
Andrey_ka (2008-11-13 14:43) [3]Anatoly Podgoretsky © (13.11.08 14:23) [2]
как не делать?
← →
Сергей М. © (2008-11-13 15:15) [4]
> Andrey_ka (13.11.08 14:11)
А и проверять нечего.
Ты ее, переменную, только что уничтожил своими руками.
← →
Andrey_ka (2008-11-19 12:22) [5]
> А и проверять нечего.
> Ты ее, переменную, только что уничтожил своими руками.
я понимаю что уничтожил, вот и спашиваю есть какой нибудь способ это проверить или нет
← →
Amoeba © (2008-11-19 14:12) [6]
> Andrey_ka (19.11.08 12:22) [5]
>
>
> > А и проверять нечего.
> > Ты ее, переменную, только что уничтожил своими руками.
>
>
>
> я понимаю что уничтожил, вот и спашиваю есть какой нибудь
> способ это проверить или нет
Программист обязан сам следить за этим. Единственный способ такой. Присваивай переменной-указателю сразу после уничтожения nil и в дальнейшем перед обращением к ней проверяй
MyVar = nil или Assigned(MyVar)
← →
Anatoly Podgoretsky © (2008-11-19 14:36) [7]
> Amoeba © (19.11.08 14:12) [6]
Лишнее, совет [2] в силе.
← →
oxffff © (2008-11-19 14:38) [8]
> Andrey_ka (13.11.08 14:11)
100% способа на данный момент нет.
Нужна поддержка со стороны heap manager.
← →
StriderMan (2008-11-19 14:43) [9]
> Ты так больше не делай.
а если ее кто другой прибил, а? какой-нибудь вражеский код
← →
oxffff © (2008-11-19 14:49) [10]
> 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 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;
← →
Григорьев Антон © (2008-11-19 16:19) [12]Есть API-функции IsBadReadPtr и IsBadWritePtr. Если хотя бы одна из них вернула False, значит, такой переменной точно не существует. Но если они обе вернули True, это ещё ничего не значит.
← →
Anatoly Podgoretsky © (2008-11-19 16:24) [13]> StriderMan (19.11.2008 14:43:09) [9]
Тоже просто, никогда так не делай, что бы кто другой мог прибить.
Но если это случится, то пойди и прибей его!!!
Так программы нужно писать только из маркетинговых соображений или для защиты своего рабочего места, только надо чуть посложнее, что бы никто другой не мог разобраться и стояла бы дилема - прибить или на руках носить.
← →
Anatoly Podgoretsky © (2008-11-19 16:25) [14]> StriderMan (19.11.2008 16:15:11) [11]
А если Exception не будет?
← →
Anatoly Podgoretsky © (2008-11-19 16:29) [15]> Григорьев Антон (19.11.2008 16:19:12) [12]
Тrue
Правда эта функция ничего не дает, о чем даже сказано в примечаниях.
← →
StriderMan (2008-11-19 17:41) [16]
> А если Exception не будет?
значит и в основном коде не будет :)))
конечно гарантию никто не даст что после таких экзерсизов все будет работать нормально
← →
Palladin © (2008-11-19 17:55) [17]
> Andrey_ka
вместо того, что бы искать "спасателей малибу" занялся бы своей дисциплиной кодирования, дабы не допускать ситуаций, в которой необходима проверка действительности указания...
← →
Плохиш © (2008-11-19 18:09) [18]
> как проверить существует ли переменная
Чё тут проверять-то? Delphi в этом смысле строг, все переменные должны быть описаны до применения, значит результат проверки всегда истина.
> я понимаю что уничтожил, вот и спашиваю есть какой нибудь
> способ это проверить или нет
В чём смысл этой проверки? Программе, выполняющей какие-то полезные действия, совершенно пофигу проверишь ты это или нет, ей всё-равно придётся исключение инициализировать. Или может ты желаешь переписать встроенную обработку исключений?
← →
Anatoly Podgoretsky © (2008-11-19 19:43) [19]> StriderMan (19.11.2008 17:41:16) [16]
Но результат будет более зловещим, чем если бы выдало исключение.
← →
oxffff © (2008-11-20 10:17) [20]
> 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;
Что это?
← →
StriderMan (2008-11-20 10:52) [21]
> oxffff © (20.11.08 10:17) [20]
> Что это?
кодоблудие
← →
oxffff © (2008-11-20 12:05) [22]
> кодоблудие
Дык если страница в памяти присутствует, и адрес попадает пользовательское пространство, то чего ты ожидаешь получить.
Чтобы твоя функция работала, нужно детерминированно деинициализировать указатель. Но тогда и смысла в фукнции нет.
Страницы: 1 вся ветка
Текущий архив: 2008.12.28;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.006 c