我有两个向量 一个是
std::vector<unsigned char> one_v;
,另一个是
std::vector<bool> outputValuesInBits;
我将值推送到one_v和outputValuesInBits。
两个向量都有两个字节。
one_v [0]和[1]填充了2个字节的数据
outputValuesInBits [0]到[15]填充了2个字节的数据。
现在,我想将(memcpy)数据复制到char数组。
我可以成功地从one_v向量中复制数据,如下所示。
unsigned char* output = new unsigned char[one_v.size()]();
memcpy(&output, one_v.data(), 2);
但我无法从outputValuesInBits复制数据。
如果我这样做,
unsigned char* output = new unsigned char[outputValuesInBits.size()/8+1]();
memcpy(&output, outputValuesInBits.data(), 2);
它给了我一个错误
error: invalid use of void expression
memcpy(&output, outputValuesInBits.data(), 2);
有谁能告诉我如何将bool矢量复制到char数组?
提前谢谢!
答案 0 :(得分:3)
<?xml version="1.0" encoding="UTF-8" ?>
<project name="Ensemble8 JavaFX Demo Application" default="default" basedir="."
xmlns:fx="javafx:com.sun.javafx.tools.ant">
<property name="JAVA_HOME" value="/usr/lib/jvm/java-8-oracle"/>
<path id="CLASSPATH">
<pathelement location="lib/lucene-core-3.2.0.jar"/>
<pathelement location="lib/lucene-grouping-3.2.0.jar"/>
<pathelement path="classes"/>
</path>
<property name="build.src.dir" value="src"/>
<property name="build.classes.dir" value="classes"/>
<property name="build.dist.dir" value="dist"/>
<target name="default" depends="clean,compile">
<taskdef resource="com/sun/javafx/tools/ant/antlib.xml"
uri="javafx:com.sun.javafx.tools.ant"
classpath="${JAVA_HOME}/lib/ant-javafx.jar"/>
<fx:application id="ensemble8"
name="Ensemble8"
mainClass="ensemble.EnsembleApp"/>
<fx:resources id="appRes">
<fx:fileset dir="${build.dist.dir}" includes="ensemble8.jar"/>
<fx:fileset dir="lib"/>
<fx:fileset dir="${build.classes.dir}"/>
</fx:resources>
<fx:jar destfile="${build.dist.dir}/ensemble8.jar">
<fx:application refid="ensemble8"/>
<fx:resources refid="appRes"/>
</fx:jar>
<fx:deploy outdir="." embedJNLP="true"
outfile="ensemble8"
nativeBundles="all">
<fx:application refId="ensemble8"/>
<fx:resources refid="appRes"/>
<fx:info title="Ensemble8 JavaFX Demo Application"
vendor="Oracle Corporation"/>
</fx:deploy>
</target>
<target name="clean">
<mkdir dir="${build.classes.dir}"/>
<mkdir dir="${build.dist.dir}"/>
<delete>
<fileset dir="${build.classes.dir}" includes="**/*"/>
<fileset dir="${build.dist.dir}" includes="**/*"/>
</delete>
</target>
<target name="compile" depends="clean">
<javac includeantruntime="false"
srcdir="${build.src.dir}"
destdir="${build.classes.dir}"
fork="yes"
executable="${JAVA_HOME}/bin/javac"
source="1.8"
debug="on"
classpathref="CLASSPATH">
</javac>
<!-- Copy resources to build.classes.dir -->
<copy todir="${build.classes.dir}">
<fileset dir="src/app/resources"/>
<fileset dir="src/generated/resources"/>
<fileset dir="src/samples/resources"/>
</copy>
</target>
</project>
没有数据成员函数
答案 1 :(得分:2)
我担心你不能以便携的方式。 Cplusplus page on vector说:专业化与非专业化向量具有相同的成员函数,除了data,emplace和emplace_back,这些专业化中没有。这意味着data
没有定义在您尝试使用它时解释错误的原因。
如果无法选择可移植性,则没有解决方案,因为存储不一定是bool值的数组,但库实现可能优化存储,以便存储每个值一点点。(强调我的)。我对可能的理解是你甚至不能确定16个布尔值存储在2个连续的字节中:实现必须只为你提供一种方法来使用它们(差不多),好像它们存储在16种不同的布尔值。
如果你忘记了兼容性,你必须找到当前实现的源代码,以了解字节数组的存储位置和方式......但这并不容易......
答案 2 :(得分:1)
至少在g ++编译器中,你可以使用vector :: iterator的_M_p成员,它是指向数据的指针。
示例:
std::vector<bool> vBool(16, false);
vBool[0] = true;
vBool[2] = true;
vBool[13] = true;
std::vector<unsigned char> vChar(2);
unsigned short *ptrUS = reinterpret_cast<unsigned short *>( &(vChar[0]) );
*ptrUS = *reinterpret_cast<unsigned short *>(vBool.begin()._M_p);
std::cout << (unsigned int)vChar[0] << " " << (unsigned int)vChar[1] << "\n";
给出输出&#39; 5 32&#39;,它对应于具有第1和第3位(5)以及第6位(32)的数字。