странный код: foo(){foo();}
От: gok Россия  
Дата: 01.02.08 01:59
Оценка:
void OCC_2dViewRD::OnFileExportImage()
{
    OCC_2dViewRD::OnFileExportImage();
...
}

ну и, ессессно, vc8.0:

d:\opencascade6.2.0\samples\standard\mfc\common\occ_2dviewrd.cpp(60) : warning C4717: 'OCC_2dViewRD::OnFileExportImage' : recursive on all control paths, function will cause runtime stack overflow


О чем этот код? Разве так можно? Или в 7.1 (разработчики настаивают на ней) работает?
gok
Re: странный код: foo(){foo();}
От: jazzer Россия Skype: enerjazzer
Дата: 01.02.08 02:39
Оценка:
Здравствуйте, gok, Вы писали:

gok>
gok>void OCC_2dViewRD::OnFileExportImage()
gok>{
gok>    OCC_2dViewRD::OnFileExportImage();
gok>...
gok>}
gok>


gok>О чем этот код? Разве так можно? Или в 7.1 (разработчики настаивают на ней) работает?

gok>
Ну, если бы в вызове не было явной квалификации, я бы решил, что это виртуальный вызов.
А так — действительно странно.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: странный код: foo(){foo();}
От: Сергей Мухин Россия  
Дата: 01.02.08 04:13
Оценка:
Здравствуйте, gok, Вы писали:

gok>
gok>void OCC_2dViewRD::OnFileExportImage()
gok>{
gok>    OCC_2dViewRD::OnFileExportImage();
gok>...
gok>}
gok>

gok>ну и, ессессно, vc8.0:
gok>

gok>d:\opencascade6.2.0\samples\standard\mfc\common\occ_2dviewrd.cpp(60) : warning C4717: 'OCC_2dViewRD::OnFileExportImage' : recursive on all control paths, function will cause runtime stack overflow


gok>О чем этот код? Разве так можно? Или в 7.1 (разработчики настаивают на ней) работает?


Это полный пример? или там еще что-то есть до вызова?
Напрмер

void foo(){bar();foo();}

Тогда это нормально
---
С уважением,
Сергей Мухин
Re[2]: странный код: foo(){foo();}
От: c-smile Канада http://terrainformatica.com
Дата: 01.02.08 04:49
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>
СМ>void foo(){bar();foo();}
СМ>

СМ>Тогда это нормально

Что конкретно нормально? Stack overflow?
Re[3]: странный код: foo(){foo();}
От: Сергей Мухин Россия  
Дата: 01.02.08 05:09
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, Сергей Мухин, Вы писали:


СМ>>
СМ>>void foo(){bar();foo();}
СМ>>

СМ>>Тогда это нормально

CS>Что конкретно нормально? Stack overflow?


throw
---
С уважением,
Сергей Мухин
Re[3]: странный код: foo(){foo();}
От: Alex Dav Россия  
Дата: 01.02.08 05:09
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, Сергей Мухин, Вы писали:


СМ>>
СМ>>void foo(){bar();foo();}
СМ>>

СМ>>Тогда это нормально

CS>Что конкретно нормально? Stack overflow?


ну почему в этом случае void foo(){bar();foo();} возможна просто рекурсия
Re[4]: странный код: foo(){foo();}
От: c-smile Канада http://terrainformatica.com
Дата: 01.02.08 06:19
Оценка:
Здравствуйте, Alex Dav, Вы писали:

СМ>>>
СМ>>>void foo(){bar();foo();}
СМ>>>

СМ>>>Тогда это нормально

CS>>Что конкретно нормально? Stack overflow?


AD>ну почему в этом случае void foo(){bar();foo();} возможна просто рекурсия


Итить...

Что такое "просто рекурсия"?

Понятия редуцирования хвостовой рекурсии в С++ нет по определению.
А просто вызов функции это как минимум адрес возврата на стеке.
Re[4]: странный код: foo(){foo();}
От: c-smile Канада http://terrainformatica.com
Дата: 01.02.08 06:22
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>>>
СМ>>>void foo(){bar();foo();}
СМ>>>

СМ>>>Тогда это нормально

CS>>Что конкретно нормально? Stack overflow?


СМ>throw


Суров ты брат Мухин.

А вот как ты думаешь, когда компайлер человеческим языком говорит:
"recursive on all control paths, function will cause runtime stack overflow" он про throw знает?
Re[5]: странный код: foo(){foo();}
От: Сергей Мухин Россия  
Дата: 01.02.08 06:32
Оценка: +1
Здравствуйте, c-smile, Вы писали:


CS>>>Что конкретно нормально? Stack overflow?


СМ>>throw


CS>Суров ты брат Мухин.



я уверен, что мой брат не пишет в этом форуме и даже не читает

CS>А вот как ты думаешь, когда компайлер человеческим языком говорит:

CS>"recursive on all control paths, function will cause runtime stack overflow" он про throw знает?

он подозревает, именно поэтому warning а не ошибка.

void bar() {
if (++nested>10) throw 1;
}


ps
кстати, т.к. мы тестируем свой компилятор (не С/C++), то и у нас есть странные ф-ии. Надо например проверить хвостовую рекурсию или реакцию на stack overflow.
---
С уважением,
Сергей Мухин
Re[6]: странный код: foo(){foo();}
От: c-smile Канада http://terrainformatica.com
Дата: 01.02.08 07:12
Оценка: -5
Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, c-smile, Вы писали:



CS>>>>Что конкретно нормально? Stack overflow?


СМ>>>throw


CS>>Суров ты брат Мухин.


СМ>

СМ>я уверен, что мой брат не пишет в этом форуме и даже не читает

Молодец твой брат, у него больше времени на изучение C++ остается.

CS>>А вот как ты думаешь, когда компайлер человеческим языком говорит:

CS>>"recursive on all control paths, function will cause runtime stack overflow" он про throw знает?

СМ>он подозревает, именно поэтому warning а не ошибка.


Вона как! Какой мнительный и неграмотный компакйлер нам попался...

А вот мнительный, но грамотный компайлер сказал бы например так: "function may cause runtime stack overflow".

Английский у вас в семье тоже брат учит?

СМ>
СМ>void bar() {
СМ>if (++nested>10) throw 1;
СМ>}
СМ>


СМ>ps

СМ>кстати, т.к. мы тестируем свой компилятор (не С/C++), то и у нас есть странные ф-ии. Надо например проверить хвостовую рекурсию или реакцию на stack overflow.

"Кстати" тут не кстати. Совсем.
Или я не понимаю русский язык или русккий в вашей семье учит тоже брат.
Re[7]: странный код: foo(){foo();}
От: Сергей Мухин Россия  
Дата: 01.02.08 07:20
Оценка:
Здравствуйте, c-smile, Вы писали:

по существу в твоем посте ничего нет.
---
С уважением,
Сергей Мухин
Re[5]: странный код: foo(){foo();}
От: Сергей Мухин Россия  
Дата: 01.02.08 07:26
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, Alex Dav, Вы писали:


СМ>>>>
СМ>>>>void foo(){bar();foo();}
СМ>>>>

СМ>>>>Тогда это нормально

CS>>>Что конкретно нормально? Stack overflow?


AD>>ну почему в этом случае void foo(){bar();foo();} возможна просто рекурсия


CS>Итить...


CS>Что такое "просто рекурсия"?


согласен

CS>Понятия редуцирования хвостовой рекурсии в С++ нет по определению.


но многие компиляторы это делают. попробуй данный пример откомпилировать в MS 2005
---
С уважением,
Сергей Мухин
Re[8]: странный код: foo(){foo();}
От: c-smile Канада http://terrainformatica.com
Дата: 01.02.08 07:35
Оценка: +1 -2 :))
Здравствуйте, Сергей Мухин, Вы писали:

СМ>по существу в твоем посте ничего нет.


Мой пост обратил материю твоего поста в спиритуальные электрические вихри, из коих и возникла синекдоха отвечания.
Re[9]: странный код: foo(){foo();}
От: Сергей Мухин Россия  
Дата: 01.02.08 07:38
Оценка: :)
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, Сергей Мухин, Вы писали:


СМ>>по существу в твоем посте ничего нет.


CS>Мой пост обратил материю твоего поста в спиритуальные электрические вихри, из коих и возникла синекдоха отвечания.



мало кто знает откуда эта цитата.
приведу ее полностью


Старичок словно взорвался.

– Высочайшие достижения нейтронной мегалоплазмы! – провозгласил он. – Ротор поля наподобие дивергенции градуирует себя вдоль спина и там, внутре, обращает материю вопроса в спиритуальные электрические вихри, из коих и возникает синекдоха отвечания...

У меня потемнело в глазах, рот наполнился хиной, заболели зубы, а проклятый нобль вё все говорил и говорил...

---
С уважением,
Сергей Мухин
Re[6]: странный код: foo(){foo();}
От: c-smile Канада http://terrainformatica.com
Дата: 01.02.08 07:47
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

CS>>>>Что конкретно нормально? Stack overflow?


AD>>>ну почему в этом случае void foo(){bar();foo();} возможна просто рекурсия


CS>>Итить...


CS>>Что такое "просто рекурсия"?


СМ>согласен


С чем?

CS>>Понятия редуцирования хвостовой рекурсии в С++ нет по определению.


СМ>но многие компиляторы это делают. попробуй данный пример откомпилировать в MS 2005


Пративные какие эти многия компайлеры...

А вот VC++ 2005 либо выкинет функцию вообще либо при выключенной оптимизации сгенерирует честный код приводящий к:
Unhandled exception at 0x00401009 in foo.exe: 0xC00000FD: Stack overflow.
Re[7]: странный код: foo(){foo();}
От: Сергей Мухин Россия  
Дата: 01.02.08 07:58
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>>>Что такое "просто рекурсия"?


СМ>>согласен


CS>С чем?


что слова "просто рекурсия" не уместны

CS>>>Понятия редуцирования хвостовой рекурсии в С++ нет по определению.


СМ>>но многие компиляторы это делают. попробуй данный пример откомпилировать в MS 2005


CS>Пративные какие эти многия компайлеры...


CS>А вот VC++ 2005 либо выкинет функцию вообще либо при выключенной оптимизации сгенерирует честный код приводящий к:

CS>Unhandled exception at 0x00401009 in foo.exe: 0xC00000FD: Stack overflow.

во генерация VC++ 2005:


; 10   : void foo() {
$LL3@foo:
; 11   :     bar();
  00000    e8 00 00 00 00     call     ?bar@@YAXXZ        ; bar
; 12   :     foo();
  00005    eb f9         jmp     SHORT $LL3@foo

где тут выкинутая ф-ия?
---
С уважением,
Сергей Мухин
Re: странный код: foo(){foo();}
От: Сергей Мухин Россия  
Дата: 01.02.08 12:39
Оценка: 10 (4) +1
Здравствуйте, gok, Вы писали:

gok>
gok>void OCC_2dViewRD::OnFileExportImage()
gok>{
gok>    OCC_2dViewRD::OnFileExportImage();
gok>...
gok>}
gok>

gok>О чем этот код? Разве так можно? Или в 7.1 (разработчики настаивают на ней) работает?
gok>

Вот знакомый из Интела прислал пример, который очень близок к начальному, вот только варнинга нет

т.к. вызывается другая ф-ия. Но выглядит как та же самая!

#include <stdio.h>

namespace A
{
   void f();
   struct A { static void f(); };
   void A::f() { printf("YES\n"); }
}

void A::f() { A::f(); } // sic!

int main()
{
   A::f();
   return 0;
}
---
С уважением,
Сергей Мухин
Re[8]: странный код: foo(){foo();}
От: c-smile Канада http://terrainformatica.com
Дата: 01.02.08 21:20
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

CS>>>>Понятия редуцирования хвостовой рекурсии в С++ нет по определению.


СМ>>>но многие компиляторы это делают. попробуй данный пример откомпилировать в MS 2005


CS>>Пративные какие эти многия компайлеры...


CS>>А вот VC++ 2005 либо выкинет функцию вообще либо при выключенной оптимизации сгенерирует честный код приводящий к:

CS>>Unhandled exception at 0x00401009 in foo.exe: 0xC00000FD: Stack overflow.

СМ>во генерация VC++ 2005:


СМ>
СМ>; 10   : void foo() {
СМ>$LL3@foo:
СМ>; 11   :     bar();
СМ>  00000    e8 00 00 00 00     call     ?bar@@YAXXZ        ; bar
СМ>; 12   :     foo();
СМ>  00005    eb f9         jmp     SHORT $LL3@foo
СМ>

СМ>где тут выкинутая ф-ия?

Да, действительно, VC++ 2005 смог редуцировать хвостовую рекурсию в простой цикл в данном случае.
Но это 1) не является стандартным поведением C++ и 2) работает только в режиме включенной оптимизации (какие ключи за это отвечают?).
Я не уверен в том что это вообще хорошо ибо такое поведение компилятора заведомый источник проблем типа: в Debug работает а в Release — нет. Т.е. закладываться на это, а тем более говорить "все нормально" я бы не стал.

В любом случае в оригинальном сообщении этого топика хвостовой рекурсией нет поэтому tail recursion в этом контексте это скорее пища для ума чем нечто практически полезное.
Re: странный код: foo(){foo();}
От: gok Россия  
Дата: 01.02.08 23:42
Оценка: :))) :)
Здравствуйте, gok, Вы писали:

gok>void OCC_2dViewRD::OnFileExportImage()

gok>{
gok> OCC_2dViewRD::OnFileExportImage();
gok>...

Оказался баг, на самом деле звали родителя:
void OCC_2dViewRD::OnFileExportImage()
{
    OCC_2dView::OnFileExportImage();


сорьки за offtop
gok
Re[2]: странный код: foo(){foo();}
От: c-smile Канада http://terrainformatica.com
Дата: 02.02.08 03:18
Оценка: :))) :))
Здравствуйте, gok, Вы писали:

gok>Оказался баг, на самом деле звали родителя:

gok>
gok>void OCC_2dViewRD::OnFileExportImage()
gok>{
gok>    OCC_2dView::OnFileExportImage();
gok>

gok>
gok>сорьки за offtop

Тут уже чуть морды бить не начали, а он вишь ты оказывается описался. (ударение сами поставьте).
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.