![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему функция возвращает данные, которые ей недоступны [D7, Win2k, WinXP]
gosha67 © (2006-09-26 16:49:00)Здравствуйте уважаемые.
Я программист с некоторым опытом, но только сегодня я обнаружил сие недоразумение. Объясните мне пожалуйста почему в конечном итоге 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;
Ketmar (2006-09-28 11:36:00) [1]>[81] Игорь Шевченко(c) 28-Sep-2006, 10:57
>Говорит об этом Борланд. Только не в Help, а в
>news-groups и на bdn.borland.com
а-а-а. так с этого и надо было начинать. а то я уже пол-справки перерыл. %-)
>за других не знаю). Тебя же не удивляет, что
>каждому методу класса передается неявный параметр
да я, как бы, немного в курсе всей этой механики. меня удивило именно упоминание, что борланд говорит. я решил, что прямо в справке говорит. был неправ -- о справке не было ни слова. %-)
>Ну это да. Но обычно стараются выдерживать
>совместимость с предыдущими версиями, нес па ?
оно-то так. но полагаться на это с вероятностью 100% я бы не стал. %-)
Игорь Шевченко (2006-09-28 10:57:00) [2]Ketmar © (28.09.06 10:10) [79]
> ну, Игорь придёт -- прочитает. пояснит, надеюсь. %-)
Говорит об этом Борланд. Только не в Help, а в news-groups и на bdn.borland.com, что если функция возвращает строку, то возвращаемое значение передается скрытым параметром. Причем такое поведение у всех паскалей (борландовских, за других не знаю). Тебя же не удивляет, что каждому методу класса передается неявный параметр Self, вот и тут то же самое.
> это не есть документированное поведение. мало ли, какой
> там код компилятор генерирует сейчас, и какой код появится
> потом...
Ну это да. Но обычно стараются выдерживать совместимость с предыдущими версиями, нес па ?
Palladin (2006-09-28 10:51:00) [3]
> тут ты имеешь ввиду class а не object
угу... прошу прощения... смысл в том, что объявить переменную ты можешь одного типа, а инициализировать любыми данными
Ketmar (2006-09-28 10:10:00) [4]>[78] Johnmen(c) 28-Sep-2006, 10:06
>Ты вообще ветку с начала читал?
да читал, вроде. %-)
>Обрати внимание на [9] и [10]. Теперь понимаешь,
>к кому надо обращаться с этой просьбой? :)))
ну, Игорь придёт -- прочитает. пояснит, надеюсь. %-)
Johnmen (2006-09-28 10:06:00) [5]
> Ketmar © (28.09.06 10:02) [76]
Ты вообще ветку с начала читал?
Обрати внимание на [9] и [10]. Теперь понимаешь, к кому надо обращаться с этой просьбой? :)))
zamtmn (2006-09-28 10:06:00) [6]>>зыж вот интересно, тут идёт попытка доказать глупость просто из вредности, или как?
тут идет подмена понятия инициализации присвоением начального значения
Ketmar (2006-09-28 10:02:00) [7]хм. "инициализация мусором" -- это новое слово в терминологии.
зыж вот интересно, тут идёт попытка доказать глупость просто из вредности, или как?
Ketmar (2006-09-28 10:02:00) [8]>[74] Johnmen(c) 28-Sep-2006, 10:01
>Если об этом говорит сам Борланд, то
>документированное.
э-э-э... а можно раздел справки, где это сказано? или хотя бы цитату?
Johnmen (2006-09-28 10:01:00) [9]
> Ketmar © (28.09.06 09:56) [72]
> это не есть документированное поведение.
Если об этом говорит сам Борланд, то документированное.
zamtmn (2006-09-28 09:59:00) [10]>>только в том случае, если s -- глобальная. иначе в неё радостно попадает мусор со стека.
глобальная, локальная - без разницы, будет проинициализирована. C неопределенным значением в случае [0]. если в стринге мусор - будет av
>>какого объекта? ты о чем?
>>>нет, понятие объекта не является понятием переменной
тут ты имеешь ввиду class а не object
Ketmar (2006-09-28 09:56:00) [11]>[70] Johnmen(c) 28-Sep-2006, 09:53
>В данном рассматриваемом случае [0] Result
>инициализирован.
это не есть документированное поведение. мало ли, какой там код компилятор генерирует сейчас, и какой код появится потом...
Palladin (2006-09-28 09:54:00) [12]Значение его не инициализированно...
Johnmen (2006-09-28 09:53:00) [13]
> Palladin © (28.09.06 09:07) [63]
> о чем и сказал Джо, при вызове функции Result не инициализирован
В данном рассматриваемом случае [0] Result инициализирован.
О чём уже было сказано и мной, и Sha, и Игорем Шевченко, и Borland'ом :)
Palladin (2006-09-28 09:48:00) [14]
> zamtmn © (28.09.06 09:24) [67]
какого объекта? ты о чем?
r:=TList(3423523);
какой тут объект? причем здесь объект? я просто использую r как целочисленную переменную, причем тут объект?
Ketmar (2006-09-28 09:44:00) [15]>[64] zamtmn(c) 28-Sep-2006, 09:10
>var s:string;
>begin
> s:=''; тут ты ниче не проинициализировал, s
>уже была проинициализирована компилятором, ты
>присвоил значение
только в том случае, если s -- глобальная. иначе в неё радостно попадает мусор со стека.
zamtmn (2006-09-28 09:24:00) [16]>>нет, понятие объекта не является понятием переменной
объекта какраз является, ты говоришь о классах
Palladin (2006-09-28 09:15:00) [17]Хорошо, тогда война разгорелась из-за терминологии.
zamtmn (2006-09-28 09:12:00) [18]а я говорю, что в делфи нету неинициализированных стрингов, а если они появляются, то нужно их обнулить
zamtmn (2006-09-28 09:10:00) [19]var s:string;
begin
s:=''; тут ты ниче не проинициализировал, s уже была проинициализирована компилятором, ты присвоил значение
Palladin (2006-09-28 09:07:00) [20]о чем и сказал Джо, при вызове функции Result не инициализирован, он может не содержать (а в большинстве случаев так оно и есть) пустую строку на которое расчитывал автор ветки...