Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.27;
Скачать: CL | DM;

Вниз

работа с указателями   Найти похожие ветки 

 
Udjin ©   (2003-02-14 11:37) [0]

Пришлось разбираться в чужой программе. Возникла такая проблема. Процедура объявлена следующим образом:

procedure MainForm.Check;
type
TAr=array[1..MaxInt] of byte;
Ar=^TAr;
var
k:integer;

begin
DataChanged:=false;
for k:=1 to SizeOf(hd) do
if Ar(@hd)^[k]<>Ar(@_hd)^[k] then
begin
DataChanged:=true; Break;
end;
end;

переменная типа Ar не объявлена, но в процедуре используется, так разве можно делать?


 
Palladin ©   (2003-02-14 11:42) [1]

:)))
как же это она используется :)) где ты е увидел???


 
Palladin ©   (2003-02-14 11:43) [2]

то есть где ты увидел использование необъявленой переменной? :)


 
Владислав ©   (2003-02-14 11:49) [3]

Ага. В процедуре обявлена одна переменная - k: integer;


 
Palladin ©   (2003-02-14 11:52) [4]

чего то я слишком не правильно заржал...
это называется type casting, то есть приведение типов...


 
first_aid ©   (2003-02-14 11:56) [5]

Ar - это тип (а имено, указатель на TAr).


 
han_malign ©   (2003-02-14 12:12) [6]

вообще это делается прямее
var ahd: TByteArray absolute hd;
a_hd: TByteArray absolute _hd;
i: integer;
begin
DataChanged:=false;
i:=0;while(i<Sizeof(hd)and not DataChanged)do begin
DataChanged:=ahd[i]<>a_hd[i];
inc(i);
end;
end;
а на самом деле:
DataChanged:=not CompareMem(@hd,@_hd,sizeof(hd));//SysUtils


 
Anatoly Podgoretsky ©   (2003-02-14 12:25) [7]

А ты не сможешь объявить переменную AR поскольку будет дублирование идентификаторв


 
Udjin ©   (2003-02-14 14:14) [8]

>Anatoly Podgoretsky © (14.02.03 12:25)
> А ты не сможешь объявить переменную AR поскольку
>будет дублирование идентификаторв

Это понятно.

>han_malign ©

Спасибо конечно, но как сделать не вопрос. Вопрос можно ли делать именно так?



В книге смотрел и в хелпе, везде начала определяется тип указателя, а потом объявляется переменная этого типа.
А так объявляем тип и всё?


 
Palladin ©   (2003-02-14 14:24) [9]

тип указателя всегда один! Указатель!
а вот тип указываемого содержимого бывает разный...


 
Udjin ©   (2003-02-14 14:50) [10]

А я как сказал ? :)))


Вот пример из книги "Delphi 5 Руководство разработчика" C. Тейкстра и К. Пачеко


type
PInt=^Integer; //PInt - указатель на Integer
Foo=record // Тип-запись
GoobbledyGook: string;
Snarf: Real;
end;
PFoo=^Foo; //PFoo-указатель на объект типа Foo

var
P: Pointer; // нетипизированный указатель
P2: PFoo; // Указатель нв экземпляр Foo (а у меня-то подобного
// объявления и нет.)
//Весь вопрос в том можно без него или нет


 
Udjin ©   (2003-02-17 09:57) [11]

up


 
MBo ©   (2003-02-17 10:14) [12]

procedure show1stbyte(var i:integer);
var pb:pbytearray;
begin
//вариант 1
pb:=@i;
Caption:=IntToStr(pb[0]);

//вариант 2
Caption:=IntToStr(PbyteArray(@i)[0]);
end;

используй то, что удобнее.
1 вариант лучше, если обращение многократное, а второй - при разовом, переменную заводить не нужно


 
han_malign ©   (2003-02-17 11:03) [13]

Это называется "маска типа", очень популярный прием написания нечитабельного кода, kludges - короче. Классическая заплата при неправильном проектировании. Обход строгой типизации (чем изначально славился Паскаль, и теперь введено в стандарт C++) может привести к трудно-обнаруживаемам ошибкам (не обнаруживаемым на этапе компиляции). Помимо этого затрудняет модификацию отдельных типов - приходится отслеживать приведение типов во всех модулях и все править руками...



Страницы: 1 вся ветка

Текущий архив: 2003.02.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
14-87682
Михаил
2003-02-09 22:27
2003.02.27
Сервисы в Win2k


1-87443
яяяяяяя
2003-02-18 16:31
2003.02.27
Types of actual and and formal var parameters must be identical


1-87373
radion
2003-02-14 14:26
2003.02.27
Как написать чтоб Делпхи считал гласные и согласные буквы?


3-87273
smus
2003-02-07 10:51
2003.02.27
Запрос на логин и пароль в Interbase


6-87592
Ruf
2003-01-08 14:33
2003.02.27
Socket