Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过迭代器访问向量< String >元素时的C++错误_C++_Vector_Iterator_Sdl - Fatal编程技术网

通过迭代器访问向量< String >元素时的C++错误

通过迭代器访问向量< String >元素时的C++错误,c++,vector,iterator,sdl,C++,Vector,Iterator,Sdl,有关守则如下: 我已经分别测试了每个护士对象分配和整个内容,数据存储正确,但由于某种原因,我无法访问它来确定要显示哪些磁贴。我也尝试过在没有迭代器的情况下访问数据,但也没有成功。任何想法都会得到充分的赞赏,我已经花了几个小时试图解决这个问题:/ for(unsigned int j = 42; j < EntityManager::getInstance()->nurses.size() * 42 + 42; j += 42) //increment y axis { int

有关守则如下:

我已经分别测试了每个护士对象分配和整个内容,数据存储正确,但由于某种原因,我无法访问它来确定要显示哪些磁贴。我也尝试过在没有迭代器的情况下访问数据,但也没有成功。任何想法都会得到充分的赞赏,我已经花了几个小时试图解决这个问题:/

for(unsigned int j = 42; j < EntityManager::getInstance()->nurses.size() * 42 + 42; j += 42) //increment y axis
{
    int rosterCounter = 0;
    int count = 0;
    vector<string> roster = EntityManager::getInstance()->nurses[count]->getRosterData();
    vector<string>::const_iterator iter;

    iter = roster.begin();

    for(unsigned int i = GraphicsCore::getInstance()->screenWidth; rosterCounter <= EntityManager::getInstance()->getSize() && iter != roster.end(); i -= 64) //iterate through each column, RTL
    {

        TextBox * text;

        if(*iter == "D")
        {
            text = new TextBox("resources/tiles/textboxshortd.png", i, j, (TextBox::type) 4);
        }
        else if(*iter == "N")
        {
            text = new TextBox("resources/tiles/textboxshortn.png", i, j, (TextBox::type) 4);
        }
        else if(*iter == "O")
        {
            text = new TextBox("resources/tiles/textboxshorto.png", i, j, (TextBox::type) 4);
        }
        else
        {
            text = new TextBox("resources/tiles/textboxshort.png", i, j, (TextBox::type) 4);
        }
        iter++;
        rosterCounter++;
    }
    count++;
}

编辑:它现在运行,但第一次迭代似乎什么也不做,由于某种原因,第一列中根本没有放置平铺,而且它似乎完全偏移了1。我试过begin-1,但也没用。感谢你们的帮助,伙计们:

你们永远不会检查迭代器,看它是否正确!=结束。如果是,当您尝试取消引用或增加它时,它将导致未定义的行为


另外,请注意,您的代码很可能会泄漏。您从不删除文本

如果你知道它的大小

vector.size()
您可以通过以下方式访问每个元素:

vector.at(x);
如果实体管理器给您一个数据副本,那么这应该是可以的,因为它不是指针

你可能要解释的是,为什么你有如此神秘的for循环,你的第一个循环从索引变量中的42开始是毫无意义的,我认为你在一步中做了两件事,这让你的生活更加困难

正如您可能知道的,您应该提供它崩溃的线路

如果您首先选择数据并在显示它之后,您可能会自己发现错误


编辑:我已经意识到你似乎不明白你在做什么,不要只是在你的代码中乱动,想象你的问题。此外,我不清楚您的逻辑,当您有一个包含10个元素的向量时,如果元素0不会打印出您希望看到的值,为什么要尝试访问元素-1?您应该反过来尝试,检查0处的值为什么不包含您想要的内容。我还假设您尚未编写初始代码,请先尝试理解代码。拿一些纸,画出当前的工作流程和您试图构建的目标工作流程。

更新的问题,对不起,我应该添加一个旁注:您可能应该使用智能指针来显示文本。您是否可以在其上设置调试器,以准确地找出它在哪里崩溃,以及如何崩溃?ifiter=这可能是错误的。您需要将其作为条件添加到for循环:;rosterCounter getSize&iter!=花名册.end@JarrodCabalzar begin-1不是个好主意!你读过向量的C++参考吗?你试过一个简单的例子吗?为了您自身的安全,请打印迭代器的值,或者开始调试您的应用程序。我之前已经尝试过了,但没有什么不同。现在我将再次添加它并进行更新。@JarrodCabalzar在取消引用迭代器后,您正在检查迭代器。真的吗?@JarrodCabalzar如果迭代器是end,*iter==D是非法的。@JarrodCabalzar也是,你是在哪一行看到崩溃的?@LuchianGrigore对此非常关注,看到我对问题本身的评论,重新检查迭代器42是关于瓷砖放置40px瓷砖高度和行间距2px仅供参考:但我想你是对的,我应该一次做两件事…我实际上已经写了整件事,这是我一年前建造的一个带端口的游戏引擎。@JarrodCabalzar如果你已经写了全部内容,为什么你不知道iter.begin-1是个非常糟糕的主意?老实说,即使是在初学者的课堂上,我也从未见过有人试图这样做,如果是这样的话,只是为了看看会发生什么