Ошибка 'path' is not captured

mcmega
Offline
Зарегистрирован: 12.02.2014

Хочу передать в функцию строку, но выдает ошибку 'path' is not captured

Функция:

void getTxt(char path) {
  // Code...
  aClient->onConnect([](void * arg, AsyncClient * client) {
    char request[128];
    sprintf(request,
            "GET %s HTTP/1.1\r\n"
            "Host: %s\r\n"
            "User-Agent: %s\r\n"
            "Connection: close\r\n\r\n",
            path, OTA_HOST, DEVICE_MODEL
           );
    client->write(request);
  }, NULL);
  // Code...
}

Пробовал String использовать, таже ошибка.

mcmega
Offline
Зарегистрирован: 12.02.2014

mcmega пишет:

Хочу передать в функцию строку, но выдает ошибку 'path' is not captured

Функция:

void getTxt(char path) {
  // Code...
  aClient = new AsyncClient();
  aClient->onConnect([](void * arg, AsyncClient * client) {
    char request[128];
    sprintf(request,
            "GET %s HTTP/1.1\r\n"
            "Host: %s\r\n"
            "User-Agent: %s\r\n"
            "Connection: close\r\n\r\n",
            path, OTA_HOST, DEVICE_MODEL
           );
    client->write(request);
  }, NULL);
  // Code...
}

Пробовал String использовать, таже ошибка.

Дополнил несмного функцию, aClient = new AsyncClient();

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

mcmega, Вы не строку передаете, а один символ.

mcmega
Offline
Зарегистрирован: 12.02.2014

Так я и так пробовал:

void getTxt(String path) {
  aClient = new AsyncClient();
  aClient->onConnect([](void * arg, AsyncClient * client) {
    String request;
    request = "GET ";
    request += path;
    request += "HTTP/1.1\r\n";
    client->write(request);
  }, NULL);
}

и так:

void getTxt(const char *path) {
  aClient = new AsyncClient();
  aClient->onConnect([](void * arg, AsyncClient * client) {
    const char *request = "GET " + path + "HTTP/1.1\r\n";
    client->write(request);
  }, NULL);
}

Как правильно сделать? Помогите пожалуйста!

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

это были все  варианты? ;););)

в самом верхнем посте, после char, * поставить, в некоторых версиях среды еще const добавить.

mcmega
Offline
Зарегистрирован: 12.02.2014

Не работает, та же ошибка

void getTxt(const char *path) {
  aClient = new AsyncClient();
  aClient->onConnect([](void * arg, AsyncClient * client) {
    char request[128];
    sprintf(request,
            "GET %s HTTP/1.1\r\n"
            "Host: %s\r\n"
            "User-Agent: %s\r\n"
            "Connection: close\r\n\r\n",
            path, OTA_HOST, DEVICE_MODEL
           );
    client->write(request);
  }, NULL);
}

getTxt("/fw.txt");

и с const и без не работает

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mcmega,

Вы где-то содрали код, использующий лямбда функцию, при этом не понимаете ни сторчки и ни буквы в нём. Но, не расстраивайтесь, также как и Вы, в нём ни буквы не понимают 95% т.н. "разрабов" с десятилетним стажем работы и огромными понтами. Вы, по незнанию, полезли в один из самых (в смысле "самых самых") слложных разделов процедурного программирования.

Это не Ваша лига - Вам ещё рано. Ищите в сети другой пример для сдирания.

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

Так что забудьте про это - ищиите другой пример.

Впрочем, если Вы мне не верите, и считаете, что разберётесь - в добрый путь. гуглите по словам "лямбда функции С++"

mcmega
Offline
Зарегистрирован: 12.02.2014

Это пример использования асинхронного запроса на сервер, но я не хочу создавать несколько одинаковых функций (отличие только в пути). Поэтому попытался передать путь прямо в нее...

Спасибо за замечание, буду читать о лямбда функциях. Но был бы оченьпризнателен в помощи по этой проблеме.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

в строке 3 ппоставь [=], вместо []

mcmega
Offline
Зарегистрирован: 12.02.2014

Спасибо Огромное! Заработало!

Интересная эта тема с лямбда выражениями, сижу изучаю ;)

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

чтобы меньше читать: штука, которая начигнается с [], это лямбда функция.Это не самый простой объект изучения.

В контексте твоей нужды важно, что по-умолчанию оттуда НЕ ДОСТУПНЫ внешние переменные.

Знак [=] делает их доступными... как-бы тебе сказать... ну пусть будет "по чтению". Этого тебе достаточно.

mcmega
Offline
Зарегистрирован: 12.02.2014

wdrakula пишет:

чтобы меньше читать: штука, которая начигнается с [], это лямбда функция.Это не самый простой объект изучения.

В контексте твоей нужды важно, что по-умолчанию оттуда НЕ ДОСТУПНЫ внешние переменные.

Знак [=] делает их доступными... как-бы тебе сказать... ну пусть будет "по чтению". Этого тебе достаточно.

Спасибо за пояснения! Я не добрался еще до такого уровня, разбираюсь с указателями и ссылками пока, но обязательно пойду дальше. После асмы, С++ мне нраится!

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ЕвгенийП пишет:

Это не Ваша лига - Вам ещё рано. Ищите в сети другой пример для сдирания.

Женя, Шабат шалом!   Мне кажется, что мы с Вами в противофазе!

Когда у меня злое настроение и я гоняю чайников - Вы их консультируете. И наоборот!! ;) ;) ;)

По утрам, да еще и в Шабат - я точно добрый. Сам Б..г велел! (...я знаю, мне говорили)   ;)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

wdrakula пишет:

Когда у меня злое настроение и я гоняю чайников - Вы их консультируете. И наоборот!! ;) ;) ;)

На самом деле, чайники - это нормально. Ничего в них плохого нет. Мерзость - это полуграмотные википедики с непомерными понтами. Вчера один начал хамить и бычить, ткнул его носом прямо в даташит, а сам думаю: "начнёт спорить с даташитом (ссылаясь на википедию) или хотя бы этого не делать ума хватит". Хватило! Спорить с даташитом он не стал, а просто использовал "последний и непобиваемый аргумент любого быдла" - послал меня нах :)))) Вот так и живём :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mcmega пишет:

Интересная эта тема с лямбда выражениями, сижу изучаю ;)

Изучать лямбда выражения в С++ занятие неблагодарное, если не знать что это такое вообще. Тем более, в этот язык они притянуты за уши и реализация совершенно неестественная, т.к. они плохо ложатся в структуру языка.

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

1. Начать с изучения лямбда-исчисления как такового (это раздел математики). На вид там голимый гнусный матан с кучей греческих букв, но если просто внимательно читать и сопоставлять буквы (не терять нить), то ничего там особо сложного нет. Это даст понимание собственно основной лямбда-идеи 

2. Изучить какой-нибудь специальный лямбда-язык, т.е. язык в котором лямба-выражения - основа языка. а не "сбоку припёка" как в С++ (например, ЛИСП).

3. После пунктов №№1 и 2 можно переходить к их реализации в С++. В этом случае, Вам не придётся сквозь что-то продираться, а Ваше изучение будет состоять лишь в том. чтобы отметить "ага, вот эта идея тут вот так реализована, а эта - вот так" и немного поматериться на то, что ряд очень полезных вещей в С++ не вошли вовсе (ну, не предназначен этот язык для лямбда-исчисления - чужое оно для него).

Вот как-то так это нужно изучать. Но это, конечно, путь профессионала, а не человека, которому надо раз в жизни использовать и забыть. Вы сами решайте как Вам и что делать.

mcmega
Offline
Зарегистрирован: 12.02.2014

У меня цель изучить хорошо, очень хорошо, как по мне - это основа! Зная С/С++ можно очень многое сделать, а если и правильно понимать как работает компилятор и какой способ лучше использовать при решении разных задачах, то можно в какой то степени приблизиться и к асме. Экскаватор все же приятнее использовать, нежели лопату ;)