【问题标题】:Can bifields be compared, using <,>,=?可以使用 <,>,= 比较双域吗?
【发布时间】:2017-10-02 00:51:16
【问题描述】:

我正在尝试使用位域来存储一系列用于为图形制作三角形的计数器,因为我只需要其中一些值 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);

}

这是我使用的位域的布局方式

struct triInfo
{
    unsigned char trinum:1, addedx :1,addedy:1, vertIndex:5;

};

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

【问题讨论】:

  • bf.vertIndex = 2bf.vertIndex = 4 不是比较。你的编译器应该已经警告你了。
  • 如果这些计数器仅用于 创建 图形(如上面的 triInfo bf; 是单个局部变量,在范围结束时被丢弃),您将节省内存错误的位置(从堆栈使用中节省了几个字节),以换取较差的性能和更大的代码。让我想知道是什么让你认为这是值得的。 (在您保留的数据类型上节省内存会更有意义,而不是在单个单元中,而是在数百/数千/...中,然后再增加几个字节的代码可能是值得的.. . 仍然分析性能以发现真正的瓶颈)
  • 您提到了值 0、1、2——addedxaddedy 的代码似乎只使用了 0 或 1。显然,vertIndex 使用了更大的范围。如果您尝试将 2 存储在 bf.trinum 中,则会溢出 1 位宽的字段。你的代码没有显示,所以它可能不是问题,提到 2 可能是一个红鲱鱼。但要小心。您至少需要 2 位来处理 0、1、2。

标签: c++ c bit-fields


【解决方案1】:

您可以将位域与&lt;&gt;== 进行比较,就像任何其他整数一样。但是= 是一个赋值,而不是一个比较,并且你无意中覆盖了你试图比较的值。

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

【讨论】:

  • 哦,我完全忽略了这两个标志。改变那些已经停止了无限循环。我使用的是 Visual Studio 默认使用的编译器,所以我必须研究一下。感谢您的快速回答,还有一些其他更改现在可以按预期工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多