2016-02-02 12 views
9

Mój kod powinien być czytany w pliku tekstowym i mieć wiele wątków przeglądających różne fragmenty linii dla najdłuższego palindromu. Wielkość porcji (ile wierszy) jest określona przez zmienną liczbę wątków przekazanych jako argument. Oryginalny plik tekstowy jest przechowywany w std :: vector, gdzie każdy indeks wektora odpowiada oryginalnemu plikowi.basic_string :: _ M_construct null nie jest prawidłowy po zbudowaniu podvektora łańcuchów znaków

Kiedy przechodzę przez fragment subwektora do findPalindome(), otrzymuję "C++ basic_string :: _ M_construct null not valid" i nie mogę zrozumieć dlaczego. Żaden z moich łańcuchów nie powinien być NULL.

Po przejściu oryginalnych linii wektorowych nie otrzymuję żadnych błędów, więc zakładam, że ma to związek ze sposobem tworzenia subwektora.

Oto mój kod:

Result longestPalindrome(std::string str) 
{ 

    int maxLength = 1; // The result (length of LPS) 
    int start = 0; 
    int len = str.size(); 
    int low, high; 

    // One by one consider every character as center point of 
    // even and length palindromes 
    for (int i = 1; i < len; ++i) 
    { 
     // Find the longest even length palindrome with center points 
     // as i-1 and i. 
     low = i - 1; 
     high = i; 
     while (low >= 0 && high < len && str[low] == str[high]) 
     { 
      if (high - low + 1 > maxLength) 
      { 
       start = low; 
       maxLength = high - low + 1; 
      } 
      --low; 
      ++high; 
     } 

     // Find the longest odd length palindrome with center 
     // point as i 
     low = i - 1; 
     high = i + 1; 
     while (low >= 0 && high < len && str[low] == str[high]) 
     { 
      if (high - low + 1 > maxLength) 
      { 
       start = low; 
       maxLength = high - low + 1; 
      } 
      --low; 
      ++high; 
     } 
    } 
    Result result = {0, 0, 0}; 
    return result; 
} 

void findPalindome(std::vector<std::string> chunk, Result& result) 
{ 
    Result localLargest = {0,0,0}; 
    for (unsigned int i = 0; i < chunk.size(); i++) 
    { 
     Result loopLargest = longestPalindrome(chunk[i]); 
     if (localLargest < loopLargest) 
     { 
      localLargest = loopLargest; 
     } 
    } 
    result = localLargest; 
} 

Result 
FindPalindromeStatic(Lines const& lines, int numThreads) 
{ 
    std::vector<Result> results(numThreads, {0,0,0});; 
    int chunkSize = lines.size()/numThreads; //lines is the original vector with all the lines in the file 
    std::vector<std::thread> threads; 
    int counter = 0; 
    for (int i = 0; i < numThreads; i++) 
    { 
     std::vector<std::string>::const_iterator begin = lines.begin() + counter; 
     std::vector<std::string>::const_iterator end = lines.begin() + ((i + 1) * chunkSize); 
     std::vector<std::string> chunk(begin, end); 
     threads.emplace_back(&findPalindome, std::ref(chunk), std::ref(results[i])); 
     counter = ((i+1)*chunkSize); 
    } 
    for (int i = 0; i < numThreads; i++) 
    { 
     threads[i].join(); 
    } 
    Result x = {0,0,0}; 
    return x; 
} 

Każda pomoc będzie mile widziane i to jest mój pierwszy stos pytanie więc przepraszam za ewentualne błędy.

Odpowiedz

10

Wektor przestaje istnieć pod koniec korpusu pętli . Wciąż jest przywoływany przez jakiś wątek. To się nazywa zwisającym numerem referencyjnym i jest bardzo niedobre.

Błąd, który widzisz może jednak być związany z Result. Nie podajesz jej definicji (lub, nie podałeś jej w momencie pisania tej odpowiedzi), więc trudno powiedzieć. Pamiętaj, że ty, jako ten, który pytasz, co jest nie tak z kodem, jest z pewnością niezdolny do decydowania o tym, co jest ważne lub nie do pokazania: gdybyś wiedział, to prawdopodobnie wiesz, co jest nie tak.

+0

Dziękuję bardzo! To było to! – schwingms

+0

Nie ma za co. Prostym rozwiązaniem jest zadeklarowanie wektora wektorów porcji przed pętlą. –