"Волшебная" скобка в коде
{
тут куча кода
тут куча кода
тут куча кода
...................
тут куча кода
тут куча кода
и в самом конце функции вот здесь я писал проверочную команду, и она выполнялась! Но...смотрите ниже в main..
} //скобка
int main()
{
всякие функции и команды...
всякие функции и команды...
всякие функции и команды...
MyFunction() //вот эта функция вызывается
тут команда после выполнения функции //а вот эта команда уже не выполняется и сюда программа не доходит!
}
Но а вот почему в главную функцию перехода не осуществляется??? Пробовал я выполнять пошагово программу, ставля брекпойнты, чтобы видеть, как что и зачем в программе исполняется(пишу(точнее больше мучаюсь уже) в C++ Builder), и угораздило меня случайно поставить брекпойнт на закрывающую скобку функции (выше в коде я ее прокоментировал "скобка"). И оказалось, что после того, как выполнится последняя команда функции, то выполнение переходит на эту скобку. Я нажимаю Play(продолжение выполнения программы после задержки на строке, на которой стоит брекпойнт), и программа снова опять на этой скобке, я снова нажимаю Play - и программа снова остановилась на этой скобке! И так до бесконечности :eek: Как такое вообще возможно то?????? Замечу, что я ставил брекпойнты в это время в абсолютно во всех строках программы, в том числе и в начале функции, но программа после выполнения последней команды в функции переходит на вот эту скобку и начинает "выполняться" только на ней без конца и края. Что это за глюк???? Кто нибудь объясните мне пожалуйста, а то моя программа стоит на месте и я не могу ее далее продолжать писать без этой функции, в которой стоит вот такая волшебная скобка, которая выполняется бесконечно:(
P.S. Или это у меня уже с головой что-то не то или что...
upd:
да нет, с головой все норм.. Позвал нескольких человек к монитору посозерцать это чудо и они видели тоже самое.
и естественно без return-а работать не будет
Если ф-ция ничего не взоращает обьявляй ее void
дописал в конце функции 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
Просто мне тут по этому дело еще вот что сказали:
call 0x004xxxxx //где 0x004... адрес функции Window
add esp, 0x1c //где 1с на самом деле будет количество байт переданных в функцию window (вероятно с выравниваем по границе в 4 байта)
ret //возврат из функции. на вершине стека должен быть адрес функции main
У меня билдера нет, поэтому сам посмотреть не могу.
Помогло мне только следующее:
Взял исходник этой программы, но только пятидневной давности(где с функции выход осуществлялся еще нормально) и также взял нынешний файл. Вооружился компаратором файлом, сравнив те изменения, которые имеются между этими двумя файлами. Потом открыл этот старый исходник в билдере и стал в него добавлять по одному изменению, имеющемуся в новом файле(по одной строчке). И вот таким способом выявилось, что проблема в функции float OperatorPrice(char *PhoneNumber), которая используется в этой проблемной функции. Потому что как только ее не вызывать в этой функции, то выход в мейн осуществляется без проблем. Но стоит ей хотя бы один раз в функции засветиться, как выхода из мейна уже нет... После этого стал анализировать саму функцию float OperatorPrice(char *PhoneNumber) тоже добавляя по одной строчке.
И проблема оказалась в строчке code='\0';, где я упустил из виду, что в цикле то я обращаюсь i-1, а почему при выходе из цикла я нуль терминатор добавляю не после последнего присвоения, а аж через один символ - непонятно.. Исправил строчку code='\0' на code[i-1]='\0' и после этого функция стала нормально выходить в мейн.
Это ж надо так, что из-за одного несчастного присвоения, где я чуть-чуть неправильно обратился к массиву в далеко зарытой функции, были такие проблемы в главном коде... ппц...........
Всем огромное спасибо за то, что старались помочь!