Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
10 / 7 / 3
Регистрация: 18.03.2020
Сообщений: 57
1

'variable' is not captured

19.03.2020, 11:09. Показов 4229. Ответов 7

Author24 — интернет-сервис помощи студентам
Вот такой код
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
QVector<QTcpSocket *> readers;
 
void MyTcpServer::slotNewConnection()
{
    newClientSocket = mTcpServer->nextPendingConnection();
 
    newClientSocket->waitForReadyRead();
 
    QByteArray Message = newClientSocket->readAll();
 
    qDebug() << Message;
 
    if (Message.contains("Sender"))
    {
        senders.push_back(newClientSocket);
 
        int ClientNumber = senders.size() - 1;
 
        connect(senders.at(ClientNumber), &QTcpSocket::readyRead, [this](){this->slotClientRead(ClientNumber);});
        connect(senders.at(ClientNumber), &QTcpSocket::disconnected, [this](){this->slotClientDisconnected(ClientNumber);});
    }
 
}
При компиляции выскакивает ошибка:
'ClientNumber' is not captured
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.03.2020, 11:09
Ответы с готовыми решениями:

Ошибки: capture of non-variable Game::templog, 'this' was not captured for this lambda function
Пытаюсь очистить вектор mainlog от записей, встречающихся в векторе templog. Решение подсмотрел...

Ошибка 'Run-time error '91': Oject variable or with block variable not set'
Здравствуйте. :) Я пользуюсь Вижуал Базик версии 5.0 и столкнулся вот с какой проблемой....

Ошибка Run Time Error 91 (Object variable or block variable not set)
Добрый день! Есть код для VBA Outlook для открытия файла Excel, копирования из него диапазона, и...

Объявить правильно форму object variable or with block variable not set error 91
Всем доброго дня. Очень прошу помощи, никак не могу сообразить. Есть лист эксель &quot;csv&quot;, есть форма...

7
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
19.03.2020, 11:51 2
Лучший ответ Сообщение было отмечено Master_Tinka как решение

Решение

C++ (Qt)
1
2
        connect(senders.at(ClientNumber), &QTcpSocket::readyRead, [this, ClientNumber](){this->slotClientRead(ClientNumber);});
        connect(senders.at(ClientNumber), &QTcpSocket::disconnected, [this, ClientNumber](){this->slotClientDisconnected(ClientNumber);});
1
2528 / 1247 / 460
Регистрация: 08.11.2016
Сообщений: 3,428
19.03.2020, 11:56 3
Зачем?
C++ (Qt)
1
2
3
4
5
6
senders.push_back(newClientSocket);
 
int ClientNumber = senders.size() - 1;
 
connect(senders.at(ClientNumber), &QTcpSocket::readyRead, [this](){this->slotClientRead(ClientNumber);});
connect(senders.at(ClientNumber), &QTcpSocket::disconnected, [this](){this->slotClientDisconnected(ClientNumber);});
Лучше так:
C++ (Qt)
1
2
3
connect(newClientSocket, &QTcpSocket::readyRead, [this](){this->slotClientRead(senders.size() - 1);});
connect(newClientSocket, &QTcpSocket::disconnected, [this](){this->slotClientDisconnected(senders.size() - 1);});
senders.push_back(newClientSocket);
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
19.03.2020, 12:13 4
Annemesski, тогда смысл теряется. Идея тут в том, что каждая созданная лямбда работает со своим собственным значением ClientNumber, а не с последним добавленным клиентом. Потому это значение и надо захватывать.
0
фрилансер
5499 / 5095 / 1047
Регистрация: 11.10.2019
Сообщений: 13,346
19.03.2020, 12:29 5
TRam_, если senders - поле класса MyTcpServer, то нормально, поскольку this захватывается
0
2528 / 1247 / 460
Регистрация: 08.11.2016
Сообщений: 3,428
19.03.2020, 13:08 6
TRam_, Так номер клиента что так что эдак вычисляется как последний индекс в контейнере, там у меня другая ошибка: единицу ненужно вычитать поскольку сначала вычисляется size, а затем происходит упаковка в контейнер, ну и да, в capture list его (size) тоже нужно передать.
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
19.03.2020, 13:14 7
Алексей1153, речь не о том, что senders недоступно. А в том, что для senders.at(5) должен был быть вызван именно this->slotClientRead(5); . Даже если к моменту обработки слота QTcpSocket::readyRead размер senders уже будет 10 или 20.

Добавлено через 3 минуты
Но в любом случае считаю данный подход неправильным. Потому что senders непрерывно наполняется и нигде не очищается. То есть имеется явная утечка памяти.
0
2528 / 1247 / 460
Регистрация: 08.11.2016
Сообщений: 3,428
19.03.2020, 14:11 8
Цитата Сообщение от TRam_ Посмотреть сообщение
То есть имеется явная утечка памяти.
Тут да: либо утечка памяти, либо, если в this->slotClientDisconnected(ClientNumber) из контейнера удаляется клиентский сокет, то бьются индексы
1
19.03.2020, 14:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.03.2020, 14:11
Помогаю со студенческими работами здесь

Создание класса и ошибка 'object variable or with block variable not set'
Всем привет! Почему когда описываешь класс вот так: Dim a, b, c As Integer Private Sub...

Run-time error '91': Oject variable or with block variable not set
Всем доброго! Есть такая задача: В глобальном модуле Public myRange As Range На 1-й странице...

Run time error 91: Object variable or With block variable not set
Здравствуйте, помогите пожалуйста исправить ошибку в макросе. Вот код: Sub findtekst() Dim c As...

Исправить ошибку For loop control variable must be simple local variable
var q,s,n:integer; a:array of integer; i:integer; Form1: TForm1; implementation {$R...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru