使用xt::adapt转换C风格数组为xt::array报错,能否直接实现?
解决xt::adapt适配C风格数组的编译错误
问题根源
你代码里的unsigned char arr_1d[size]是变长数组(VLA),这是GCC的非标准扩展(C++标准并不支持VLA)。xt::adapt的模板参数无法处理这种类型——因为VLA的类型是unsigned char (&)[size],其中size是运行时变量,不能作为模板参数传递,导致模板替换失败,触发编译错误。
不需要转vector,两种直接转换的方案
方案1:使用编译期固定大小的数组
如果数组大小是编译期已知的(比如示例里的24),把size改成constexpr即可:
constexpr std::size_t size = 24; unsigned char arr_1d[size]; for (auto i = 0; i < size; ++i) { arr_1d[i] = i + 1; } // 直接适配,无编译错误 auto img = xt::adapt(arr_1d, xt::xshape<3, 2, 4>(), xt::no_ownership());
此时数组类型是unsigned char (&)[24],属于编译期固定类型,可以被xt::adapt的模板正确处理。
方案2:适配运行时动态分配的数组(对应stb加载场景)
如果数组大小是运行时确定的(比如stb加载图像时,宽、高、通道数都是运行时获取的),不要用VLA,改用动态分配的指针,然后调用xt::adapt的指针+元素个数重载:
// 假设从stb获取的运行时参数 int width = 4, height = 2, channels = 3; std::size_t size = static_cast<std::size_t>(width) * height * channels; // 动态分配数组(stbi_load也会返回类似的指针) unsigned char* arr_1d = new unsigned char[size]; // 用stbi_load加载图像数据到arr_1d... // 适配时指定指针、元素总数、所有权、形状 auto img = xt::adapt( arr_1d, size, xt::no_ownership(), xt::make_shape(height, width, channels) // 运行时形状用make_shape ); // 注意:如果是stbi_load返回的指针,要记得用stbi_image_free释放,不要用delete
总结
不需要先转成std::vector,只要避免使用非标准的变长数组,改用编译期固定大小数组或动态分配的指针+运行时大小,就能直接用xt::adapt完成转换。
内容的提问来源于stack exchange,提问作者Der Fänger im Roggen
相关产品推荐
相关产品推荐

