реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Еще глюк кейловского компилятора
777777
сообщение Aug 31 2011, 05:57
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Код
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 функцией.
Go to the top of the page
 
+Quote Post
richie
сообщение Aug 31 2011, 06:08
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 147
Регистрация: 5-07-04
Из: Обнинск
Пользователь №: 261



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

ИХМО. Если есть неопределенность в спецификации изобретаемой функции, то всегда делай её с кодом возврата.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 31 2011, 06:08
Сообщение #3


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



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

А привести чужие примеры такого кода можете?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 31 2011, 06:14
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Не приведет он таких примеров. Старый добрый VS 6.0:

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


Go to the top of the page
 
+Quote Post
777777
сообщение Aug 31 2011, 06:25
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



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

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

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

Что значит "чужие"?
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 31 2011, 06:26
Сообщение #6


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



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

Чужие значит чужие.
На чём основано ваше заявление в конце первого поста?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 31 2011, 06:30
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(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.

Сообщение отредактировал 777777 - Aug 31 2011, 06:31
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 31 2011, 06:49
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



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


Действительно, VS 2008 sp1 съедает все молча. Но я бы все равно так никогда не написал. Тема для ненужного напряжения головы через некоторое время.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 31 2011, 07:07
Сообщение #9


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(777777 @ Aug 31 2011, 11:30) *
на эту тему несколько лет назад была дискуссия в rsdn.ru о компиляторе VC 6.0

Наверняка там как и здесь говорилось о плохой читабельности такого кода. Поэтому от такого "глюка" больше пользы.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 31 2011, 07:34
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



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

Какие вы все нежные. А работать с алгоритмом рекурсивного спуска вам не приходилось? А что не так с читабельностью? Вы считаете более читабельной программу в которой в 3 раза больше строк?
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 31 2011, 07:38
Сообщение #11


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



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

А что не в миллион? 1 больше 0 вообще в бесконечность раз.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 31 2011, 07:42
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



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

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

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

Вместо одной строки четыре.

Сообщение отредактировал 777777 - Aug 31 2011, 07:43
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Aug 31 2011, 07:49
Сообщение #13


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



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

О каких "в 3 раза больше строк" Вы постоянно говорите если вместо return ErrOptions(); написать { ErrOptions(); return; }
А то и вовсе в той же строке с if
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 31 2011, 08:11
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(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.
Go to the top of the page
 
+Quote Post
follow_me
сообщение Aug 31 2011, 08:26
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 182
Регистрация: 4-11-10
Пользователь №: 60 646



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


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

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

Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 01:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01522 секунд с 7
ELECTRONIX ©2004-2016