LINUX.ORG.RU

Не понимаю почему так работаю лямбды.

 


0

2

В отладчике вижу, что оба qdebug сработали, НО начинает работать внутренний switch. Почему так?

connect(button, &QPushButton::clicked, this, [=](){
        qDebug() << "===================================Start";
    
        switch (t) {
        case START:

            break;
        case MAIN:

            break;
        case ALLMAKE:
            break;
        }
        qDebug() << "===================================End";
}

оба qdebug сработали, НО начинает работать внутренний switch

ЯННП. В смысле, вначале отработали qDebug(), а только потом — свитч? Или, по-твоему, свитч не должен выполняться? Или что?

XMs ★★★★★
()
Ответ на: комментарий от Berluskoni

Компилятор может переставить местами куски программы, если наблюдаемое поведение не меняется (отладчик не считается :)), это нормально.

deadNightTiger ★★★★★
()

А ты сделай свич непустым.

DELIRIUM ☆☆☆☆☆
()

Барьер поставь

Stil ★★★★★
()

поставь qdebug в каждое из трех ответвлений switch, и покажи что выводит

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Ступил. Дико ступил. У меня вызывалась некая функция каждый раз при нажатии на button, хотя не должна, вернее должна, но при определенном кейсе. Код большой и надо было понять кто ее вызывает. И я вот таких дебагов наплодил в каждой ф-ии. И в f() я не изменил вывод дебага. Т.е. все ок и работает правильно.

connect(button, &QPushButton::clicked, this, [=](){
        qDebug() << "===================================Start";
        f();
        switch (t) {
        case START:

            break;
        case MAIN:

            break;
        case ALLMAKE:
            break;
        }
        qDebug() << "===================================End";
}
f() {
qDebug() << "===================================Start";
...
qDebug() << "===================================End";
}
А спросить решил потому, что подумал, что может я каких-то тривиальных моментов в лямбдах не понимаю.

Berluskoni ★★
() автор топика
Последнее исправление: Berluskoni (всего исправлений: 3)

можешь пояснить, зачем тебе switch? когда делается connect неизвестно состояние t или connect делается несколько раз?

not_rj45
()
Ответ на: комментарий от Berluskoni

t берется из бд, а connect к одной кнопке прикручен. В зависимости от t формируется окно

яснее не стало :) у тебя захват по значению, поэтому сколько раз на кнопку не жми и не доставай значение t из бд, в самой лямбде t останется таким, каким оно было при вызове connect. отсюда вопрос: заче нужен свич)

not_rj45
()
Ответ на: комментарий от not_rj45

ок, а если я делаю так

...
t=g();
...
int g(){
   ...
   k = sqlquery.value("switch_type");
   return k;
}
то каким будет t? А если t создается в лямбде? Да, в плюсах ругнется если не приведу к енаму. Но мы не про это же)

Berluskoni ★★
() автор топика
Ответ на: комментарий от Berluskoni

то каким будет t?

если вызов g() за пределами лямбды, то таким, каким он был при вызове connect

А если t создается в лямбде?

если он там объявлен прям, то будет равен k из g(), но не проще ли по ссылке захватывать?

not_rj45
()
Ответ на: комментарий от not_rj45

Можно и по ссылке, но если нужно, например, для кнопки «назад» иметь самую последнюю нажатую кнопку.

Berluskoni ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.