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

Вниз

Почему функция возвращает данные, которые ей недоступны   Найти похожие ветки 

 
gosha67   (2006-09-26 16:49) [0]

Здравствуйте уважаемые.
Я программист с некоторым опытом, но только сегодня я обнаружил сие недоразумение. Объясните мне пожалуйста почему в конечном итоге Data := "some text bla bla bla ...."? По идее она должна быть равно только "bla bla bla". Загадка какая-то.
function GetSomeData: string;
var i : integer;
begin
 for i := 1 to 20 do
 begin
   Result := Result + " bla bla bla";
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Data : string;
begin
 Data := "some text";
 Data := GetSomeData;
 ShowMessage(Data);
end;


 
Игорь Шевченко ©   (2006-09-26 16:52) [1]


> По идее она должна быть равно только "bla bla bla".


Не должна.


> Загадка какая-то.


Чтобы не было загадки, надо переписать функцию:

function GetSomeData: string;
var i : integer;
begin
Result := ""; for i := 1 to 20 do
begin
  Result := Result + " bla bla bla";
end;
end;


 
Джо ©   (2006-09-26 16:56) [2]

> Я программист с некоторым опытом, но только сегодня я обнаружил
> сие недоразумение. Объясните мне пожалуйста почему в конечном
> итоге Data := "some text bla bla bla ...."? По идее она
> должна быть равно только "bla bla bla". Загадка какая-то.

Псевдо-переменная Result не инициализируется автоматически.


 
Уч   (2006-09-27 05:21) [3]

Стало быть этим можно пользоваться вместо параметров при вызове функции? Будет ли результат гарантирован или компилятор может какой-нибудь изврат придумать?


 
Пользователь   (2006-09-27 09:49) [4]

Стало быть этим можно пользоваться вместо параметров при вызове функции?

Чем вам не нравится использование параметров?

компилятор может какой-нибудь изврат придумать?

Если таким методом злоупотреблять, то, порой, компилятор начинает вписывать нецензурные слова. Правда, по-английски, но, все равно, перед пользователями неудобно...

Будет ли результат гарантирован?

Встреча с "восхищенными" пользователями вашей программы в темном корридоре без свидетелей - будет гарантирована точно. Но, при таком подходе к программированию, их (пользователей) будет немного. Так что, вероятно, вам удастся выжить.


 
zamtmn ©   (2006-09-27 10:58) [5]

>>Псевдо-переменная Result не инициализируется автоматически.
если cтринговая переменная не проинициализирована, то инициализировать ее нужно pointer(strvar):=nil, strvar:="" можно словить av


 
Игорь Шевченко ©   (2006-09-27 11:18) [6]


> если cтринговая переменная не проинициализирована, то инициализировать
> ее нужно pointer(strvar):=nil, strvar:="" можно словить
> av


пример av в студию


 
Johnmen ©   (2006-09-27 11:24) [7]


> Джо ©   (26.09.06 16:56) [2]
> Псевдо-переменная Result не инициализируется автоматически.


Строго говоря, инициализируется. Значением той переменной, которой присваивается возвращаемое ф-ей значение. По кр. мере так в D6.
Об этом говорит Sha ©.


 
oxffff ©   (2006-09-27 11:25) [8]

Сделай safecall. И будет тебе bla bla bla
function GetSomeData: string;safecall;
var i : integer;
begin
for i := 1 to 20 do
begin
  Result := Result + " bla bla bla";
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Data : string;
begin
Data := "some text";
Data := GetSomeData;
ShowMessage(Data);
end;


 
Игорь Шевченко ©   (2006-09-27 11:29) [9]

Johnmen ©   (27.09.06 11:24) [7]

Вообще-то об этом говорит и Borland :)


 
Johnmen ©   (2006-09-27 11:31) [10]


> Игорь Шевченко ©   (27.09.06 11:29) [9]
> Johnmen ©   (27.09.06 11:24) [7] Вообще-то об этом говорит
> и Borland :)


Возможно. Только я Борланда не читаю...:))


 
oxffff ©   (2006-09-27 11:32) [11]

Вам поможет safecall, который очищает result параметр перед вызовом.
Cмотрите oxffff ©   (27.09.06 11:25) [8]


 
oxffff ©   (2006-09-27 11:38) [12]

А что касаемо сабжа. Автору лучше посмотреть на asm и станет все понятно

register
leax eax,[data]
call GetSomeData

safecall
leax eax,[data]
call LstrClr
push eax
call GetSomeData
....


 
oxffff ©   (2006-09-27 11:40) [13]

прошу прощения за опечатку естественно LEA, а не leax


 
zamtmn ©   (2006-09-27 11:54) [14]

>>пример av в студию
program Project2;
{$APPTYPE CONSOLE}
uses
 SysUtils;
var strvar:string;
   i:Cardinal;
begin
    for i:=1 to 100000 do
    //будем перебирать варианты неинициализированной strvar
    //хотя ошибку словим уже на первом:)
    begin
      pointer(strvar):=pointer(i);
      strvar:="";
    end;
end.


 
ЮЮ ©   (2006-09-27 11:58) [15]

//будем перебирать варианты неинициализированной strvar
> pointer(strvar):=pointer(i);


Ничего себе "переборчик" :)


 
zamtmn ©   (2006-09-27 12:04) [16]

а что такого? эмуляция неинициализированности:)
как сказано в [7] result:string автоматически инициализируемая переменная, иначе result:="" не прокатило бы


 
Игорь Шевченко ©   (2006-09-27 12:06) [17]

zamtmn ©   (27.09.06 11:54) [14]


>     for i:=1 to 100000 do
>     //будем перебирать варианты неинициализированной strvar
>     //хотя ошибку словим уже на первом:)
>     begin
>       pointer(strvar):=pointer(i);
>       strvar:="";
>     end;


Я не вижу неинициализированной strvar, первой же строкой из цикла ты ее "инициализируешь" в недопустимое значение.
Советую посмотреть CPU Window и понять, что так делать нельзя.


 
Игорь Шевченко ©   (2006-09-27 12:08) [18]

zamtmn ©   (27.09.06 12:04) [16]


> как сказано в [7] result:string автоматически инициализируемая
> переменная, иначе result:="" не прокатило бы


Ты прочитай [7] два раза вдумчиво. Пойми, где используется слово Result и почему оно инициализируется.


 
zamtmn ©   (2006-09-27 12:15) [19]

>>Я не вижу неинициализированной strvar, первой же строкой из цикла ты ее "инициализируешь" в недопустимое значение.
Советую посмотреть CPU Window и понять, что так делать нельзя.
а ты увидь, если бы компилятор не позаботился о result, то result вполне бы указывал на недопустимое значение.
в делфи любой стринг локальный, глобальный инициализируется автоматически, неинициализированный стринг можно получить только создав его динамически.
>>Советую посмотреть CPU Window и понять, что так делать нельзя.
я какраз туда регулярно заглядываю, это вообщето был пример неинициализированного стринга


 
oxffff ©   (2006-09-27 12:23) [20]

В [7] написано некорре
ктно
Строго говоря, инициализируется. Значением той переменной, которой присваивается возвращаемое ф-ей значение. По кр. мере так в D6.
Об этом говорит Sha ©.

Оно ничем не инициализируется. В данном случае возвращаемое значение это синоним Data.


 
Игорь Шевченко ©   (2006-09-27 12:29) [21]

zamtmn ©   (27.09.06 12:15) [19]


> если бы компилятор не позаботился о result, то result вполне
> бы указывал на недопустимое значение

В твоем примере слова Result нету, это раз.


> глобальный инициализируется автоматически


В твоем примере strvar объявлен, как глобальный, значит, уже проинициализирован, это два.

Ты не используй сослагательного наклонения, ты пример приведи без извратов, чтобы подтвердить свою точку зрения из поста [5]


> если cтринговая переменная не проинициализирована, то инициализировать
> ее нужно pointer(strvar):=nil, strvar:="" можно словить
> av


 
oxffff ©   (2006-09-27 12:34) [22]

Когда объявляется

a:string;
begin
....

то происходит

Push 0, а не sub esp,4.

Поэтому переменная A уже инициализированна


 
zamtmn ©   (2006-09-27 12:38) [23]

в [5] нет "слова Result" там говорится прои инициализацию. var:="" ты присвоишь значение, но не инициализируешь стринг


 
Игорь Шевченко ©   (2006-09-27 12:45) [24]

zamtmn ©   (27.09.06 12:38) [23]

Код будет или будут длинные рассуждения ?


> var:="" ты присвоишь значение, но не инициализируешь стринг


Внимательно читать раздел Declaring and initializing strings в родной справке.


 
oxffff ©   (2006-09-27 12:49) [25]

Тогда мы объявляем

var a:string;
begin

Он инициализирован. Cм. oxffff ©   (27.09.06 12:34) [22]

если делаем так

var a:pstring;
begin
new(a);

Он тоже инициализирован.

А вот если делаем так

var a:string;
    p:pointer;
begin
pointer(a):=p;

тогда естественно  DWORD(a):=0;


 
zamtmn ©   (2006-09-27 12:57) [26]

Игорь Шевченко ©   (27.09.06 12:45) [24]

>>Код будет или будут длинные рассуждения ?
код с неинициализированным стрингом был.
>>Внимательно читать раздел Declaring and initializing strings в родной справке.
внимательно читать [19]


 
Игорь Шевченко ©   (2006-09-27 13:02) [27]

zamtmn ©   (27.09.06 12:57) [26]


> код с неинициализированным стрингом был.


Не было. Был код с глобальной переменной типа string, которая и без того инициализирована. А твои действия с pointer, это, извини, твои фантазии. Нафантазировать можно много чего, но причем здесь реальные ситуации, я не понимаю.


 
zamtmn ©   (2006-09-27 13:11) [28]

>>Не было. Был код с глобальной переменной типа string, которая и без того
>>инициализирована.
после действий с поинтером, она таковой быть перестала.

var ps:pstring;
begin
      getmem(ps,sizeof(string));
      //вот тебе неинициализированная ps^;
      {pointer(ps^):=nil;}
      ps^:="";
      //а вот тут частенько будут av
      //а если раскоментировать строку выше то их небудет.
..................
хочу заметить, я не говорил что в [0] нужно делать pointer(result):=nil, я говорил о неинициализированных переменных


 
clickmaker ©   (2006-09-27 13:19) [29]


> если cтринговая переменная не проинициализирована, то инициализировать
> ее нужно pointer(strvar):=nil, strvar:="" можно словить
> av

чё за бред?


 
Игорь Шевченко ©   (2006-09-27 13:23) [30]

zamtmn ©   (27.09.06 13:11) [28]

Ты примеры из пальца высасываешь ? В твоем примере AV будет всегда, потому что разыменование неинициализированного указателя гарантировано вызовет AV.

Ты получил указатель, ссылащийся неизвестно куда, но в строчке

>    ps^:="";


ты почему-то считаешь, то он указывает на string.

Так нельзя делать.


 
Johnmen ©   (2006-09-27 13:26) [31]


> zamtmn ©   (27.09.06 13:11) [28]


А где здесь переменная типа string?


 
Palladin ©   (2006-09-27 13:29) [32]


> zamtmn ©   (27.09.06 13:11) [28]

а причем здесь pstring если речь в ветке идет о простом string? да и на кой нужен getmem если делается проще: new(ps)


 
zamtmn ©   (2006-09-27 13:36) [33]

>>Ты получил указатель, ссылащийся неизвестно куда, но в строчке
здрасте... он указывает на стринг который компилятором не проинициализирован.


 
Palladin ©   (2006-09-27 13:50) [34]

не нужно очевидностей не имеющих отношения к теме, все что ты сказал относится к любому указателю...


> он указывает на стринг

раз пошла речь о банальнастях то он указывает не на стринг, а на область памяти, которую компилятор будет считать переменной типа стринг при выделении памяти, а заполнить ты ее можешь чем угодно, хоть ссылкой на объект


 
zamtmn ©   (2006-09-27 13:52) [35]

var ps:pbyte;
begin
     getmem(ps,sizeof(byte));
     ps^:=255;
..................
тут тоже неизвестно куда?


 
clickmaker ©   (2006-09-27 13:52) [36]


> здрасте... он указывает на стринг который компилятором не
> проинициализирован

матерь божья... сколько можно пургу гнать?


 
Palladin ©   (2006-09-27 13:56) [37]


> clickmaker ©   (27.09.06 13:52) [36]


да он кому-то что-то доказывает... не понятно, только, что именно :)


 
zamtmn ©   (2006-09-27 13:58) [38]

>>раз пошла речь о банальнастях то он указывает не на стринг, а на
>>область памяти, которую компилятор
а что тогда есть стринг:)?
да меня под чютким подначиванием Игорь Шевченко © вильнуло в сторону от сабжа. я уж и не помню кто сказал что result не проинициализированна. она проинициализирована, только содержит неопределенное значение


 
Palladin ©   (2006-09-27 14:02) [39]


> zamtmn © [38]


Result не является указателем на стринг, равно как и b:byte, тоже не является указателем, это раз, два: стринг (в отличии от указателя на стринг) есть указатель на область памяти содержащую набор символов...
и Result действительно не проинициализирован, но на AV присвоением ему значения ты никоим образом нарваться не можешь


 
zamtmn ©   (2006-09-27 14:09) [40]

>>и Result действительно не проинициализирован
дубль 2
ps=pstring;
getmem(ps,sizeof(string));
ps^ - это стринг и не проинициализированый
а result из [0] проинициализированый, что прекрасно видно в debug cpu window


 
oxffff ©   (2006-09-27 14:10) [41]

Palladin ©   (27.09.06 14:02) [39]
> zamtmn © [38]
и Result действительно не проинициализирован, но на AV присвоением ему значения ты никоим образом нарваться не можешь.

Хочу поправить

Result в данном случае является синонимом data переданный по ссылке.
Data инициализирован.
см. oxffff ©  [22]  [25].


 
Palladin ©   (2006-09-27 14:17) [42]


> oxffff ©   (27.09.06 14:10) [41]

я верю и неспорю, но в данном случае это не важно, а важно то что компилятор ведет работу с ним, как с обыкновенной строкой...


> дубль 2

ты объяснишь мне причем pstring-то, как он вообще относится к теме ветки? никто же не утверждает что при обращении за область видимой вселенной все будет хорошо...


 
oxffff ©   (2006-09-27 14:39) [43]

zamtmn видимо хотел предоставить такой пример

var a:pstring;
begin
getmem(a,4);
DWORD(a^):=0;
a^:=GetSomeData;
ShowMessage(a^);
a^:="";
freemem(a);

Утверждать, что никто так не напишет невозможно.
Правда и компилер другой генерит, создавая временную переменную.
Таким образом если написать так, что не будет проблем сабжа

То есть

var a:pstring;
begin
getmem(a,4);
DWORD(a^):=0;
a^:="some text";
a^:=GetSomeData;
ShowMessage(a^);
a^:="";
freemem(a);

Будет только bla bla bla....

то есть так сабжа можно избежать. или использовать safecall.


 
oxffff ©   (2006-09-27 14:45) [44]

Уважаемые давно хочу спросить как получить значок мастер Delphi. :)


 
Palladin ©   (2006-09-27 14:48) [45]


> oxffff ©   (27.09.06 14:39) [43]


этот пример никоим образом не коррелирует с высказыванием из [5] по поводу AV, и тема совсем другая, о чем и разгорелся спор... говорить одно, а доказывать другое не правильно


 
clickmaker ©   (2006-09-27 14:48) [46]


> [44] oxffff ©   (27.09.06 14:45)

что правда не знаешь?
поставить ящик пива админу или за смешную сумму в webmoney


 
oxffff ©   (2006-09-27 14:51) [47]


> Palladin ©   (27.09.06 14:48) [45]
>
> > oxffff ©   (27.09.06 14:39) [43]
>
>
> этот пример никоим образом не коррелирует с высказыванием
> из [5] по поводу AV, и тема совсем другая, о чем и разгорелся
> спор... говорить одно, а доказывать другое не правильно


Тут я не могу не согласиться.


 
Игорь Шевченко ©   (2006-09-27 16:25) [48]

zamtmn ©   (27.09.06 14:09) [40]


> ps=pstring;
> getmem(ps,sizeof(string));
> ps^ - это стринг и не проинициализированый


Нет, это не стринг. Изучай, как стринги устроены.

Если ты напишешь код вида

type
 PTList = ^TList;
var
 pl: PTList;
begin
 getmem(pl, sizeof(TList));
 ...
end;

и будешь утверждать, что pl^ - это TList, только не инициализированный, то бегом изучать матчасть.


 
@!!ex ©   (2006-09-27 16:56) [49]

zamtmn ©
реально бред какой то...


 
zamtmn ©   (2006-09-27 18:32) [50]

>>и будешь утверждать, что pl^ - это TList, только не инициализированный, то бегом изучать матчасть.
ненадо приплетать сюда классы.
var
   s:string;
   ps:pstring;
чем будут отличатся s и ps^?


 
Игорь Шевченко ©   (2006-09-27 18:48) [51]

zamtmn ©   (27.09.06 18:32) [50]


> чем будут отличатся s и ps^?


тем, что ps может указывать на некорректную структуру строки вообще.
Почитай матчасть наконец, в system.pas все написано.

Тебе было предложено привести код, с которым можно получить av, без фантазий типа pointer(str) := хрен_знает_что.
Кода нет.


 
zamtmn ©   (2006-09-27 19:11) [52]

>>тем, что ps может указывать на некорректную структуру строки вообще.
так это и есть не инициализированная строка.
getmem(ps,sizeof(string));
ps^:="";
чем не код? тем что ты так никонгда не писал?


 
@!!ex ©   (2006-09-27 19:13) [53]

В коде:
zamtmn ©   (27.09.06 11:54) [14]
переменная указывает хзкуда, и не удивительно что мы получаем AV при обращение хзкуда....

По поводу:
zamtmn ©   (27.09.06 12:04) [16]
При присвоении значения стрнгу указывающему в nil AV не будет. По понятным причинам.


 
@!!ex ©   (2006-09-27 19:16) [54]

zamtmn ©   (27.09.06 12:15) [19]
Как вы верно заметили, в Дельфи неинициализированную строку можно получить только создавая ее динамически.
А тут о динамическом создании речи вроде не шло совсем...


 
Игорь Шевченко ©   (2006-09-27 23:41) [55]

zamtmn ©   (27.09.06 19:11) [52]

Ты все-таки матчасть учить не хочешь. Ты выделил 4 байта, забывая о том, что размер структуры для string немножко больше, чем 4 байта. Я тебе не зря привел пример с TList, для иллюстрации твоей ошибки.


 
Германн ©   (2006-09-28 01:27) [56]


> Игорь Шевченко ©   (27.09.06 23:41) [55]
>
> zamtmn ©   (27.09.06 19:11) [52]
>
> Ты все-таки матчасть учить не хочешь.

Не он первый, не он последний такой. Уже что-то знающий, но ещё не понявший как мало он знает. И некоторые из них впоследствии стали вполне уважаемыми участниками форума. (Правда, по крайней мере некоторые, предпочли сменить "запятнанный" ник на другой :-). А уж проблемы с "терминологией" тут на форуме очень часты.


 
Ketmar ©   (2006-09-28 04:10) [57]

>[56] Германн(c) 28-Sep-2006, 01:27
>предпочли сменить "запятнанный" ник на другой
неаясно только, зачем. имо, если некто был чайником, а стал вполне продвинутым -- то это только плюс к репутации. %-)


 
zamtmn ©   (2006-09-28 07:55) [58]

>>Ты все-таки матчасть учить не хочешь. Ты выделил 4 байта, забывая о
>>том, что размер структуры для string немножко больше, чем 4 байта. Я
>>тебе не зря привел пример с TList, для иллюстрации твоей ошибки.
да чтож вы за люди та, просили пример с av на неинициализированном string. вот он. после pointer(ps^):=nil; ps^ становится вполне нормальным стрингом с которым можно работать


 
zamtmn ©   (2006-09-28 08:21) [59]

>>> чем будут отличатся s и ps^?
>>тем, что ps может указывать на некорректную структуру строки вообще.
а чем отличается не инициализированная строка от инициализированной? говорить о том что result не инициализируется не верно
>>Почитай матчасть наконец, в system.pas все написано
с чего ты взял что я его не читал?


 
Palladin ©   (2006-09-28 08:33) [60]


> а чем отличается не инициализированная строка от инициализированной?
>  говорить о том что result не инициализируется не верно

Инициализация переменной всегда являлась и будет являться впредь  назначением ей первоначального значения перед последующими операциями с ней.


 
zamtmn ©   (2006-09-28 08:53) [61]

>>Инициализация переменной всегда являлась и будет являться впредь  назначением ей первоначального значения перед последующими операциями с ней.
для простых типов да, для сложных еще и вызов конструктора


 
Palladin ©   (2006-09-28 08:59) [62]

нет, понятие объекта не является понятием переменной

var
r:TList
e:TList;

e:=TList.Create;
r:=Nil; // я ее проинициализировал
r:=e; // и тут я ее тоже проинициализировал
r:=TList(3423523); // и здесь я ее тоже проинициализировал

и при последующих обращениях к переменной r я буду расчитывать что содержит она именно то что я и предполагаю в ней увидеть


 
Palladin ©   (2006-09-28 09:07) [63]

о чем и сказал Джо, при вызове функции Result не инициализирован, он может не содержать (а в большинстве случаев так оно и есть) пустую строку на которое расчитывал автор ветки...


 
zamtmn ©   (2006-09-28 09:10) [64]

var s:string;
begin
     s:=""; тут ты ниче не проинициализировал, s уже была проинициализирована компилятором, ты присвоил значение


 
zamtmn ©   (2006-09-28 09:12) [65]

а я говорю, что в делфи нету неинициализированных стрингов, а если они появляются, то нужно их обнулить


 
Palladin ©   (2006-09-28 09:15) [66]

Хорошо, тогда война разгорелась из-за терминологии.


 
zamtmn ©   (2006-09-28 09:24) [67]

>>нет, понятие объекта не является понятием переменной
объекта какраз является, ты говоришь о классах


 
Ketmar ©   (2006-09-28 09:44) [68]

>[64] zamtmn(c) 28-Sep-2006, 09:10
>var s:string;
>begin
>      s:=""; тут ты ниче не проинициализировал, s
>уже была проинициализирована компилятором, ты
>присвоил значение
только в том случае, если s -- глобальная. иначе в неё радостно попадает мусор со стека.


 
Palladin ©   (2006-09-28 09:48) [69]


> zamtmn ©   (28.09.06 09:24) [67]

какого объекта? ты о чем?

r:=TList(3423523);

какой тут объект? причем здесь объект? я просто использую r как целочисленную переменную, причем тут объект?


 
Johnmen ©   (2006-09-28 09:53) [70]


> Palladin ©   (28.09.06 09:07) [63]
> о чем и сказал Джо, при вызове функции Result не инициализирован


В данном рассматриваемом случае [0] Result инициализирован.
О чём уже было сказано и мной, и Sha, и Игорем Шевченко, и Borland"ом :)


 
Palladin ©   (2006-09-28 09:54) [71]

Значение его не инициализированно...


 
Ketmar ©   (2006-09-28 09:56) [72]

>[70] Johnmen(c) 28-Sep-2006, 09:53
>В данном рассматриваемом случае [0] Result
>инициализирован.
это не есть документированное поведение. мало ли, какой там код компилятор генерирует сейчас, и какой код появится потом...


 
zamtmn ©   (2006-09-28 09:59) [73]

>>только в том случае, если s -- глобальная. иначе в неё радостно попадает мусор со стека.
глобальная, локальная - без разницы, будет проинициализирована. C неопределенным значением в случае [0]. если в стринге мусор - будет av

>>какого объекта? ты о чем?
>>>нет, понятие объекта не является понятием переменной
тут ты имеешь ввиду class а не object


 
Johnmen ©   (2006-09-28 10:01) [74]


> Ketmar ©   (28.09.06 09:56) [72]
> это не есть документированное поведение.


Если об этом говорит сам Борланд, то документированное.


 
Ketmar ©   (2006-09-28 10:02) [75]

хм. "инициализация мусором" -- это новое слово в терминологии.

зыж вот интересно, тут идёт попытка доказать глупость просто из вредности, или как?


 
Ketmar ©   (2006-09-28 10:02) [76]

>[74] Johnmen(c) 28-Sep-2006, 10:01
>Если об этом говорит сам Борланд, то
>документированное.
э-э-э... а можно раздел справки, где это сказано? или хотя бы цитату?


 
zamtmn ©   (2006-09-28 10:06) [77]

>>зыж вот интересно, тут идёт попытка доказать глупость просто из вредности, или как?
тут идет подмена понятия инициализации присвоением начального значения


 
Johnmen ©   (2006-09-28 10:06) [78]


> Ketmar ©   (28.09.06 10:02) [76]


Ты вообще ветку с начала читал?
Обрати внимание на [9] и [10]. Теперь понимаешь, к кому надо обращаться с этой просьбой? :)))


 
Ketmar ©   (2006-09-28 10:10) [79]

>[78] Johnmen(c) 28-Sep-2006, 10:06
>Ты вообще ветку с начала читал?
да читал, вроде. %-)

>Обрати внимание на [9] и [10]. Теперь понимаешь,
>к кому надо обращаться с этой просьбой? :)))
ну, Игорь придёт -- прочитает. пояснит, надеюсь. %-)


 
Palladin ©   (2006-09-28 10:51) [80]


> тут ты имеешь ввиду class а не object


угу... прошу прощения... смысл в том, что объявить переменную ты можешь одного типа, а инициализировать любыми данными


 
Игорь Шевченко ©   (2006-09-28 10:57) [81]

Ketmar ©   (28.09.06 10:10) [79]


> ну, Игорь придёт -- прочитает. пояснит, надеюсь. %-)


Говорит об этом Борланд. Только не в Help, а в news-groups и на bdn.borland.com, что если функция возвращает строку, то возвращаемое значение передается скрытым параметром. Причем такое поведение у всех паскалей (борландовских, за других не знаю). Тебя же не удивляет, что каждому методу класса передается неявный параметр Self, вот и тут то же самое.


> это не есть документированное поведение. мало ли, какой
> там код компилятор генерирует сейчас, и какой код появится
> потом...


Ну это да. Но обычно стараются выдерживать совместимость с предыдущими версиями, нес па ?


 
Ketmar ©   (2006-09-28 11:36) [82]

>[81] Игорь Шевченко(c) 28-Sep-2006, 10:57
>Говорит об этом Борланд. Только не в Help, а в
>news-groups и на bdn.borland.com
а-а-а. так с этого и надо было начинать. а то я уже пол-справки перерыл. %-)

>за других не знаю). Тебя же не удивляет, что
>каждому методу класса передается неявный параметр
да я, как бы, немного в курсе всей этой механики. меня удивило именно упоминание, что борланд говорит. я решил, что прямо в справке говорит. был неправ -- о справке не было ни слова. %-)

>Ну это да. Но обычно стараются выдерживать
>совместимость с предыдущими версиями, нес па ?
оно-то так. но полагаться на это с вероятностью 100% я бы не стал. %-)



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

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

Наверх




Память: 0.7 MB
Время: 0.031 c
2-1159128425
Vovan#1
2006-09-25 00:07
2006.10.15
И всё-таки он бажный (про одно предупреждение)


3-1155536671
rsa_
2006-08-14 10:24
2006.10.15
что наиболее надежнее эффективнее? MySQL or MSSQL?


6-1147754944
DelphiN!
2006-05-16 08:49
2006.10.15
Прикрепление атача к письму через компонент idSmtp 10х Индей


15-1158680769
Marser
2006-09-19 19:46
2006.10.15
Читабельно или красиво - что приоритетнее?


1-1157366830
Кабанчик
2006-09-04 14:47
2006.10.15
Синхронизация компонентов