Ой ребята, ой не могу, посмотрите на картинку с Builder 6
void __fastcall TForm2::BitBtn1Click(TObject *Sender)
{
if (!checkfill(editline))
{
if (Application->MessageBoxA("блаблабла?","блабла!",MB_YESNO)==IDNO)
{return;}
}
fillrecord(editline);
Form2->Close();
}
//---------------------------------------------------------------------------void __fastcall TForm2::BitBtn2Click(TObject *Sender)
{
if (!checkfill(editline))
{
if (Application->MessageBoxA("блаблабла?","блабла!",MB_YESNO)==IDNO)
{return;}
}
fillrecord(editline);
findempty();
Label4->Caption=editline;
fill(); // очистка
}
Ну так вот, fillrecord(editline); в первой функции не трассируется по дебюгеру!
Что я только не делал (переносил строки, по новой переписывал, перегружался от греха), все равно во второй функции трассируется, в первой которая по сути логики та-же самая, все равно нет. В чем дело?, может кто скажет как такое побороть? Хотя сомневаюсь что кто-то сталкивался, сам впервые за энное лет вижу. А проект уже завтра сдавать.
ИМХО, компилятор при оптимизации в первом случае просто выбрасывает fillrecord(editline); за ненадобностью, т.к. результаты выполнения функции нигде не используются, как и editline.
Во втором случае есть использование: Label4->Caption=editline;. Если в первую процедуру добавить перед закрытием формы обращение к editline (for.ex. MessageBox(..editline..)), то всё должно пройти как положено.
... <<Greensleeves>>
Не восхрапи на работе, ибо храпом своим разбудишь начальника своего.
__>ИМХО, компилятор при оптимизации в первом случае просто выбрасывает fillrecord(editline); за ненадобностью, т.к. результаты выполнения функции нигде не используются, как и editline.
__>Во втором случае есть использование: Label4->Caption=editline;. Если в первую процедуру добавить перед закрытием формы обращение к editline (for.ex. MessageBox(..editline..)), то всё должно пройти как положено.
Не знаю с чего вы взяли такие выкладки, ведь судя по листингу editline это переменная, в моем случае глобальная. Вначале она объявлена как extern int. Так что по любому компилятор должен вызывать функцию fillrecord(editline);
Или я разучился сегодня писать или что-то без меня в мире случилось с С++. На кой черт ему оптимизировать (компилятору) явный вызов функции с параметром явно определенной переменной хоть и объявленной как extern
В любом случае спасибо. Ваш совет на самом деле работает. Хотя хоть тресни не пойму почему мой вариант не пашет.
Вылечилось тем что пришлось прибить кнопку на форме, сохраниться и завести новую кнопку.
После этого заработало но опять же криво. Функция fillrecord(editline); вызывается, но в Буилдере трассировка на эту функцию опять-же не показывается. Может переустановка поможет. Потом разберусь.
Здравствуйте, _admin_, Вы писали:
__>В любом случае спасибо. Ваш совет на самом деле работает. Хотя хоть тресни не пойму почему мой вариант не пашет.
Компилятор анализирует последовательноть выполнения кода Вашего приложения и по результатам анализа производит оптимизацию кода. Это уже оптимизация команд, выполняемых на процессоре, а не исходного кода.
В Вашем случае возможен следующий вариант:
Построив алгоритм выполнения программы, компилятор обнаружил, что вызов данной функции не влияет на ход выполнения программы, а значит его можно удалить. Т.е. имеет место либо "тупиковая ветвь" алгоритма, либо незначащий промежуточный шаг (типа {s = s + 1; s = s — 1;} ).
... <<Per Elisa>>
Не восхрапи на работе, ибо храпом своим разбудишь начальника своего.
Учи олбанцкий. Тут тебе не родное ПТУ чтобы такие заголовки писать
... << RSDN@Home 1.2.0 alpha rev. 619>>
Re[3]: Довел буилдер (точный ответ)
От:
Аноним
Дата:
08.11.05 02:51
Оценка:
Здравствуйте, _admin_, Вы писали:
__>Здравствуйте, _spin_, Вы писали:
__>В любом случае спасибо. Ваш совет на самом деле работает.
Рано я порадовался глядя на компилятор и видя в нем точку трассировки. НЕ РАБОТАЕТ.
А вот и причина, описываю детально. fillrecord(editline); не может и не должна оптимизироваться (я то знаю что говорю) так как эта функция делает очень многое. Была всетаки Бага компилятора. Пришлось перебить сами кнопки на форме BitBatton и все стало на место.
Спасибо всем откликнувшимся
Здравствуйте, kavlad, Вы писали:
K>Здравствуйте, ArtDenis, Вы писали:
AD>>А не проще было бы
K>Не проще. Ведь тогда не вскрылась бы такая ужасная бага компилятора! K>
Прежде чем наезжать и писать подобное почитайте первые топики.
Писал: в обработчике кнопки при трассировке дебугером нет точки трассировки только на вызове некой функции.
Следовательно обработчик существует. Что непонятного?