Неожиданное поведение Result

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Неожиданное поведение Result

Сообщение Brainenjii » 29.03.2012 08:45:44

Код: Выделить всё
Program Project1;

{$mode objfpc}{$H+}

Uses
  Classes, sysutils;

Function GetString(Const aParam: Integer): String;
Begin
  Result += IntToStr(aParam);
End;

Var
  aBuffer: String;
Begin
  aBuffer := GetString(1);
  aBuffer := GetString(2);
  WriteLn(aBuffer); // <- Всё нормально, здесь '2'
End.


Код: Выделить всё
Program Project1;

{$mode objfpc} // <- поменялось только тут

Uses
  Classes, sysutils;

Function GetString(Const aParam: Integer): String;
Begin
  Result += IntToStr(aParam);
End;

Var
  aBuffer: String;
Begin
  aBuffer := GetString(1);
  aBuffer := GetString(2);
  WriteLn(aBuffer); // <- '12' (0.o)
End.
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Неожиданное поведение Result

Сообщение zub » 29.03.2012 09:09:26

Если в {$mode objfpc} по умолчанию короткие строки - компилятор их не считает нужным инициализировать. и правильно делает


Код: Выделить всё
Begin
  Result += IntToStr(aParam);
End;

Смысл этой конструкции только в огребании таких неожиданностей)), почему не
Код: Выделить всё
Begin
  Result := IntToStr(aParam);
End;

?
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: Неожиданное поведение Result

Сообщение SSerge » 29.03.2012 09:11:26

Вообще то второй вариант тоже правильный. :)

Потому что у вас переменной Result не присвоено значение перед использованием в качестве операнда. А потому ее содержимое имеет право на любой случайный мусор.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Неожиданное поведение Result

Сообщение Brainenjii » 29.03.2012 09:15:28

ну, вообще там где встретил функция была посложнее ^_^ Просто не инициировал Result для строк - всегда пользуюсь {H+} поэтому как-то привык, что строка всегда пустая. А тут совпало - и код без {$H+} выполнялся, и Result был не инициализирован - и глаза на лоб полезли ^_^
Умом понимаю, что не баг и все правильно, но все-равно неожиданно ^_^
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Неожиданное поведение Result

Сообщение SSerge » 29.03.2012 09:19:05

Ну я как то привык еще с Прототипа. в Borland Pascal начиная с 6.0, imho, уже было заявлено, что содержимое неинициализированных переменных любого типа может быть случайным.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Неожиданное поведение Result

Сообщение zub » 29.03.2012 09:21:03

в {$H+}string после инициализации мусора быть не может, только '' (nil)
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru