首页 > 其他分享 >WebAssembly之数据交换(数组)

WebAssembly之数据交换(数组)

时间:2023-02-26 20:14:08浏览次数:28  
标签:WebAssembly bar double ret 数组 var position 数据交换 cwrap

因为工作需要,又倒腾起了WebAssembly,这次主要探索(解决)的问题是Array类型数据的传递

经过咨询以及与ChatGPT的沟通,目前有了如下两种方案:

1.通过类型化数组传递

1 //c++
2        double EMSCRIPTEN_KEEPALIVE add(const double position[3])
3        {
4            double ret = position[0] + position[1] + position[2];
5            return ret;
6        }
 1 //javascript
 2       function toTypedArray_Double(arr) {
 3         var buf = new ArrayBuffer(arr.length * 8);
 4         var i8 = new Uint8Array(buf);
 5 
 6         var i64 = new Float64Array(buf);
 7         arr.forEach((i, index) => {
 8           i64[index] = i;
 9         });
10 
11         return i8;
12       }
13 
14       var data = toTypedArray_Double([1.111111111111, 2.0, -13.0]);
15       var fn = Module.cwrap("add", "number", ["array"]);
16       console.log(fn(data));//-9.888888888889
1 //编译指令
2 emcc a.cpp -s EXPORTED_RUNTIME_METHODS=['cwrap','ccall'] -s EXPORTED_FUNCTIONS="['ccall', 'cwrap']" -o a.out.js

 

2.通过emsdk的bind.h转为vector

 1 //c++
 2 #include <emscripten/emscripten.h>
 3 #include <emscripten/bind.h>
 4 #include <vector>
 5 
 6 using namespace emscripten;
 7 
 8     double EMSCRIPTEN_KEEPALIVE bar(const double position[3])
 9     {
10         double ret = position[0] + position[1] + position[2];
11         return ret;
12     }
13 
14     EMSCRIPTEN_BINDINGS(example)
15     {
16         emscripten::register_vector<double>("VectorDouble");
17 
18         // 增加function,使用const double *参数
19         emscripten::function("bar", &bar, emscripten::allow_raw_pointers());
20     }
1 //javascript
2       var bar = Module.cwrap("bar", "number", ["array"]);
3       console.log(bar([1.111111111111, 2.0, -13.0]));
1 //emcc编译指令(注意必须要加--bind)
2 emcc --bind a.cpp -s EXPORTED_RUNTIME_METHODS=['cwrap','ccall'] -s EXPORTED_FUNCTIONS="['ccall', 'cwrap']" -o a.out.js

 

 

 

待续...

 

 

 

 

 

 

 

 

 

 

 

  

  

标签:WebAssembly,bar,double,ret,数组,var,position,数据交换,cwrap
From: https://www.cnblogs.com/eco-just/p/17157503.html

相关文章

  • [LeetCode]4. 寻找两个正序数组的中位数
    给定两个大小分别为m和n的正序(从小到大)数组nums1和nums2。请你找出并返回这两个正序数组的中位数。算法的时间复杂度应该为O(log(m+n))。分别查找两个数组的......
  • 数组与自定义函数
    一维数组    ·                  字符可以做下标吗?数组的下标必须是整数,那么字符可以做下标吗?比如:int a[255];a[......
  • 稀疏数组SparseArray
    稀疏数组SparseArray1.稀疏数组介绍当一个数组中的大部分元素都为0,或者大部分元素均为同一个值时,此时记录了很多没有意义的数据,可以用稀疏数组来保存该数组。在稀疏数......
  • 02_18_Java语音进阶||day18_Java基础小节练习(17-20部分)数据类型转换&运算符&方法入门
    第一部分数据类型转换&运算符&方法入门第一题编写步骤:定义类Test1定义main方法定义两个byte类型变量b1,b2,并分别赋值为10和20.定义变量b3,保存b1和b2的和,并输出.定义两......
  • 数据结构(借鉴408)-数组
    数据结构数组1.多维数组的存储2.特殊矩阵(数组)的压缩存储3.数组的应用定义与地址计算数组是由n(n>1)个具有相同数据类型的数据元素a1,a2,...,an组成的有序序列,且该......
  • 349. 两个数组的交集
    1classSolution{2public:3vector<int>intersection(vector<int>&nums1,vector<int>&nums2){4set<int>num1;5set<int>num2;......
  • (非函数方法)查找有序数组中x的位置(二分/折半)
    #include<stdio.h>intmain(){intx=0;intarr[]={1,2,3,4,5,6,7,8,9,10};intmax=sizeof(arr)/sizeof(arr[0]);intright=max-1;intleft=0;......
  • 数组类目:219. 存在重复元素 II
    思路:代码:classSolution{publicbooleancontainsNearbyDuplicate(int[]nums,intk){HashSet<Integer>set=newHashSet<>();for(inti=0;i<......
  • 数组类目:1207.独一无二的出现次数
    思路:哈希表首先使用哈希表记录每个数字的出现次数;随后再利用新的哈希表,统计不同的出现次数的数目。如果不同的出现次数的数目等于不同数字的数目,则返回true,否则返回false......
  • 数组类目:1512.好数对的数目
    思路:暴力遍历,符合条件的ans+1,最后输出即可代码:publicclassL_1512{publicintnumIdenticalPairs(int[]nums){intans=0;for(inti=0;i<nu......