在 GLUT 中打印整数的函数 - 如何编写用于将 int 转换为 char 的函数?
Posted
技术标签:
【中文标题】在 GLUT 中打印整数的函数 - 如何编写用于将 int 转换为 char 的函数?【英文标题】:Function to print integer in GLUT - How to write a function for int to char conversion? 【发布时间】:2021-02-21 19:55:18 【问题描述】:我正在学习 C,但在某些时候一切都变得过于抽象,所以我决定使用 OpenGL 来尝试更具体的涉及用户交互的事情。我也在努力确保我的代码是可移植的,所以我总是在我的 Mac Pro、Raspberry Pi 和旧的 Power Mac 上运行它。
我创建了一个小颜色表来帮助我的生活:
GLfloat white[3] = 1.0, 1.0, 1.0 ;
GLfloat red[3] = 1.0, 0.0, 0.0 ;
GLfloat green[3] = 0.0, 1.0, 0.0 ;
GLfloat blue[3] = 0.0, 0.0, 1.0 ;
GLfloat yellow[3] = 1.0, 1.0, 0.0 ;
GLfloat dark_gray[3] = 0.2, 0.2, 0.2 ;
以及以下打印文本的功能:
void printText(char *text, const GLfloat colour[3], float posX, float posY)
glColor3fv (colour);
glRasterPos2f(posX, posY);
while(*text)
glutBitmapCharacter(GLUT_BITMAP_8_BY_13, *text++);
我这样称呼,例如:printText(fn, white, 0.90f, 0.92f);
而且效果很好!
根据我在论坛中找到的代码,我正在将整数转换为字符串以打印到屏幕帧速率计数器,我想我很了解它在做什么:
int length = snprintf( NULL, 0, "%d", frame_number );
char *fn = malloc( length + 1 );
snprintf(fn, length + 1, "%d", frame_number );
printText(fn, white, 0.90f, 0.92f);
我不想每次想在屏幕上打印一个整数时都编写所有这些代码,但我所做的一切都不起作用。
char charToInt(int integer)
int length = snprintf( NULL, 0, "%d", integer);
char *convertedInteger = malloc(length + 1);
snprintf(convertedInteger, length + 1,"%d", integer);
return convertedInteger;
当我尝试调用 printText(convertedInteger,colour,posX,posY);
时,return *convertedInteger;
都崩溃了
有什么建议吗?
【问题讨论】:
您的意思是char *charToInt(int integer)
? (请注意星号,但您应该收到警告。也许这只是问题中的一个错字。)
很多 GLUT 程序都在做这件事。
@MOehm 不是错字。它一直是这样工作的。 XCode 不会抛出任何警告。
@Neil 我不打算成为一名 GLUT 程序员。我真的只需要一种可移植的方式在屏幕上写入更多动态信息。 =) 谢谢你们。
代码已经损坏。 convertedInteger
是一个指针,32 位或 64 位。通过返回 char
,可以将其缩减为 8 位值。这很可能会损坏您的指针。从printText
访问它会导致崩溃。
【参考方案1】:
我整理了一下:
我是这样称呼它的:
GLprintTextAndInteger("just a bunch of words", int_to_print, colour, posX, posY);
这是函数:
void GLprintTextAndInteger (char *text, int value, float colour[3], float posX, float posY)
int length = snprintf(NULL, 0, "%s %i", text, value);
char *stringToPrint = malloc(length + 1);
snprintf(stringToPrint, length + 1, "%s %i",text,value);
printText(stringToPrint,colour,posX,posY);
free(printText);
然后它正确地调用了我在问题中提到的函数:
void printText(char *text, const GLfloat colour[3], float posX, float posY)
glColor3fv (colour);
glRasterPos2f(posX, posY);
while(*text)
glutBitmapCharacter(GLUT_BITMAP_8_BY_13, *text++);
谢谢大家!
编辑:释放内存以避免在 cmets 中提到的泄漏。
【讨论】:
你应该在调用printText
之后free(stringToPrint)
,否则你每次调用你的函数都会泄漏小块内存。实际上,您不需要在堆上分配内存。您可以打印的“最长”整数(以字符计)约为 -2,000,000,000。只需在其中创建一个本地数组 char tmp[20]
和 sprint
。
谢谢!我会解决的。以上是关于在 GLUT 中打印整数的函数 - 如何编写用于将 int 转换为 char 的函数?的主要内容,如果未能解决你的问题,请参考以下文章