Skomplikowana Funckja - iterowanie

0

Witam !
Otóż mam duży problem, ponieważ mam następujący kod funkcji w klasie:

int CreatureAI::addEmotions(ID3Byte ID, char* AJTA)
{
    CreatureEmotions* emot = new CreatureEmotions();
    allCreatureEmotions.push_back(emot);
    allCreatureEmotions.back()->ID.ID = ID.ID;
    allCreatureEmotions.back()->ID.IDType = ID.IDType;
    for(int i = 0; i < 4; i++)
    {
        allCreatureEmotions.back()->AJTA[i] = *(AJTA + i);
    }
    return allCreatureEmotions.size() - 1;
}

allCreatureEmotions - std::list<struct CreatureEmotions*> allCreatureEmotions;

Creature Emotions:

struct CreatureEmotions
{
    ID3Byte ID;
    char AJTA[4];
};

ID3Byte

struct ID3Byte
{
   unsigned int ID : 24;
   unsigned int IDType : 8;
};

addEmotions, dlatego jest int, gdyż po dodaniu nowego wpisu emocji, funkcja ma zwrócić index tego wpisu.

Lecz gdy kompiluje i dodam tylko 1 wpis wszystko jest OK, ale gdy dodaje już drugi lub więcej na liście pojawiają się niestworzone wartości, a ich indexy wypisują mi się od końca (dodaje 1 element - daje mi index 1, jak dodaje 2 daje mi index 0). Dodam że musze operować na wzkaźnikach.

To jest funkcja, która wyświetla zawartość listy:

void CreatureAI::TESTshowAll()
{
    for(unsigned int i = 0; i < allCreatureEmotions.size(); i++)
    {
        std::cout << "ID: " << (allCreatureEmotions.front() + i)->ID.ID
                  << " ID Type: " << (allCreatureEmotions.front() + i)->ID.IDType
                  << " AJTA: " << (int)(allCreatureEmotions.front() + i)->AJTA[0]
                  << " " << (int)(allCreatureEmotions.front() + i)->AJTA[1]
                  << " " << (int)(allCreatureEmotions.front() + i)->AJTA[2]
                  << " " << (int)(allCreatureEmotions.front() + i)->AJTA[3];
                  std::cout << "\n";
    }
    std::cout << "\n\n";
}

Funcka Main, a właściwie jej kawałek:

    CreatureAI cre;
    char tob [5] = {1, 4, 2, 1, 6};
    char tob2[4] = {1, 1, 1, 1};
    char tob3[4] = {2, 2, 2, 5};
    ID3Byte id;
    id.ID = 25;
    id.IDType = 7;
    ID3Byte ido;
    id.ID = 26;
    id.IDType = 7;
    std::cout << cre.addEmotions(id, tob) << " " << cre.addEmotions(id, tob2);
              //<< " " << cre.addEmotions(ido, tob3) << "\n\n";
    cre.TESTshowAll();

Proszę o szybką pomoc z góry dzięki!

0

Proponuję naukę iteratorów. W bardzo ciekawy sposób przemieszczasz się po liście :). Tak powinno być:

void CreatureAI::TESTshowAll()
{
    std::list<struct CreatureEmotions*>::iterator it=allCreatureEmotions.begin();
    while(it!=allCreatureEmotions.end())
    {
                std::cout << "ID: " << (*it)->ID.ID
                  << " ID Type: " << (*it)->ID.IDType
                  << " AJTA: " << (*it)->AJTA[0]
                  << " " << (*it)->AJTA[1]
                  << " " << (*it)->AJTA[2]
                  << " " << (*it)->AJTA[3];
                  std::cout << "\n";
                  ++it;

    }
    std::cout << "\n\n";
}

A jeżeli byś chiał to robić Twoim sposobem to tylko vectory.

0

Wielkie dzięki, dobry pomysł, spróbuję przerobić tak resztę funkcji.
Jeszcze jedno - Co powiecie na to że po użyciu 3 razy funkcji addEmotions wyświetlają się kolejno liczby: 2, 1, 0 zamiast - 0, 1, 2 ??

0

Mógłbyś mi przerobić funkcjęaddEmotions, ponieważ, gdy probuje coś zrobić mam jakieś błędy w działaniu programu.

0

Co do kolejności. Gdy robisz tak:

std::cout << cre.addEmotions(id, tob) << " " << cre.addEmotions(id, tob2);

Wcale nie jest powiedziane, że musi się wykonywać od lewej do prawej.
Zrób tak:

std::cout << cre.addEmotions(id, tob) <<" " ;
std::cout << cre.addEmotions(id, tob2);

Drugiego problemu nie rozumie.

0

Dzięki, chodzi o to, że gdy kompiluje funkcje (jej kawałek)

int CreatureAI::addEmotions(ID3Byte ID, char* AJTA)
{
    CreatureEmotions* emot = new CreatureEmotions();
    allCreatureEmotions.push_back(emot);
    std::list<struct CreatureEmotions*>::iterator it = allCreatureEmotions.end();
    (*it)->ID.ID = ID.ID;

To cały program się wiesza, według odpluskiwacza w tej ost. linijce.
I nie wiem co jest źle :(

0

Mógłbyś jeszcze zerknąć na te 3 funk.:

void CreatureAI::changeEmotionsTo(int index, char* AJTA)
{
    for(int i = 0; i < 4; i++)
    {
        (allCreatureEmotions.front() + index)->AJTA[i] = *(AJTA + i);
    }
}

void CreatureAI::changeEmotionsDelta(int index, char* AJTA)
{
    for(int i = 0; i < 4; i++)
    {
        (allCreatureEmotions.front() + index)->AJTA[i] += *(AJTA + i);
    }
}

void CreatureAI::getSum(ID3Byte ID, char* AJTA)
{
    for(unsigned int i = 0; i < allCreatureEmotions.size(); i++)
    {
        if((allCreatureEmotions.front() + i)->ID.ID == ID.ID &&
            (allCreatureEmotions.front() + i)->ID.IDType == ID.IDType)
        {
            for(int ii = 0; ii < 4; ii++)
            {
                *(AJTA + ii) += (allCreatureEmotions.front() + i)->AJTA[ii]; 
            }
        }
    }
}

Z góry, wielkie dzięki !!! ;)

0

Sorry nie napisałem wszystkiego.
changeEmotionsTo zamienia zawartość AJTA wpisu na to podane.
changeEmotionsDelta dodaje do zawartości wpisu wartości podane przez użytkownika w AJTA
getSum do podanej tablicy (AJTA) zapisuje zsumowaną ilość AJTA wpisów o podanym przez użytkowanika ID (może być ich kilka)

1 użytkowników online, w tym zalogowanych: 0, gości: 1