在C语言中如何判断GLfloat类型的值是否为空?
问题:GLfloat数组无法与NULL比较,如何判断浮点数组元素是否“为空”
我正在使用C语言和OpenGL,尝试将GLfloat类型的数组与NULL进行比较时遇到问题,代码示例如下:
int i = 0; int m = 0; void glPolygonMove(GLfloat PolygonCoords[i][m], GLfloat xPosition, GLfloat yPosition) // function to add x and y to poly pos { for(int i = 0; PolygonCoords[i][m] != NULL && PolygonCoords[i][m + 1] != NULL; i++){ PolygonCoords[i][m] += xPosition; PolygonCoords[i][m + 1] += yPosition; } }
编译代码时,GCC提示无法将浮点数与NULL进行比较。请问是否有其他方法可以判断float数组元素的值是否为‘空’?
注:GLfloat类型与float类型相同。
解决方案
首先明确:NULL是指针类型的空值标记,完全不能和浮点类型(GLfloat/float)的变量比较,这就是编译器报错的核心原因。浮点类型本身没有原生的“空值”概念,你需要通过自定义规则来标记数组的有效边界或“无效”状态,常见可靠的方案有两种:
1. 额外传入数组的有效元素数量
这是最稳妥的方案,直接在函数参数里传入多边形的顶点总数,用数量来控制循环边界,彻底避免依赖特殊值判断。同时修正原代码中数组参数的错误写法:
// 假设每个顶点存储(x,y)坐标,第二维固定为2 void glPolygonMove(GLfloat PolygonCoords[][2], int vertexCount, GLfloat xPosition, GLfloat yPosition) { for(int i = 0; i < vertexCount; i++){ PolygonCoords[i][0] += xPosition; // 操作x分量 PolygonCoords[i][1] += yPosition; // 操作y分量 } }
这种方式逻辑清晰,不会出现特殊值和业务数据冲突的问题,代码可读性也更高。
2. 使用业务无关的哨兵值
如果必须通过数组元素本身标记结束,可以选一个在你的业务场景中绝对不会出现的浮点值作为“哨兵”,比如FLT_MAX(float类型的最大值)、FLT_MIN,或者自定义一个不可能的坐标值(比如-9999.0f,前提是你的多边形坐标永远不会用到这个值):
#include <float.h> // 需包含此头文件才能使用FLT_MAX/FLT_MIN void glPolygonMove(GLfloat PolygonCoords[][2], GLfloat xPosition, GLfloat yPosition) { // 用FLT_MAX标记顶点数组的结束 for(int i = 0; PolygonCoords[i][0] != FLT_MAX && PolygonCoords[i][1] != FLT_MAX; i++){ PolygonCoords[i][0] += xPosition; PolygonCoords[i][1] += yPosition; } }
注意:使用哨兵值必须确保它不会和正常的多边形坐标值重合,否则会导致循环提前终止或无限循环。
额外修正原代码的其他问题
- 原函数参数
GLfloat PolygonCoords[i][m]写法错误:C语言中不能用全局变量作为数组维度(C99变长数组也不支持这种用法),建议直接指定第二维的固定大小(比如顶点是二维坐标就写[][2])。 - 全局变量
i和m的使用会导致逻辑混乱,循环内的局部i会覆盖全局i,建议直接用0、1来表示x、y分量,避免依赖全局变量。
内容的提问来源于stack exchange,提问作者Tylogree
相关产品推荐
相关产品推荐

