Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Еще глюк кейловского компилятора
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
777777
Код
void ErrOptions()
    {
    Reply.Stat = 15;
    SendReply();
    }

void Options()
    {
    ...
    ...
    if(Command.Data[i++] >= ZOND_SIZE)
        return ErrOptions();
    }


error: #118: a void function may not return a value

На самом деле void function может возвращать void value, "возвращаемое" другой void функцией.
richie
Хм, а зачем такой гемморой изобретать?
В одной void функции returna нет, а в другой зачем-то понадобился.
Чем простая запись не подходит:
....
if(Command.Data[i++] >= ZOND_SIZE) {
ErrOptions();
return;
}
Лаконично и понятно будет другому человеку, и самому себе даже через несколько месяцев.

ИХМО. Если есть неопределенность в спецификации изобретаемой функции, то всегда делай её с кодом возврата.
GetSmart
Цитата(777777 @ Aug 31 2011, 10:57) *
На самом деле void function может возвращать void value, "возвращаемое" другой void функцией.

А привести чужие примеры такого кода можете?
sergeeff
Не приведет он таких примеров. Старый добрый VS 6.0:

Код
C:\my_proj\VC++\classtst\main.cpp(23) : error C2562: 'Options' : 'void' function returning a value


777777
Цитата(richie @ Aug 31 2011, 10:08) *
Лаконично и понятно будет другому человеку, и самому себе даже через несколько месяцев.

Увеличение числа строк в 3 раза вы называете лаконичностью?

Цитата(GetSmart @ Aug 31 2011, 10:08) *
А привести чужие примеры такого кода можете?

Что значит "чужие"?
GetSmart
Цитата(777777 @ Aug 31 2011, 11:25) *
Что значит "чужие"?

Чужие значит чужие.
На чём основано ваше заявление в конце первого поста?
777777
Цитата(sergeeff @ Aug 31 2011, 10:14) *
Не приведет он таких примеров. Старый добрый VS 6.0:

Код
C:\my_proj\VC++\classtst\main.cpp(23) : error C2562: 'Options' : 'void' function returning a value


Да, верно, в VC 6.0 тоже был такой глюк, но уже в VC 7.1 его исправили. AVR Studio тоже успешно компилрует такой код, при этом многие считают gcc за эталонный компилятор. Наконец, об этом напрямую написано в стандарте.

Цитата(GetSmart @ Aug 31 2011, 10:26) *
Чужие значит чужие.

Меня не интересуют чужие программы.
Цитата(GetSmart @ Aug 31 2011, 10:26) *
На чём основано ваше заявление в конце первого поста?

На стандарте Си. Если угодно, я покопаюсь и найду это место, но я точно знаю что оно есть, так как на эту тему несколько лет назад была дискуссия в rsdn.ru о компиляторе VC 6.0, после чего этот глюк исправили в VC 7.1.
sergeeff
Цитата(777777 @ Aug 31 2011, 10:30) *
На стандарте Си. Если угодно, я покопаюсь и найду это место, но я точно знаю что оно есть, так как на эту тему несколько лет назад была дискуссия в rsdn.ru о компиляторе VC 6.0, после чего этот глюк исправили в VC 7.1.


Действительно, VS 2008 sp1 съедает все молча. Но я бы все равно так никогда не написал. Тема для ненужного напряжения головы через некоторое время.
GetSmart
Цитата(777777 @ Aug 31 2011, 11:30) *
на эту тему несколько лет назад была дискуссия в rsdn.ru о компиляторе VC 6.0

Наверняка там как и здесь говорилось о плохой читабельности такого кода. Поэтому от такого "глюка" больше пользы.
777777
Цитата(GetSmart @ Aug 31 2011, 11:07) *
Наверняка там как и здесь говорилось о плохой читабельности такого кода. Поэтому от такого "глюка" больше пользы.

Какие вы все нежные. А работать с алгоритмом рекурсивного спуска вам не приходилось? А что не так с читабельностью? Вы считаете более читабельной программу в которой в 3 раза больше строк?
GetSmart
Цитата(777777 @ Aug 31 2011, 12:34) *
Вы считаете более читабельной программу в которой в 3 раза больше строк?

А что не в миллион? 1 больше 0 вообще в бесконечность раз.
777777
Цитата(GetSmart @ Aug 31 2011, 11:38) *
А что не в миллион? 1 больше 0 вообще в бесконечность раз.

Код
if(Command.Data[i++] >= ZOND_SIZE)
    {
    ErrOptions();
    return;
    }

или:
Код
if(Command.Data[i++] >= ZOND_SIZE)
    return ErrOptions();

Вместо одной строки четыре.
IgorKossak
Цитата(777777 @ Aug 31 2011, 10:34) *
Вы считаете более читабельной программу в которой в 3 раза больше строк?

О каких "в 3 раза больше строк" Вы постоянно говорите если вместо return ErrOptions(); написать { ErrOptions(); return; }
А то и вовсе в той же строке с if
scifi
Цитата(777777 @ Aug 31 2011, 09:57) *
На самом деле void function может возвращать void value, "возвращаемое" другой void функцией.

Цитата(777777 @ Aug 31 2011, 10:30) *
На стандарте Си.

Это утверждение неверное. Во всяком случае, если опираться на стандарт C99:

Цитата
The (nonexistent) value of a void expression (an expression that has type void) shall not be used in any way

Цитата
A return statement with an expression shall not appear in a function whose return type is void. A return statement without an expression shall only appear in a function whose return type is void.
follow_me
Цитата(777777 @ Aug 31 2011, 10:34) *
Какие вы все нежные. А работать с алгоритмом рекурсивного спуска вам не приходилось? А что не так с читабельностью? Вы считаете более читабельной программу в которой в 3 раза больше строк?


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

по поводу того что строк у вас в 3 раза больше - у вас программа состоит из таких блоков только ? и их у вас тысячи ? если нет , то не в 3 раза, а на две строки. И мне кажется согласятся все что ваш пример , это пример Bad Code Style , и лучше так не писать.

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.