Главная страница
    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.68 MB
Время: 0.051 c
8-1142791800
foull
2006-03-19 21:10
2006.10.15
работа с mp3 тэгами


2-1159467945
Ezorcist
2006-09-28 22:25
2006.10.15
Выдернуть подструку из строки


2-1159510933
vodvorezlaya
2006-09-29 10:22
2006.10.15
Как сделать закрытие формы по нажатию Esc?


2-1159348886
webpauk
2006-09-27 13:21
2006.10.15
Что использовать?


2-1159519479
wild_arg
2006-09-29 12:44
2006.10.15
IBEvent





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