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

Вниз

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

Наверх




Память: 0.48 MB
Время: 0.03 c
14-84738
killer
2003-06-06 00:54
2003.06.26
TBLODStream


1-84405
Knight
2003-06-09 12:50
2003.06.26
Хранение панели настроек плугина в самой DLL


14-84541
race1
2003-06-07 08:32
2003.06.26
XP Style


1-84361
Chlavik
2003-06-16 17:02
2003.06.26
Как мне поступить ? (классы)


11-84056
Эмиль
2002-07-26 16:36
2003.06.26
Обработка системных сообщений





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