首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用std::向量转换带有Emscripten的另一个结构的结构

用std::向量转换带有Emscripten的另一个结构的结构
EN

Stack Overflow用户
提问于 2021-03-27 00:02:54
回答 1查看 371关注 0票数 3

引言

我正在尝试将C++代码转换为wasm和javascript,这是我项目的一部分,用于显示用于NFT跟踪的特性描述符点。我的想法是检索数据并存储到向量结构中。描述符点是2d空间中点的集合。

代码结构

所以我组织了我的代码:

代码语言:javascript
运行
复制
//the nftPoint struct store the value of each Feature descriptor point
struct nftPoint {
  int x;
  int y;
};

// in this struct i collect all the data the nftPoints are a vector of nftPoint
struct nftMarker {
  int widthNFT;
    int heightNFT;
    int dpiNFT;
  int numFsets;
  int numFpoints;
  int imgBWsize;
  int nftFeaturePoints;
  std::vector<nftPoint> nftPoints;
  int pointer;
};

我在这个例程中填写数据:

代码语言:javascript
运行
复制
 for (int i=0; i<arc->num_F_points_NFT; i++){
      nft.nftPoints.push_back(nftPoint());
      nft.nftPoints[i].x = arc->F_points_NFT->coord[i].x;
      nft.nftPoints[i].y = arc->F_points_NFT->coord[i].y;
      ARLOGi("points x: %d\n", nft.nftPoints[i].x);
      ARLOGi("points y: %d\n", nft.nftPoints[i].y);
    }

没关系,我可以看到控制台上的所有点。

Emscripten绑定

我以这样的方式创建了我的emscripten绑定:

代码语言:javascript
运行
复制
#include <emscripten/bind.h>

using namespace emscripten;

EMSCRIPTEN_BINDINGS(constant_bindings) {

  function("setup", &setup);
  function("_readNFTMarker", &readNFTMarker);

  value_object<nftMarker>("nftMarker")
  .field("width", &nftMarker::widthNFT)
  .field("height", &nftMarker::heightNFT)
  .field("dpi", &nftMarker::dpiNFT)
  .field("numFsets", &nftMarker::numFsets)
  .field("numFpoints", &nftMarker::numFpoints)
  .field("imgBWsize", &nftMarker::imgBWsize)
  .field("nftFeaturePoints", &nftMarker::nftFeaturePoints)
  .field("nftPoints", &nftMarker::nftPoints)
  .field("pointer", &nftMarker::pointer);

  value_array<nftPoint>("nftPoint")
  .element(&nftPoint::x)
  .element(&nftPoint::y);
  

  register_vector<nftPoint>("vector<nftPoint>");
}

我可以编译我的代码,而不会出现错误,只有以下警告:

代码语言:javascript
运行
复制
stderr: /home/walter/kalwalt-github/FeatureSET-Display/emscripten/ARimageFsetDisplay.cpp:101:13: warning: 'readNFTMarker' has C-linkage specified, but returns user-defined type 'nftMarker' which is incompatible with C [-Wreturn-type-c-linkage]
  nftMarker readNFTMarker(int id, std::string datasetPathname) {
            ^
1 warning generated.

非预期结果

但是,当我在浏览器控制台中打印数据时,我得到如下信息:

代码语言:javascript
运行
复制
{width: 893, height: 1117, dpi: 120, numFsets: 9, numFpoints: 165, …}
dpi: 120
height: 1117
imgBWsize: 3989924
nftFeaturePoints: 9298136
nftPoints: vector$nftPoint$
$$: {ptrType: RegisteredPointer, ptr: 9269272, count: {…}}
__proto__: ClassHandle
numFpoints: 165
numFsets: 9
pointer: 9300896
width: 893
__proto__: Object

相反,我将得到带有点数组的对象nftPoints。如何将我的代码改为具有此结果?任何帮助都将是非常感谢的,谢谢!

沃尔特

代码存储库

如果您想在github上查看我的代码,我的存储库是https://github.com/kalwalt/FeatureSET-Display,我正在处理这个按下

EN

回答 1

Stack Overflow用户

发布于 2022-10-15 11:18:26

如果我做对了,您的nftPoints属性在传递C++代码时不会被正确地映射。

您可以做什么而不是将nftPoint绑定为value_array,您可以尝试这样做:

代码语言:javascript
运行
复制
value_object<nftPoint>("nftPoint")
    .field("x", &nftPoint::x)
    .field("y", &nftPoint::y);
    
register_vector<nftPoint>("nftPointVector");

要在JS端使用这一点,您需要将项推入向量。

代码语言:javascript
运行
复制
const nftPoints = [
    {x: 123, y: 345},
    {x: 232, y: 817}
];

const nftPointVector = new wasmModule.nftPointVector();
nftPoints.forEach(point => nftPointVector.push_back(point));

最近我遇到了一个类似的问题,并写了一篇博文,其中包含了更多的细节。希望能帮上忙。https://www.ninkovic.dev/blog/2022/an-improved-guide-for-compiling-wasm-with-emscripten-and-embind

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66825754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档