Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.52 MB
Время: 0.018 c
2-1226565058
дед Маздай
2008-11-13 11:30
2008.12.28
Посылка строки из TThread в основной поток


2-1227019195
worldmen
2008-11-18 17:39
2008.12.28
Сравнение одного пикселя


15-1224967937
Kolan
2008-10-26 00:52
2008.12.28
А хотите задачку из области разработки интерфейсов?


2-1227078866
olegIvan
2008-11-19 10:14
2008.12.28
Выставить время


15-1225078325
Slider007
2008-10-27 06:32
2008.12.28
С днем рождения ! 26 октября 2008 воскресенье