std :: vector很奇怪

时间:2011-01-19 14:40:22

标签: c++ vector structure

将对象放入向量的顺序是否重要?因为现在我有一个结构,它有一些整数,一些字符数组和ID号(唯一),当我试图找到一个具有特定ID的结构时,我只能找到我作为第一个传递给它的那个,但是当我把ID作为第二个元素我得到没有找到,但我仍然可以得到所需的信息。 当我在所有程序退出时放置不存在的ID(至少那个工作)。

2 个答案:

答案 0 :(得分:1)

代码块

else
{
    printf("Trigger could not be found.\n");
}

是我认为的问题。 如果向量中有ID 1,2和3并且搜索2,则会打印出“第一次循环时无法找到触发器,然后在第二次匹配时找到。”

如果无法打开文件,您可能希望立即返回,并在循环结束后打印出“无法找到触发器”(因为如果找到了触发器,则您已经从搜索功能)

答案 1 :(得分:0)

我会在这里发布,这是代码中最重要的部分: 结构:

struct Trigger {
    unsigned short int ID;
    char Nazwa_Map_Do_Wczytania[30];
    unsigned Offset_Triggera;
    unsigned x1,y1,x2,y2;
    char Identyfikator[30];
};

假设为该结构的全局向量添加新触发器的代码(damnit ==那个全局向量)

    bool UtworzDat(std::vector<std::string> pliki,std::vector<Trigger> trigg, char* sciezka,Naglowek* nagl)
{
Trigger chujew;
    nagl->Ilosc_Triggerow = trigg.size();
        for (unsigned int i = 0; i < trigg.size(); i++)
        {
            memset(&chujew,0,sizeof(Trigger));
            chujew.ID = trigg[i].ID;
            strcpy(chujew.Identyfikator,trigg[i].Identyfikator);
            strcpy(chujew.Nazwa_Map_Do_Wczytania,trigg[i].Nazwa_Map_Do_Wczytania);
            chujew.Offset_Triggera = 0;
            chujew.x1 = trigg[i].x1;
            chujew.x2 = trigg[i].x2;
            chujew.y1 = trigg[i].y1;
            chujew.y2 = trigg[i].y2;
            damnit.push_back(chujew);
        }

然后我设置了正确的偏移量:

long prawdziwy_offset = 0;
    prawdziwy_offset += sizeof(Naglowek); <--Header of file
    for (unsigned int i = 0; i < trigg.size(); i++)
    {
        damnit[i].Offset_Triggera = prawdziwy_offset;
        prawdziwy_offset += sizeof(Trigger);
    }
    prawdziwy_offset += nagl->Ilosc_Obrazow * sizeof(Obraz); <--It's saving structures golding information about each file inside 
    for (unsigned int i = 0; i < wszystkie.size(); i++)
    {
        wszystkie[i].Offset_Obrazu = prawdziwy_offset;
        prawdziwy_offset += wszystkie[i].Rozmiar_Obrazu;
    }

然后它与其他图形一起保存到.dat文件,然后我从文件和处理数据中读取头。我确信拯救是好的。

无论如何这个简单的发现:

Trigger WyciagnijTriggera(unsigned short int ID, Naglowek* nagl)
{
    Trigger temp;
    memset(&temp,0,sizeof(Trigger));
    FILE* wejscie;
    for (int i = 0; i < damnit.size(); i++)
    {
        if (ID == damnit[i].ID) <--here
        {
            wejscie = fopen(nazwa,"rb"); //<--opening file to find it
            if (wejscie != NULL)
            {
                fseek(wejscie,damnit[i].Offset_Triggera,SEEK_SET); //<--Going to right offset
                fread(&temp,sizeof(Trigger),1,wejscie);
                fclose(wejscie);
                return temp;
            }
            else
            {
                printf("Could not open file.\n");
            }
        }
        else
        {
            printf("Trigger could not be found.\n");
        }
    }
}

主要看起来像:

Naglowek nowy;
    Trigger kut, kutzapis,kutzapis2,kutzapis3;
    memset(&kutzapis,0,sizeof(Trigger));
    memset(&kutzapis2,0,sizeof(Trigger));
    memset(&kutzapis3,0,sizeof(Trigger));
    memset(&kut,0,sizeof(Trigger));
    memset(&nowy,0,sizeof(Naglowek));
    std::vector<Trigger> pedal;
    strcpy(kutzapis.Identyfikator,"pedal");
    strcpy(kutzapis.Nazwa_Map_Do_Wczytania, "tet");
    kutzapis.x1 = 5050;
    kutzapis.x2 = 9090;
    kutzapis.y1 = 2323;
    kutzapis.y2 = 2341;
    kutzapis.ID = 1;
    strcpy(kutzapis2.Identyfikator,"pedal2");
    strcpy(kutzapis2.Nazwa_Map_Do_Wczytania, "tet2");
    kutzapis2.x1 = 50502;
    kutzapis2.x2 = 90902;
    kutzapis2.y1 = 23232;
    kutzapis2.y2 = 23412;
    kutzapis2.ID = 2;
    strcpy(kutzapis3.Identyfikator,"pedal3");
    strcpy(kutzapis3.Nazwa_Map_Do_Wczytania, "tet3");
    kutzapis3.x1 = 505023;
    kutzapis3.x2 = 909023;
    kutzapis3.y1 = 232323;
    kutzapis3.y2 = 234123;
    kutzapis3.ID = 3;
    pedal.push_back(kutzapis3);
    pedal.push_back(kutzapis2);
    pedal.push_back(kutzapis);
    UtworzDat(toto,pedal,"maslo.dat",&nowy); //Creating file
    CzytajDat("maslo.dat",&nowy);
    kut = WyciagnijTriggera(2,&nowy); //Tring to find trigger with ID: 2
    std::cout << kut.ID << std::endl << kut.Identyfikator << std::endl << kut.Nazwa_Map_Do_Wczytania << std::endl << kut.Offset_Triggera << std::endl << kut.x1 << std::endl << kut.x2 << std::endl << kut.y1 << std::endl << kut.y2 << std::endl;

对不起这个长屁股代码。