Re: lambda recursion
Am 29.04.2013 12:29, schrieb Andy Champ:
On 29/04/2013 08:46, Chris Forone wrote:
Am 28.04.2013 23:50, schrieb Andy Champ:
On 28/04/2013 17:21, Chris Forone wrote:
or it cant :-)
"error: 'split' is not captured"
Are you using MS Visual Studio? Some versions have problems in capturing
variables from outer scopes.
Andy
i use mingw gcc 4.8.0 from page
http://sourceforge.net/projects/mingwbuilds.
chris
In that case we'll need a code sample.
Hack away at your code until you have the smallest _compilable_ program
that shows the problem. You never know on the way you may spot the
problem; if you don't, post the code up here and you'll get an answer.
Andy
#include <array>
#include <functional>
#include <iostream>
#include <numeric>
int main()
{
// five 3d vectors (xyz)
std::array<float, 5 * 3> store =
{
1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f
};
std::function<void (std::size_t, std::size_t)> split =
[&](std::size_t first, std::size_t second)
{
if (first < second)
{
std::size_t middle((second - first) / 2);
// vector addidion
std::transform(&store[first], &store[first + 3], &store[second],
&store[middle], std::plus<float>());
// normalize new vector
std::transform(&store[middle], &store[middle + 3], &store[middle],
std::bind(std::divides<float>(), std::placeholders::_1,
std::sqrt(std::inner_product(&store[middle], &store[middle + 3],
&store[middle], 0.0f))));
// if you uncomment, gcc gives error, vc 2012 express compiles
// and crashes after start
//split(first, middle); split(middle, second);
}
};
split(0, 12);
std::copy(store.begin(), store.end(),
std::ostream_iterator<float>(std::cout, " "));
}