LINUX.ORG.RU

Лямбда, с++(qt), передача по ссылке

 , ,


0

5

Привет. Есть такие строки

 
int Cells=100;
---------------
connect (MyButts, &QPushButton::clicked, [&Cells] () {MySlot(Cells);})
--------------
MainWind::MySlot(int Cells)
{
 Cells--;
 QMessageBox msg;
 msg.setText(QString::number(Cells));
 msg.exec();
}

Сообщение выдает числа 32695, 32789 и тому подобные. А должно быть 99, 98 и тд. В чем здесь ошибка?



Последнее исправление: Rot1 (всего исправлений: 1)

так тоже не работает

MainWind::MySlot(int &Cells)

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

На каком стеке? Мне нужно просто инт передать, чтоб он и в слоте менялся, и в конструкторе, в котором объявлен

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

На каком стеке?

На обычном стеке, на котором выделяются локальные переменные. К моменту вызова слота твоей переменной уже давно не существует и ты пытаешься менять память где уже лежат другие данные. Если бы у тебя это получилось. Помимо этого никаких 99, 98 ты не получишь, потому ты меняешь не Cells которую инициализировал сотней, а локальную переменную слота, т.е. всегда было бы 99. Наверное ты хотел передавать Cells по ссылке.

А вообще в таких случаях Cells делают членом класса, меняют напрямую из слота и никуда не передают, и никаких лямбд не надо. KISS, особенно когда языка не знаешь.

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 1)

блин, друг, ты основы С++ не знаешь, а уже лезешь в Qt и лямбды! Это не хорошо. Начать нужно с начала, а не с конца. А проблема в том, что когда лямбда отрабатывает, переменная уже разрушена и происходит UB.

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

Вообще то я это знаю. Печально, что все прочитали один комментарий и стали равняться по нему. Такое уж русское комьюнити в большинстве своем. Нужно обязательно показать, что ты умнее кого-то? Пишешь, «наверное, ты хотел передать Cells по ссылке». Серьезно? А не в этом ли мой вопрос заключался, как это сделать, и не это ли означали символы «&» в коде? К слову, если человек не знает слова стек в таком смысле, это не значит, что он не знает, что это слово означает. Стеком принято называть STL, а в этом контексте я даже в книгах его не встречал

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

Вопрос заключался не в том, почему это происходит, а в том, как это реализовать передачу по ссылке.

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

Полезный ответ. Его и ждал, спасибо

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

Я не спрашивал тебя, что учить. Не знаешь ответа на заданный вопрос- не пиши

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

в этом контексте я даже в книгах его не встречал

Осиль хотя бы основы архитектуры и работы ЯП, прежде, чем лезть в низкоуровневые языки. Впрочем, о чём это я, ты же даже в алгоритмику не умеешь.

TL;TD Захват по значению спасёт отца русской демократии.

Esper
()

Мне кажется, что int Cells у тебя на стеке. А сигналы могут вызываться после того, как функция производящая connect закончится. И когда зы замыкаешь лямбду на ссылке на значение в стеке, то после выхода из той функции достаешь мусор по этой ссылке.

Не знаю, чего ты хочешь таким кодом добиться, но в твоем случае может помочь замыкать лямбду на Cells по значению:

[Cells]() { Cells--; /* и далее по тексту */ }

P.S. «MyButts» — так себе имя переменной :D

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от Rot1

Вопрос заключался не в том, почему это происходит, а в том, как это реализовать передачу по ссылке.

сделать Cells членом класса.

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

Стеком принято называть STL

Это утверждение наглядно показывает твой уровень владения языком, терминологией и, в частности, STL. Почитай, что ль, в чём разница между выделением памяти на стеке и в куче, каким образом выделяется память под локальные переменные и что с ней происходит при выходе из операторных скобок.

// И да, стеком называется контейнер в STL, со стековой (LIFO) организацией добавления и выдачи данных. Помимо, собственно, стека приложения, о котором тебе все говорят

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

А до этого были неадекватные, да? Тебе ровно тоже три раза сказали, до этого.

Kuzy ★★★
()

connect -ы разьве не парсятся и не преобразовываются во всякий тяжёлый и сложный код? Автор всецело полагался на «мудрость» Qt когда пытался утолкать лямбду в connect? Я бы руки оторвал за такой код в production. Даже если оно сейчас работает то потом хз во что выльется. Смена компилятора, платформы и версии Qt может вылиться в адский бег по граблям.

khenty
()

В чем здесь ошибка?

В днк

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

Ой, и правда. Забыл, что по значению захватывается read-only. Спасибо за поправку.

Там надо еще mutable, чтоб сделать (локальную) копию. В таком случае зименения Cells не будут видны извне (лямбды).

[Cells] () mutable { Cells--; /* ... */ }

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

Стеком принято называть STL,

погоди, а это не ты херню писал про SIGNAL(кококо)?

вроде ты.

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

Автор всецело полагался на «мудрость» Qt когда пытался утолкать лямбду в connect? Я бы руки оторвал за такой код в production.

Ты не знаешь, как работать с коннектом, но поотрывал бы руки тем, кто знает и пользуется этим знанием? У меня даже слов нет.

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

Я этих коннектов, всяких написал немеряно. Вопрос в том зачем пользоваться всякими залётами. Которые могут быть неочевидны другим разрабам? Придёт какой нибудь студент на работу. И будет дёргать каждый раз за рукав при виде подобных залётов. Или опытный «гениальный» коллега не разберётся с такой логикой и порефакторит её неправильно. Нету никакого смысла так писать. Лично я уверен что если бы ТС описал чем его не устроило прямое обращение к Cells изнутри MainWind::MySlot без передачи по ссылке. Решение нашлось бы гораздо быстрее. Он тупо написал, что то типа «Хочу именно так!» Ну приятного бега по граблям в случае удачи!

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

Вопрос в том зачем пользоваться всякими залётами.

Для удобства.

Придёт какой нибудь студент на работу. И будет дёргать каждый раз за рукав при виде подобных залётов.

Учите студента читать документацию прежде, чем дёргать за рукав.

Или опытный «гениальный» коллега не разберётся с такой логикой и порефакторит её неправильно.

Code review спасёт отца русской демократии.

Лично я уверен что если бы ТС

Лично я уверен, что если бы у ТС'а были мозги, у него бы в принципе таких детских проблем не возникало.

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