C++ 当作为参数传递给Freetype时,const char将被清空
我挠头想弄明白为什么这个论点没有正确通过。以下是相关代码,为简洁起见将其缩短:C++ 当作为参数传递给Freetype时,const char将被清空,c++,c,freetype2,C++,C,Freetype2,我挠头想弄明白为什么这个论点没有正确通过。以下是相关代码,为简洁起见将其缩短: bool CCImage::initWithString( const char * pText, int nWidth/* = 0*/, int nHeight/* = 0*/, ETextAlign eAlignMask/* = kAlignCenter*/, const char * pFontName/* = nil*/, int nSize/* = 0*/)
bool CCImage::initWithString(
const char * pText,
int nWidth/* = 0*/,
int nHeight/* = 0*/,
ETextAlign eAlignMask/* = kAlignCenter*/,
const char * pFontName/* = nil*/,
int nSize/* = 0*/)
{
do
{
BitmapDC &dc = sharedBitmapDC();
const char* pFullFontName = CCFileUtils::fullPathFromRelativePath(pFontName);
CCLog("font is %s\n", pFullFontName);
dc.getBitmap(pText, nWidth, nHeight, eAlignMask, pFullFontName, nSize);
}
bool getBitmap(const char *text, int nWidth, int nHeight, CCImage::ETextAlign eAlignMask, const char * pFontName, float fontSize) {
FT_Face face;
FT_Error iError;
bool bRet = false;
if (libError) {
return false;
}
do {
iError = FT_New_Face( library, pFontName, 0, &face );
CCLog("error is %d font is %s\n", iError, pFontName);
if (iError) {
iError = FT_New_Face( library, "/usr/share/fonts/arial.ttf", 0, &face );
}
}
大约20%的情况下,字体显示正确。其余时间,在第一张FT_NEW_FACE失败后,它们显示为arial。CCLogs的输出(只是printf的一个宏)说明了原因。以下是尝试加载四个标签的字体的输出:
font是./Res/fonts/kaculation.ttf
错误为1,字体为
字体为./Res/fonts/kaculation.ttf
错误为0 font is./Res/fonts/kaculation.ttf
字体为./Res/fonts/kaculation.ttf
错误为1,字体为
字体为./Res/fonts/kaculation.ttf
错误为1,字体为
如您所见,对于除第二个以外的所有对象,pFontName在通过initWithString传递和通过getBitmap接收之间以某种方式被清空。但我不知道为什么。更令人困惑的是,它完全是随机的,什么时候起作用,什么时候不起作用。我是为WebOS编写的,这在其他平台上似乎没有发生(事实上,几天前它在WebOS上运行得很好),但我不认为这是一个平台问题,它似乎太基本了。我比计划晚了两周,压力很大,所以我可能错过了一些简单的事情。但我希望有一些想法能让我重新取得进步,而不是旋转轮子。为简洁而缩短“是否对
getBitmap
开始时发生的事情有任何影响?似乎某些内容已被更改,因为您发布的代码有一个do{…}
而没有,而在末尾:-)。如果在调用FT\u New\u Face
之前记录传递给getBitmap
的参数,名称是否正确?(可能FT\u New\u Face
,尽管声明中有const
,但有时会在其路径名参数上涂鸦。可能不是试图通过const char*
写入,这似乎是一个太明显的错误,但可能其他地方的某个指针或偏移量正在损坏。在之后,您看到了什么>CCLog
调用getBitmap
,转储(比如)的整数值pFontName
的前16个字节通过将从CCFileUtils::fullPathFromRelativePath
返回的NSString*
转换为const char*
,可以使NSString
对象未使用,从而能够被释放。这使得const char*
指针可能指向不再存在。有一段时间我忘了添加到缩短版中,但开头是一样的。嗯,如果我在FT_New_Face之前记录它,它确实会正确显示。它不是NSString,我使用的是CoCoCos2D-x,而不是CoCoCos2D。@DavidSchwartz:假设这段代码使用的是CoCoCos3Dx,CCFileUtils::FullPathFromRelativePathh
直接返回字符常量*
)。