Форум: "Основная";
Текущий архив: 2003.02.27;
Скачать: [xml.tar.bz2];
Внизработа с указателями Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c