2012-05-13 87 views
-1

我有這段代碼。從主函數我兩次調用sportPrisevinners函數,如果它是第一次調用這個函數它正常工作,我recive正確的結果,但是當我第二次調用它時,我recive不正確的結果,即使我用相同的參數傳遞此函數。請幫我解決這個問題,但它不會讓我感到不適。C++函數不能調用兩次

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; 
} 
+2

嘗試在valgrind之類的東西中運行它 - 這聽起來像你有未定義的行爲,valgrind非常擅長檢測。 – Flexo

+0

我也試着做一個最小的測試用例(比如1或2個成員)。通過這種方式,您可以在此處提供更多信息,例如預期產出和實際產出。嘗試通過逐個消除操作來縮小出現問題的代碼位置。 – LiMuBei

+0

爲什麼不在程序中使用'std :: vector'?它會更加合適和簡單。當你用C++編寫時,你應該避免直接內存操作。 –

回答

3

我懷疑它是你函數中的靜態局部變量。它們在每次調用函數時都不會有相同的值,這可能會影響結果。這些變量的初始化只執行一次 - 它們第一次進入作用域 - 所以隨後每調用一次函數,你就會獲取這些變量上次函數運行時的值。