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

Вниз

String, TObject и т.д. - Pointer?   Найти похожие ветки 

 
Doc   (2003-06-11 17:21) [0]

Добрый вечер уважаемые Мастера!

Объясните, что является Pointer"ом, а что нет.

Часто встречаешь, что говорят PChar - Pointer (оно и ясно), и работать
надо с ним как с поинтером.

А тогда S:String

S - это Pointer или нет?

И Obj:TObject;
Form:TForm...

Это Pointer"ы и работать с ними надо как с поинтерами?

А есть ли аналог ссылок как в C++ ?

Спасибо.


 
Юрий Федоров ©   (2003-06-11 17:25) [1]

>И Obj:TObject;
> Form:TForm...
Да, это поинтеры (типизированные указатели)

>А тогда S:String
в случае включенного {$H+} - да, в противном случае нет.
(Начиная с D3 диерктива {$H+} по умолчанию включена)



 
Doc   (2003-06-11 17:44) [2]

Тогда почему

S:String;

S:="Some text", а не

S^:="Some text", чтобы обратиться к информации необходимо предварительно редеференцировать указатель....


 
han_malign ©   (2003-06-11 17:44) [3]

не советую работать со String ( {$H+}) как с Pointer, там где не уверены - в нем слишком много "compiller magic", фактически это целый клас с неявными magic методами, причем pointer(string) указывает отнюдь не на первое поле (DWORD(Pointer(DWORD(str)-4)^)=Length(str)), и при любой операции с открытой строкой вы попадете в одну из System._LStrXxx функций...


 
han_malign ©   (2003-06-11 17:47) [4]

>Тогда почему
- а потому что будет перевыделение памяти, и pointer(S) примет другое значение - "compiller magic", однако...


 
Smithson ©   (2003-06-11 17:58) [5]

А аналог ссылок С++ - это var параметры процедур и функций.


 
Doc   (2003-06-11 18:22) [6]


> han_malign © (11.06.03 17:47)
> >Тогда почему
> - а потому что будет перевыделение памяти, и pointer(S)
> примет другое значение - "compiller magic", однако...


С одной стороны это хорошо, за нас компилятор делает работу, но с другой стороны появляется недопонимание.
Так как если уже работать с String как с указателем, так и надо обращаться к информации через S^ а не просто S....


> Smithson © (11.06.03 17:58)
> А аналог ссылок С++ - это var параметры процедур и функций.


А надо ли как-то преобразовывать поинтеры, перед тем как их передаем в Var?

Вот с той же строкой, оказывается надо

procedure(s[1]^), а как быть с другими указателями?

В C++ запись ссылок и указателей отличались, так как же быть в Delphi?


 
Serginio   (2003-06-11 18:40) [7]

Есть большие отличия в синтаксисе С++ и Delphi В этом плане С# и Delphi более близки.
s[1]^ это абсурд
Если есть процедура
MyProc(Var s:String);
var s2:String;
Begin
s2:="000";
SetLength(s,89);// проходит так как содержится ссылка на переменную стринг
end;
MyProc2(s:String);
var s2:String;
Begin
s2:="000";

SetLength(s,89);// не проходит так как содержится ссылка на переменную стринг
end;


Строка обыкновенный динамический массив.

Со строками не надо работать с приведением ^ MyProc(s);
Также можно опускать
PMyType=^TmyType;
TMyType= record
s:String;
end;

var t:TMyType;
p:PMyType;
p:=@t;
p.s:="proba";
p^.s:="proba"; оба варианта правильные
тоже самое и с объектами.


 
Юрий Федоров ©   (2003-06-11 18:44) [8]

>Так как если уже работать с String как с указателем, так и
>надо обращаться к информации через S^ а не просто S....
Не нужно работать со строкой как с указателем.
Если уж тебя не устраивает предлагаемый "compiller magic", хотя случай это достаточно редкий,
работай с PCHar, и делай все руками

>>procedure(s[1]^), а как быть с другими указателями?
Ты что имеешь в виду? если
procedure DoSomething(var s : string);
то так и вызывай:
DoSomething(s)




 
Doc   (2003-06-11 19:12) [9]


> >>procedure(s[1]^), а как быть с другими указателями?
> Ты что имеешь в виду? если
> procedure DoSomething(var s : string);
> то так и вызывай:
> DoSomething(s)


А вот такого вида:


procedure DoSomething(var s);

На счет procedure(s[1]^) - прошу прощения, не прав,

procedure(s[1]) - вот так....


 
Serginio   (2003-06-11 19:26) [10]

Нет не так.
@S<>@s[1] в S содержится указатель @s[1].
procedure(s[1])
обычно при таком вызове используется следующая конструкция
procedure DoSomething(var s);
Var s2:String absolute s;



 
Serginio   (2003-06-11 19:33) [11]

Вернее все зависит от реализации например в
TStream.ReadBuffer(var Buffer; Count: Longint);
Нужно передавать
Stream.ReadBuffer(s[1],Length(s));
Все зависит на что ты хочешь получить указатель.


 
Doc   (2003-06-11 20:05) [12]


> Serginio (11.06.03 19:26)
> Нет не так.
> @S<>@s[1] в S содержится указатель @s[1].
> procedure(s[1])
> обычно при таком вызове используется следующая конструкция
> procedure DoSomething(var s);
> Var s2:String absolute s;


А что ты здесь имел ввиду?

С


> Serginio (11.06.03 19:33)
> Вернее все зависит от реализации например в
> TStream.ReadBuffer(var Buffer; Count: Longint);
> Нужно передавать
> Stream.ReadBuffer(s[1],Length(s));
> Все зависит на что ты хочешь получить указатель.


я полностью согласен.


 
Serginio   (2003-06-11 20:11) [13]

procedure DoSomething(var s);
Var s2:String absolute s;
Begin
s2:="XaXaXa"
end;

var s:String;
DoSomething(s);
ShowMessage(s);// выдаст XaXaXa





 
Doc   (2003-06-11 21:05) [14]


> Вернее все зависит от реализации


А чем отличается реализация ReadBuffer от S2:="XaXaXa"

Ведь процедуры обе объявлены с var параметром...

Или все кроется в том, что

procedure Move( const Source; var Dest; count : Integer );
var
S, D: PChar;
I: Integer;
begin
S := PChar(@Source);
D := PChar(@Dest);
.....

А в S2:="XaXaXa" - компилятор все делает сам...?


> Serginio (11.06.03 19:26)
> Нет не так.
> @S<>@s[1] в S содержится указатель @s[1].


Тогда какое препятсвие ReadBuffer если в S содержиться @S[1], как раз то что нужно....



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

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

Наверх




Память: 0.5 MB
Время: 0.017 c
3-83930
YuraKiller
2003-06-03 22:33
2003.06.26
Предоставление доступа к таблицам и процедурам.


1-84066
Dr. Andrew
2003-06-07 13:30
2003.06.26
Где ошибка при завершении Hook и как занести данные в TPoint?


3-84005
LeReve
2003-05-30 15:37
2003.06.26
Как отловить событие которове возникает именно после....


1-84169
alecs
2003-06-11 16:52
2003.06.26
Как поместить в заголовок PageControl кнопку?


3-83880
MalkoLinge
2003-06-02 16:09
2003.06.26
Проблема с кирилицей