2016-10-27 6 views
2

Ich schreibe einen Code, um Primzahl in eine Datei schreiben, und danach schreibe ich eine andere Funktion, um die Arbeit in vielen Threading zu teilen. Aber mein Problem ist der Compiler schreiben Sie mir einen Fehlerofstream: kann nicht in ofstream konvertieren &

 
error C2664: 'void (int,int,std::ofstream &)' : cannot convert argument 3 from 
'std::basic_string,std::allocator>' to 'std::ofstream &'. 

Aber mein Problem ist, dass ich nicht verstehe, was der Fehler sagt und wo ich etwas tun, was verboten ist.

Dies ist mein Code:

void writePrimesToFile(int begin, int end, ofstream& file) 
{ 
    int i, j, prime = 1; 

    for (i = begin; i <= end; i++) { 
     for (j = begin; i <= end/2; j++) { 
      if (i % j == 0) { 
       prime = 0; 
      } else { 
       file << i << endl; 
      } 
     } 
    } 
} 

void callWritePrimesMultipleThreads(int begin, int end, string filePath, int N) 
{ 
    double startTimer, stopTimer; 

    startTimer = clock(); 
    thread* arr = new thread[N]; 
    for (int i = 0; i < N; i++) { 
     int start = begin; 
     int finish = N; 
     arr[i] = thread(writePrimesToFile, start, finish, ref(filePath)); 
     start = finish; 
     finish += N; 
    } 
    for (int i = 0; i < N; i++) { 
     arr[i].join(); 
    } 
    stopTimer = clock(); 
    cout << "The time that takes is: " << 
      double(stopTimer - startTimer)/CLOCKS_PER_SEC << endl; 
} 
+2

Sie vorbei einen Verweis auf eine 'std :: string' Objekt in den Thread-Funktion, die eine' std :: will ofstream' Referenz (eindeutig erklärt in der Nachricht). Das wird nicht gut funktionieren. –

+0

Oh, und du hast ein Speicherleck zu. Warum benutzen Sie nicht stattdessen 'std :: vector'? –

+0

@Someprogrammerdude Wo habe ich ein Speicherleck? Kannst du mehr erklären ! –

Antwort

4

Ihre Thread-Funktion als std::ofstream Referenz dritte Parameter erwartet, versuchen Sie Bezug auf std::string stattdessen zu binden. So erstellen std::ofstream vor Schleife und weitergeben:

void callWritePrimesMultipleThreads(int begin, int end, string filePath, int N) 
{ 
    double startTimer, stopTimer; 

    std::ofstream file(filePath); 
    // check that file is opened 

    startTimer = clock(); 
    ... 
     arr[i] = thread(writePrimesToFile, start, finish, ref(file)); 

Sie dynamisch zuteilen Array von Thread von new[] und haben nicht delete[] am Ende Ihrer Funktion daher der Speicherverlust. Es wäre einfacher und sauberer sein std::vector<std::thread> stattdessen zu verwenden:

//thread* arr = new thread[N]; 
std::vector<std::thread> arr(N); // replace with this and you do not need to touch anything else 
+0

Warum mit Vektor muss ich nicht den Speicher wie frei löschen oder löschen? –

+0

@RonyCohen, weil die Instanz von 'std :: vector' eine automatische Variable im Gültigkeitsbereich Ihrer Funktion wäre, deren Destruktor den Ressourcenvektor löscht. – Slava

+0

Sorry, ich verstehe nicht –