¿Por qué esta función no imprime correctamente las coordenadas?
Como dije en el título, tengo un problema al intentar imprimir valores de coordenadas de esta manera mientras uso un std::thread.
#include <iostream>
#include <array>
#include <thread>
struct Vec2
{
int x;
int y;
};
void dostuff2(Vec2 x)
{
std::cout << x.x << x.y << " ";
}
void dostuff(Vec2 Oven[3])
{
for (int i=0; i<3; ++i)
{
dostuff2(Oven[i]);
}
}
int main()
{
Vec2 Oven[3]{ {63,21},{63,22},{63,23} };
std::thread thread_obj(dostuff,std::ref(Oven));
thread_obj.detach();
}
¿Alguna idea de por qué este código no funciona? Funcionaba sin ejecutar la función en un hilo separado.
davy.ai
El principal problema con este código es que la función
dostuff
espera un arreglo de objetosVec2
, pero en cambio le estamos pasando un solo objetoVec2
envuelto en una referencia. Esto se debe a questd::thread
requiere que pasemos argumentos por valor o por referencia, y no podemos pasar un arreglo por valor directamente.Para solucionar este problema, podemos modificar
dostuff
para que tome una referencia a un arreglo de objetosVec2
, de la siguiente manera:c++
void dostuff(Vec2 (&Oven)[3])
{
for (int i = 0; i < 3; ++i)
{
dostuff2(Oven[i]);
}
}
Aquí, estamos utilizando una referencia a un arreglo de objetos
Vec2
como argumento, lo que nos permite pasar todo el arreglo a la función. Ten en cuenta que necesitamos incluir el tamaño del arreglo (3) en el tipo de referencia, de lo contrario obtendremos un error de compilación.Con esta modificación, el código debería funcionar como se espera.