我有一个我不太懂的段错误。 它出现在这一行:
int j = strlen(msg);
有谁知道为什么会这样?
发生的功能:
void Text::displayText( float x, float y, int r, int g, int b, const char * msg){
int j = strlen(msg);
glColor3f( r, g, b );
glRasterPos2f( x, y );
for( int i = 0; i < j; i++ ) {
glutBitmapCharacter( GLUT_BITMAP_TIMES_ROMAN_24, msg[i] );
}
}
我如何调用函数(fps
是一个整数):
text.displayText(3.1f,2.7f,255,255,255,(char*)fps);
当我将msg
参数设置为char时,文本显示正常。
答案 0 :(得分:3)
如果fps
是一个整数,并且一个好的猜测是它在1和100之间,你就是在尝试从该内存地址区域读取数据(直到第一个null为止)被发现)。这将产生一个seg-fault,因为你没有拥有这个记忆。
这就是为什么做类型转换通常是个坏主意(除非你真的知道你正在做什么,否则无法解决)。它告诉编译器&#34;我知道我在做什么,所以不要试图在这里帮助我&#34; - 在这种情况下是错误的。
您可能想要做的是 将 您的整数转换为有效的C-Style字符串(空终止的字符数组),为此您可以使用{ {3}}:
char sFPS[20];
text.displayText(3.1f,2.7f,255,255,255,itoa(fps, sFPS, 10));
对于保持原始displayText
功能的兼容解决方案:
char sFPS[20];
sprintf(sFPS, "%d", fps);
text.displayText(3.1f,2.7f,255,255,255,sFPS);
或者,使用std::string
作为itoa()
的建议。
答案 1 :(得分:3)
您似乎正在尝试将int
转换为字符串。
如果是这种情况,请使用std::string
,而不是char*
:
void Text::displayText(..., const std::string& msg)
要将int
转换为std::string
,请使用std::to_string
:
text.displayText(3.1f, 2.7f, 255, 255, 255, std::to_string(fps));
注意:std::to_string
在旧版本的C ++中不存在,至少需要C ++ 11。