2011-11-28 1339 views
2

我有一個程序,它使用randomCharacter函數和隨機字符串,使用randomString函數生成一個隨機字符。後者利用前者,並且breedWithMutation使用randomCharacter來概率地突變基因序列的表示。從'char'到'const char *'的轉換無效

#include <ctime> 
#include <boost/random.hpp> 

typedef boost::mt19937 randAlgorithm; 

int mutationsPerGeneration = 100; 
double probabilityOfMutation = 0.05; 
string potentialAlleles = "abcdefghijklmnopqrstuvwxyz "; 
size_t numberOfAlleles = potentialAlleles.size(); 

double random01(randAlgorithm & engine) 
{ 
    boost::uniform_real<double> u01; 
    return u01(engine); 
} 

int randomInteger(randAlgorithm & engine, size_t min, size_t max) { 
    boost::uniform_int<> minmax(min, max); 
    return minmax(engine); 
} 

string randomCharacter(randAlgorithm & engine, string charSet, size_t charSetSize) { 
    return charSet[randomInteger(engine, 0, charSetSize)]; 
} 

string randomString(randAlgorithm & engine, size_t length, string charSet, size_t charSetSize) { 
    string s; 
    s.reserve(length); 
    for (int i = 0; i < length; i++) { 
    s.append(randomCharacter(engine, charSet, charSetSize)); 
    } 
    return s; 
} 

string breedWithMutation(randAlgorithm & engine, string originalGenome, size_t genomeSize) { 
    string mutatedGenome; 
    mutatedGenome.reserve(genomeSize); 
    double mutationDraw; 
    for (size_t i = 0; i < genomeSize; i++) { 
    mutationDraw = random01(engine); 
    if (mutationDraw < probabilityOfMutation) { //The allele undergoes mutation 
     mutatedGenome.append(randomCharacter(engine, potentialAlleles, numberOfAlleles)); 
    } 
    else { 
     mutatedGenome.append(originalGenome[i]); 
    } 
    } 
    return mutatedGenome; 
} 

然而,當我構建應用程序,我得到這些錯誤:在錯誤

main.cpp: In function ‘std::string randomCharacter(randAlgorithm&, std::string, size_t)’: 
main.cpp:31:55: error: invalid conversion from ‘char’ to ‘const char*’ 
main.cpp:31:55: error: initializing argument 1 of ‘std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]’ 
main.cpp: In function ‘std::string breedWithMutation(randAlgorithm&, std::string, size_t)’: 
main.cpp:53:45: error: invalid conversion from ‘char’ to ‘const char*’ 
main.cpp:53:45: error: initializing argument 1 of ‘std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::append(const _CharT*) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>, std::basic_string<_CharT, _Traits, _Alloc> = std::basic_string<char>]’ 

行號並不完全排隊,我知道,但前兩個錯誤指randomCharacter中的唯一行,第三個和第四個錯誤參考此行:mutatedGenome.append(originalGenome[i]); in breedWithMutation。什麼導致了這個錯誤?

回答

4

在C++中,charstring是明顯不同的類型。不能將char值隱式轉換爲string(正如您在randomCharacter中試圖做的那樣)。

您可以將randomCharacter的返回類型更改爲char而不是string,儘管這可能需要在其他地方也進行更改(我沒有詳細查看您的代碼)。

+0

就我而言,這是一個很差的函數名稱選擇。我可以將一個'char'追加到'string'嗎?我意識到他們是明顯不同的類型;我像我一樣命名了'randomCharacter',因爲它只返回一個字母(從外行人的角度來看,而不是C++的意思)。 等待,'string [index]'返回一個'char'或'string'類型嗎?這是問題嗎? –

+0

@pythonscript'string [index]'的返回類型是char。這確實會導致你的問題。 – fefe

1

將退貨類型randomCharacter()更改爲char

1

這不是一個無效轉化爲const char這是一個無效轉換const char*純C中的字符串只是字符數組,或const char* s。所以,你正在使用一個字符,你應該使用一個字符串。

要檢查一個實例:您已設置randomCharacter()以返回C++字符串,但實際上,您試圖從charSet返回單個字符。對我來說,讓你的函數返回char更有意義,但這是你做出的決定。

+0

謝謝;我相應地更新了這篇文章的標題。 –

相關問題