Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以使用<;,比较双字段>;,=?_C++_C_Bit Fields - Fatal编程技术网

C++ 是否可以使用<;,比较双字段>;,=?

C++ 是否可以使用<;,比较双字段>;,=?,c++,c,bit-fields,C++,C,Bit Fields,我试图使用一个位字段来存储一系列计数器,这些计数器用于生成图形的三角形,因为我只需要其中一些值0,1,2,不想浪费内存。代码应该做的是从bf.vertIndex=0开始,然后循环直到bf.vertIndex=6停止运行。然而,该程序会产生一个无限循环,当我让它将bf.vertIndex的值打印为int时,它总是=1。允许我对这些操作数使用位字段吗?我能给一个给定的位字段的值加上一个整数,比如2吗 float vertexData[12]; triInfo bf; count = 0; bf

我试图使用一个位字段来存储一系列计数器,这些计数器用于生成图形的三角形,因为我只需要其中一些值0,1,2,不想浪费内存。代码应该做的是从bf.vertIndex=0开始,然后循环直到bf.vertIndex=6停止运行。然而,该程序会产生一个无限循环,当我让它将bf.vertIndex的值打印为int时,它总是=1。允许我对这些操作数使用位字段吗?我能给一个给定的位字段的值加上一个整数,比如2吗

float vertexData[12];
 triInfo bf;
 count = 0;
 bf.trinum = 0;
 bf.addedx = 0;//tracks if the x cord needs to be offset = 1 or 0
 bf.addedy = 0;//same as for the x cord
 bf.vertIndex = 0;
 //this loop should make a triangle
 while (bf.vertIndex < 6){
    //sets cordinates for a vertex
    vertexData[bf.vertIndex] = 500 + width*(bf.addedx);
    vertexData[bf.vertIndex] = 500 + height*(bf.addedy);
    //keeps track of the number of vertices created and checks where if an 
    bf.vertIndex += 2;
    if (bf.vertIndex = 2 && bf.trinum == 0){
        bf.addedy = !bf.addedy;
    }
    if (bf.vertIndex = 4 && bf.trinum == 0){
        bf.addedx = !bf.addedx;
    }
    cout << ((int)bf.vertIndex);

}

我在这里看到了一个教程,制作视频的先生将两个值加在一起,这两个值作为字符存储在视频中的点10:15。

您可以将位字段与
=
进行比较,就像任何其他整数一样。但是
=
是赋值,而不是比较,您无意中覆盖了您试图比较的值


如果您使用的是clang或GCC,您应该养成使用
-Wall
编译的习惯,以启用编译器警告,然后仔细阅读警告,以便能够修复根本原因。(其他编译器也有类似的机制;请参阅手册。)

bf.vertIndex=2和
bf.vertIndex=4
不是比较。您的编译器应该警告您这一点。如果这些计数器仅用于创建图形(如上面的
triInfo bf;
是单个局部变量,在作用域结束时被丢弃),那么您将内存保存在错误的位置(从堆栈使用中节省几个字节),以换取性能差和代码更大。让我想知道是什么让你认为这是值得的。(将内存保存在数据类型上会更有意义,您可以保存这些数据类型,而不是保存在单个单元中,而是保存在成百上千的数据类型中……那么多几个字节的代码可能是值得的……仍然可以分析性能以发现真正的瓶颈)您提到值0、1,2-您的
addedx
addedy
代码似乎只使用0或1。显然,
vertIndex
使用的范围更大。如果试图在
bf.trinum
中存储
2
,则会溢出1位宽字段。您的代码没有显示这一点,因此这可能不是一个问题,提到2可能是一种误导。但要谨慎。至少需要2位来处理0,1,2。哦,我完全忽略了这两个符号。改变这些已经停止了无限循环。我正在使用VisualStudio默认使用的编译器,因此我必须对此进行研究。感谢您的快速回答,通过一些其他更改,它现在可以按预期工作了
struct triInfo
{
    unsigned char trinum:1, addedx :1,addedy:1, vertIndex:5;

};