Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-87531
ProfiUgl
2003-02-17 09:41
2003.02.27
Количество лет, месяцев и дней между двумя датами


3-87269
Reals
2003-02-07 16:14
2003.02.27
Можно ли при помощи ADO работать с локальной *.db базой?


14-87638
gn
2003-02-06 06:09
2003.02.27
Эгоисты!!!!!!!1


1-87385
harismatik
2003-02-17 19:36
2003.02.27
Проблема с TRichEdit


14-87662
Poirot
2003-02-10 12:35
2003.02.27
Так что ж есть Delphi





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский