Форум: "Основная";
Текущий архив: 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.026 c