我过去不太使用C++,最近做了很多C#,我真的很难再回到C++的基础上来。这是特别棘手的,因为工作要求不能使用任何最方便的C++构造,因此所有字符串都必须是char *,并且没有提供STL列表。
我现在要做的就是创建一个字符串列表,使用STL或者C#来做这件事不会花费我任何时间。基本上,我想要有一个函数,例如:
char **registeredNames = new char*[numberOfNames];
然后,
RegisterName(const * char const name, const int length)
{
//loop to see if name already registered snipped
if(notFound)
{
registeredNames[lastIndex++] = name;
}
}
或者,如果是C#..。
if(!registeredNames.Contains(name))
{
registeredNames.Add(name);
}
我意识到它不起作用。我知道传递的变量的常量性质(常量指针和常量字符串)使它变得相当困难,但我的基本问题是,我过去总是通过使用STL列表等来避免这种情况,所以我从来没有绕过它!
发布于 2008-09-18 11:28:58
您可能需要使用strcmp来查看字符串是否已经存储:
for (int index=0; index<=lastIndex; index++)
{
if (strcmp(registeredNames[index], name) == 0)
{
return; // Already registered
}
}
然后,如果您确实需要存储字符串的副本,则需要分配一个缓冲区并复制字符。
char* nameCopy = malloc(length+1);
strcpy(nameCopy, name);
registeredNames[lastIndex++] = nameCopy;
您没有提到您的输入是否以NULL结尾-如果不是,则需要格外小心,并且strcmp/strcpy将不适用。
发布于 2008-09-18 12:17:24
可以避免使用STL是有正当理由的。当在内存或速度非常重要的固定环境中工作时,使用STL有时很难知道幕后发生了什么。是的,你可以编写自己的内存分配器,是的,速度通常不是问题,但跨平台的STL实现之间存在差异,这些差异可能是微妙的和潜在的but。在考虑使用内存时,内存可能是我最关心的问题。
内存是宝贵的,我们如何使用它需要严格控制。除非你曾经走过这条路,否则这个概念可能没有意义,但它是真的。我们确实允许在工具中使用STL (在游戏代码之外),但在实际游戏中是被禁止的。另一个相关的问题是代码大小。我不太确定STL对可执行文件的大小有多大的贡献,但我们已经看到使用STL时代码大小的显著增加。即使你的可执行文件“只”大了2M,你的游戏的其他东西的RAM也减少了2M。
STL当然很好。但它可能会被不知道自己在做什么的程序员滥用。这不是故意的,但当你不想看到它们时,它会带来令人不快的惊喜(同样,内存膨胀和性能问题)
我相信你已经接近你的解决方案了。
for ( i = 0; i < lastIndex; i++ ) {
if ( !strcmp(®isteredNames[i], name ) {
break; // name was found
}
}
if ( i == lastIndex ) {
// name was not found in the registeredNames list
registeredNames[lastIndex++] = strdup(name);
}
您可能不想使用strdup。这只是一个如何存储给定示例的名称的示例。您可能希望确保自己不想为新名称分配空间,或者使用应用程序中可能已有的其他内存结构。
请不要写字符串类。我曾经举过string类作为如何不在C++中重新设计基本C结构的最糟糕的例子。是的,string类可以对你隐藏许多漂亮的细节,但它的内存使用模式很糟糕,而且不适合控制台(例如ps3或360等)环境。大约8年前,我们做了同样的事情。200000+内存分配在我们进入主菜单之前。内存非常零散,我们无法让游戏的其余部分适应固定的环境。我们最终把它拆掉了。
类设计在某些方面很棒,但这不是其中之一。这只是一个观点,但它是基于现实世界的经验。
发布于 2008-09-18 11:46:40
如果可移植性是个问题,您可能需要查看STLport。
https://stackoverflow.com/questions/91715
复制相似问题