Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.04.01;
Скачать: [xml.tar.bz2];

Вниз

Почему «Return value must be undefined»?   Найти похожие ветки 

 
И. Павел ©   (2011-12-12 10:10) [0]

Вроде бы функция линейная. Единственное — может прерваться выполнение сгенерированным исключением. Но перехвата исключения в функции нет. Т.е. в любом случае выполнение либо дойдет до end, и тогда result := не удастся миновать, либо возникнет исключение и тогда уже не важно, возвращает функция что-то или нет. Но при проверке кода Delpgi XE выдает warning...

function TSEDDeloMonitoringYITService.GetLastHDMes: TDateTime;
var Reg: TRegistry;
begin
 Reg := TRegistry.Create;
 try
   Reg.RootKey := HKEY_LOCAL_MACHINE;
   if not Reg.OpenKey("SOFTWARE\YITMonitoring", False) then
     raise Exception.Create("Не удалось открыть раздел реестра «HKEY_LOCAL_MACHINE\SOFTWARE\YITMonitoring»");
   result := Reg.ReadInteger("day") + Reg.ReadInteger("sec") / 60 / 60 / 24;
   Reg.CloseKey;
 finally
   Reg.Free;
 end;
end;


 
Медвежонок Пятачок ©   (2011-12-12 10:18) [1]

Оно говорит, что при определнных фазах венеры результат не получит никакого значения


 
Anatoly Podgoretsky ©   (2011-12-12 10:20) [2]

Вот оно


 
И. Павел ©   (2011-12-12 10:23) [3]

> [1] Медвежонок Пятачок ©   (12.12.11 10:18)
> Оно говорит, что при определнных фазах венеры результат
> не получит никакого значения

Это я понимаю. Но при каких фазах?
Если бы вместо finally стоял except то было бы ясно.
Похоже, все дело в raise. Если его удалить, warning исчезает. Но какая разница, задал ли я result, если в функции сгенерировалось исключение?


> [2] Anatoly Podgoretsky ©   (12.12.11 10:20)

Что оно?


 
И. Павел ©   (2011-12-12 10:28) [4]

В Delphi 7 то де самое.
Но вот этот блок пропускается нормально:
function TForm1.GetLastHDMes: TDateTime;
begin
 result := 1;
 if Now = 1 then raise Exception.Create("123");
end;

Если обернуть в try/except то warning выдается, как и ожидалось.


 
И. Павел ©   (2011-12-12 10:28) [5]

В Delphi 7 то де самое —> В Delphi 7 то же самое


 
Anatoly Podgoretsky ©   (2011-12-12 10:29) [6]

> Anatoly Podgoretsky  (12.12.2011 10:20:02)  [2]

Не скопировалось raise


 
Anatoly Podgoretsky ©   (2011-12-12 10:30) [7]

> И. Павел  (12.12.2011 10:28:04)  [4]

А здесь присваивается значение, зачем же компилятору ругаться


 
Медвежонок Пятачок ©   (2011-12-12 10:34) [8]

if not then raise

результат неопределен.
А то, что он тебе не нужен, компилятор не знает.

А вдруг ты программируешь программу полета для фобос-грунт?


 
RWolf ©   (2011-12-12 10:40) [9]


> Медвежонок Пятачок ©   (12.12.11 10:34) [8]

ну, вот ещё одна функция со столь же «неопределённым» результатом:

function GetLastHDMes: TDateTime;
begin
   if Now = 1 then raise Exception.Create("123");
   result := 1;
end;

на этот раз компилятор молчит.
вывод — дело в чём-то другом.


 
И. Павел ©   (2011-12-12 10:44) [10]

> [8] Медвежонок Пятачок ©   (12.12.11 10:34)

Я ведь все равно не смогу получить возвращаемое значение функции, если функция вернет исключение. Или как-то можно до него добраться?


 
OW ©   (2011-12-12 10:48) [11]

ну если райз то и нет резалта

а если так - то нормально

  if not Reg.OpenKey("SOFTWARE\YITMonitoring", False) then
  begin
    result := 0;
    raise Exception.Create("Íå óäàëîñü îòêðûòü ðàçäåë ðååñòðà «HKEY_LOCAL_MACHINE\SOFTWARE\YITMonitoring»")
  end;


 
Медвежонок Пятачок ©   (2011-12-12 10:50) [12]

Компилер говорит, что результат функции может быть неопределен.

Я ведь все равно не смогу получить
А кто тебя знает, сможешь или нет.

try
dte := GetLastHDMes();
except
end;
LaunchPhobosGruntToEmptySpace(dte);


 
OW ©   (2011-12-12 10:51) [13]


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


function TForm1.GetLastHDMes: TDateTime;
begin
 raise Exception.Create("");
 Result := -1;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
 try
   if GetLastHDMes > 0 then
     ShowMessage( "");
 except
 end;
end;


 
И. Павел ©   (2011-12-12 10:57) [14]

> [13] OW ©   (12.12.11 10:51)

В этом коде операция «>» не будет выполнена. Т.е. результат GetLastHDMes все равно нигде не будет использован, в случае, если эта функция вернет исключение.


 
RWolf ©   (2011-12-12 10:58) [15]


> OW ©   (12.12.11 10:51) [13]

что должен доказать этот код?
результата вызываемой функции он всё равно не получит.


 
OW ©   (2011-12-12 11:02) [16]

да и ладно, я с медвеженком про принцип
Или двоичный программист детектед? :)
ну, тогда так перепишем

var
 d:TDateTime;
begin
d := 1;
try
  d := GetLastHDMes;
except
  if d > 0 then
    ShowMessage( "") else
    ShowMessage( "rrrrr");
end;


 
И. Павел ©   (2011-12-12 11:10) [17]

> [16] OW ©   (12.12.11 11:02)

Все равно ведь оператор «:=» из «d := GetLastHDMes» не выполнится. Т.е. результат функции мы так и не получили. В блоке except D по прежнему будет равна 1.


 
RWolf ©   (2011-12-12 11:12) [18]


> OW ©   (12.12.11 11:02) [16]

опять мимо. GetLastHDMes по-прежнему не возвращает значения, d присваивается раньше вызова функции.


 
Anatoly Podgoretsky ©   (2011-12-12 11:23) [19]

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


 
Dimka Maslov ©   (2011-12-12 11:36) [20]

Поставь Result := 0 после первого бегина и не мучайся, пока ошибка явно где-нибудь не вылезет


 
Jeer ©   (2011-12-12 13:23) [21]

Я практически всегда первой строкой определяю временный Result в относительно сложной и ветвистой функции.


 
И. Павел ©   (2011-12-12 15:09) [22]

>
[20] Dimka Maslov ©   (12.12.11 11:36)
[21] Jeer ©   (12.12.11 13:23)

Но в этом подходе есть и минус: если в одном из путей ветвления забыта операция result:=, то компилятиор об этом не напомнит.
Хотя, наверное, есть смысл инициализировать resut в начале тех функции, по поводу которых компилятор необоснованно ругается, как в [0], но только после того, как эта функция написана.


 
Юрий_   (2011-12-12 15:46) [23]

Ну то есть понятно, да? Чтобы обойти явную ошибку в компиляторе (скрыть варнинг, которого на самом деле нет), приходится писать код, который сам по себе уже является ошибочным. Лишняя строка кода, ненужная - это ошибка.


 
OW ©   (2011-12-12 16:05) [24]

не согласен.
Первой строкой пишем резалт := теоретически_невероятный_бред, все.
Забыл где-то присвоить - получил бред, понял что не присвоено.
А если компилятор еще будет анализировать - зачем тогда прокладка м/д монитором и стулом.
Тем более, скорость компилятора delphi ого-го, что еще от него ожидать? Если бы он мусолил по часу, как иные, а то даже синтаксис нескольких строк быстрее проверить, нажав ф9, чем прочитать их.


 
Jeer ©   (2011-12-13 14:37) [25]

Ну, что тут сказать - бывает так перемудришь, что и сам не рад, а надо идти дальше.
Лучше поиметь заранее известный результат в случае неопределенности, чем долбаться с автоматом.



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

Форум: "Начинающим";
Текущий архив: 2012.04.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.003 c
15-1321017183
Бездомный
2011-11-11 17:13
2012.04.01
Когда, интересно, появятся компьютеры, способные


15-1322801637
NkzAlex
2011-12-02 08:53
2012.04.01
Новое слово в ИТ?:


15-1323165693
Scott Storch
2011-12-06 14:01
2012.04.01
обозвать поля


3-1273743190
Роман
2010-05-13 13:33
2012.04.01
Подключение Delphi к базе Firebird


15-1323004190
DVM
2011-12-04 17:09
2012.04.01
Никто в MS не хочет пойти программировать? На Delphi.





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