-1

我有这个代码。从主函数中,我两次调用了 sportPrisevinners 函数,如果它是第一次调用此函数,它可以正常工作并且我收到正确的结果,但是当我第二次调用它时,即使我使用相同的参数传递此函数,我也会收到不正确的结果。请帮我解决这个问题,虽然它不会让我发疯。

const char* countries[] = {"ru", "gb", "us", "uk", "ch", "de"};
const int countriesCount = 6;
const char* sports[] = {"runing", "swiming", "baseball", "football", "jumping", "kerling"};
const int sportsCount = 6;

enum {
    Empty = 0,
    Bronse,
    Silver,
    Gold
};

struct member {
    char sport[9];
    char country[3];
    int points;
    int medal;
};

struct members {
    member* list;
    int count;
};

string medalToStr(int medal)
{
    switch (medal) {
    case Gold:
        return "Gold";
    case Silver:
        return "Silver";
    case Bronse:
        return "Bronse";
    default:
        return "Empty";
    }
}

void printMembers(members &list)
{
    for (int i = 0; i < list.count ; i++)
        cout << /*i << " " <<*/ medalToStr(list.list[i].medal) << " in "
             << list.list[i].sport << " with " << list.list[i].points
             << " from " << list.list[i].country << endl;
}

void generate()
{
    ofstream file("members.dat", ios::binary|ios::trunc);

    member temp;

    for (int i = 0; i < sportsCount ; i++)
        for (int j = 0; j < countriesCount ; j++)
        {
            int count = rand()%5+5;
            for (int k = 0; k < count ; k++)
            {
                strcpy(&temp.sport[0], sports[i]);
                strcpy(&temp.country[0], countries[j]);
                temp.points = rand()%100;
                temp.medal = Empty;

                file.write((char*)&temp, sizeof(member));
            }
        }

    file.close();
}

members sportPrisevinners(const char* sport)
{
    //reading
    ifstream file("members.dat", ios::binary);
    member* loaded = new member[60];
    int pos = 0;
    while (!file.eof())
    {
        member temp;

        file.read((char*)&temp, sizeof(member));

        static bool reading = false;
        if (strncmp(&temp.sport[0], sport, strlen(sport))==0) {
            reading = true;
            loaded[pos++] = temp;
        } else if (reading) {
            break;
        }
    }
    file.close();

    //sorting
    int count = 3;
    for (int i = 0; i < pos-1 ; i++)
    {
        for (int j = i+1; j < pos ; j++)
            if (loaded[i].points<loaded[j].points)
            {
                member temp = loaded[i];
                loaded[i] = loaded[j];
                loaded[j] = temp;
            }

        if (i<count) {
            static int last = -1;

            if (loaded[i].points==last)
                count++;

            loaded[i].medal = count-i;
            last = loaded[i].points;
        } else break;
    }

    //returning
    members result;

    result.list = new member[count];
    memcpy(result.list, loaded, count*sizeof(member));
    /*for (int i = 0; i < count; i++)
        result.list[i] = loaded[i];*/
    result.count = count;

    delete[] loaded;

    return result;
}

int main(int /*argc*/, char */*argv*/[])
{
    srand(time(0));

    generate();

    members r = sportPrisevinners(sports[4]);
    printMembers(r);
    delete[] r.list;
    members l = sportPrisevinners(sports[5]);
    printMembers(l);
    delete[] l.list;

    system("pause");

    return 0;
}
4

1 回答 1

3

我怀疑这是你函数中的静态局部变量。每次调用函数时它们的值都不相同,这可能会影响结果。这些变量的初始化只执行一次——它们第一次进入作用域时——所以每次调用函数时,你都会获取这些变量上次函数运行时的值。

于 2012-05-13T08:53:24.170 回答