Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.12.28;
Скачать: [xml.tar.bz2];

Вниз

как проверить существует ли переменная   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.006 c
1-1204962203
GrafDrakula
2008-03-08 10:43
2008.12.28
Прозрачный Listbox1, memo(richedit)


15-1225436622
Виталий Глуниц
2008-10-31 10:03
2008.12.28
Интеграция любого приложения в объект TObject


11-1196443969
kenshin1101
2007-11-30 20:32
2008.12.28
KOL Unicode Failed


15-1225103167
axis_of_evil
2008-10-27 13:26
2008.12.28
рабочая группа разбилась на группы


6-1196764799
Богдан
2007-12-04 13:39
2008.12.28
проблема с DirectX (TDXPlay)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский