在 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 的函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在整数范围之间打印字符串 - Python 3

如何在 OpenGL/Glut 中更改鼠标光标的位置?

如何在 GLUT 中调度函数

编写一个函数,将一个数字字符串转换为一个整数

C语言程序求解

Python使用循环结构编写:输入一个整数,将整数中的数字反转,并在控制打印出来?