2009-03-05 10 views
2

私は、次のスニペットを持っています。無効な変換の問題C++で

以下のコードで何が問題になっていますか?どのように私はそれを克服することができます。

全コードはここにある:文字列をループするとき

#include <iostream> 
#include <vector> 
#include <fstream> 
#include <sstream> 
#include <time.h> 
using namespace std; 


int main (int arg_count, char *arg_vec[]) { 
    if (arg_count < 3) { 
     cerr << "expected one argument" << endl; 
     return EXIT_FAILURE; 
    } 

    // Initialize Random Seed 
    srand (time(NULL)); 

    string line; 
    string tag1  = arg_vec[1]; 
    string tag2  = arg_vec[2]; 

    double SubsRate = 0.003; 
    double nofTag = static_cast<double>(atoi(arg_vec[3])); 

    vector <string> DNA; 
     DNA.push_back("A"); 
     DNA.push_back("C"); 
     DNA.push_back("G"); 
     DNA.push_back("T"); 


     for (unsigned i=0; i < nofTag ; i++) { 

      int toSub = rand() % 1000 + 1; 

      if (toSub <= (SubsRate * 1000)) { 
       // Mutate 
       cout << toSub << " Sub" << endl; 

       int mutateNo = 0; 
       for (int j=0; j < tag1.size(); j++) { 

        mutateNo++; 


        string base = tag1[j]; // This fail 

        int dnaNo = rand() % 4; 

        if (mutateNo <= 3) { 
        // Mutation happen at most at 3 position 
         base = DNA[dnaNo]; 
        } 

        cout << tag1[j] << " " << dnaNo << " " << base << endl; 
        //cout << base; 

       } 
       cout << endl; 

      } 
      else { 
       // Don't mutate 
       //cout << tag1 << endl; 
      } 

     } 
    return 0; 
} 

はなぜcharからconst char*に無効な変換を得るのですか?

答えて

7

std::string operator []は、単一のcharを返します。文字列を単一のcharでインスタンス化することはできません。

用途:

string base = string(1, tag1[j])代わり

3

文字列tag1 = arg_vec [1];

tag1は文字列リテラルです。

string base = tag1[j];char *の代わりにcharで初期化されます。

char base = tag1[j]; 
4

変更は、エラーメッセージは、それが実際に2を必要とするとき、プログラムが一つの引数を期待すると言うことです。おそらく、Unixの慣習に従うと、あまりにも(または代わりに)必要な使用状況を表示する必要があります:

if (arg_count != 3) { 
    cerr << "Usage: " << arg_vec[0] << " tag1 tag2"; 
    return EXIT_FAILURE; 
} 

名「のargc」と「argvのは」非常に従来のものである(と私は見てきた唯一の主要な選択肢は「交流であります'と' av ')。それにこだわる価値があるかもしれません。

+0

でも、 "if(mutateNo <= 3) – neversaint

+0

@foolishbrat"の中の "base"と競合します:OPはDNAのために間違ったタイプを選択しています(おそらくvector(char))、no? – dmckee

+0

Um。 ..s/the OP/you/Sorry、慎重に読んでいなかった... – dmckee

1

一つの問題に

てみてください、char base = tag1[j];

+0

私はあなたが 'argv'が非常に慣習的であることを意味したと思います。 –

2

tag1[j]が何であるかである)だけcharを取るstringにはコンストラクタがありません。あなたはカップルのオプションがあります。

string base; // construct a default string 
base = tag1[j]; // set it to a char (there is an 
       // assignment from char to string, 
       // even if there's no constructor 

または

string base(1, tag1[j]); // create a string with a single char 

あるいはJosh mentionedとして、あなたはとにかくそれ上の任意の文字列操作を実行していないので、あなたがcharとしてbase定義することができます。これを行う場合はDNAvector<char>に変更する必要があります(文字列の代わりにDNAの初期化を文字列に変更してください)。