Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

"Волшебная" скобка в коде

37K
21 ноября 2010 года
Tolias28
48 / / 20.09.2010
Пишу программу на C. И при дописывании одной функции выявилось, что с нее не происходит возврата в главную функцию. Я уже и делал разные проверки, чтобы узнать, где именно функция останавливается. Писал перед самой последней скобкой функции команду и отслеживал, выполняется ли она. И она выполняется. Значит, функция к самому концу доходит..
Код:
MyFunction()
{
тут куча кода
тут куча кода
тут куча кода
...................
тут куча кода
тут куча кода

и в самом конце функции вот здесь я писал проверочную команду, и она выполнялась! Но...смотрите ниже в main..
} //скобка

int main()
{
всякие функции и команды...
всякие функции и команды...
всякие функции и команды...

MyFunction()  //вот эта функция вызывается
тут команда после выполнения функции    //а вот эта команда уже не выполняется и сюда программа не доходит!

}


Но а вот почему в главную функцию перехода не осуществляется??? Пробовал я выполнять пошагово программу, ставля брекпойнты, чтобы видеть, как что и зачем в программе исполняется(пишу(точнее больше мучаюсь уже) в C++ Builder), и угораздило меня случайно поставить брекпойнт на закрывающую скобку функции (выше в коде я ее прокоментировал "скобка"). И оказалось, что после того, как выполнится последняя команда функции, то выполнение переходит на эту скобку. Я нажимаю Play(продолжение выполнения программы после задержки на строке, на которой стоит брекпойнт), и программа снова опять на этой скобке, я снова нажимаю Play - и программа снова остановилась на этой скобке! И так до бесконечности :eek: Как такое вообще возможно то?????? Замечу, что я ставил брекпойнты в это время в абсолютно во всех строках программы, в том числе и в начале функции, но программа после выполнения последней команды в функции переходит на вот эту скобку и начинает "выполняться" только на ней без конца и края. Что это за глюк???? Кто нибудь объясните мне пожалуйста, а то моя программа стоит на месте и я не могу ее далее продолжать писать без этой функции, в которой стоит вот такая волшебная скобка, которая выполняется бесконечно:(

P.S. Или это у меня уже с головой что-то не то или что...

upd:
да нет, с головой все норм.. Позвал нескольких человек к монитору посозерцать это чудо и они видели тоже самое.
7
22 ноября 2010 года
@pixo $oft
3.4K / / 20.09.2006
return <значение> не пробовали перед скобкой?
274
22 ноября 2010 года
Lone Wolf
1.3K / / 26.11.2006
возращаемый тип у ф-ции не указан, т.е. int(если я не ошибаюсь)..
и естественно без return-а работать не будет

Если ф-ция ничего не взоращает обьявляй ее void
37K
22 ноября 2010 года
Tolias28
48 / / 20.09.2010
Цитата:
return <значение> не пробовали перед скобкой?


дописал в конце функции return. Поставил брекпоинты, но прога по прежнему скачет по скобке(((
Пробовал сделать функцию не void, а int, и в конце перед самой скобкой написать return 0; то теперьпрограмма висит не на одной скобке, а поочердено на ретюрне и скобке((((

Цитата:
озращаемый тип у ф-ции не указан


Извиняюсь.. Это я здесь на форуме забыл запиать, а в коде у меня она была void. Но я уже пробовал ставить и int, и char, и void, и float - и скобка по прежнему выполняется до бесконечности вместе с ретюрном. Уже не знаю, что еще можно придумать, чтобы происходил возврат из функции в главную функцию...

Может это поможет.. Скрины куска этого кода с брекпойнтами и тот же самый кусок, но только в окне дизассемблера:
http://tis.eu5.org/files/builder%7d3.png
http://tis.eu5.org/files/builder%7d4.png

Просто мне тут по этому дело еще вот что сказали:

Цитата:
Там где не выходит из функции, а стоит на скобке - попробуй использовать return. Желательно посмотреть это место в режиме отладки в окне дизассемблера(наверняка в билдере есть такая весчь). При правильной работе функции должно выполняться что-то типа:

call 0x004xxxxx //где 0x004... адрес функции Window
add esp, 0x1c //где 1с на самом деле будет количество байт переданных в функцию window (вероятно с выравниваем по границе в 4 байта)
ret //возврат из функции. на вершине стека должен быть адрес функции main

У меня билдера нет, поэтому сам посмотреть не могу.

33K
23 ноября 2010 года
hivewarrior
205 / / 16.11.2010
Если такая пьянка, то скорее всего создан класс, у которого в деструкторе бесконечный цикл. Return в любом месте должен выходить из функции, возвращая значение, кроме того, если есть зацикленные деструкторы объектов, созданных в самой функции. Писать они не пишутся, но жизнь портят изрядно.
37K
23 ноября 2010 года
Tolias28
48 / / 20.09.2010
Не.. программа без всяких классов. Но я уже нашел и решил проблему. Она скрывалась там, где ее вообще я не ожидал, и где казалось бы, самое безобидное место..
Помогло мне только следующее:
Взял исходник этой программы, но только пятидневной давности(где с функции выход осуществлялся еще нормально) и также взял нынешний файл. Вооружился компаратором файлом, сравнив те изменения, которые имеются между этими двумя файлами. Потом открыл этот старый исходник в билдере и стал в него добавлять по одному изменению, имеющемуся в новом файле(по одной строчке). И вот таким способом выявилось, что проблема в функции float OperatorPrice(char *PhoneNumber), которая используется в этой проблемной функции. Потому что как только ее не вызывать в этой функции, то выход в мейн осуществляется без проблем. Но стоит ей хотя бы один раз в функции засветиться, как выхода из мейна уже нет... После этого стал анализировать саму функцию float OperatorPrice(char *PhoneNumber) тоже добавляя по одной строчке.
И проблема оказалась в строчке code='\0';, где я упустил из виду, что в цикле то я обращаюсь i-1, а почему при выходе из цикла я нуль терминатор добавляю не после последнего присвоения, а аж через один символ - непонятно.. Исправил строчку code='\0' на code[i-1]='\0' и после этого функция стала нормально выходить в мейн.
Это ж надо так, что из-за одного несчастного присвоения, где я чуть-чуть неправильно обратился к массиву в далеко зарытой функции, были такие проблемы в главном коде... ппц...........

Всем огромное спасибо за то, что старались помочь!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог