2009-03-05 6 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; 
} 

가 왜 const char*char에서 잘못된 변환을받을 수 있나요 문자열 전체를 반복 할 때?

답변

7

std::string operator []은 단일 문자를 반환합니다. 문자열을 단일 문자로 인스턴스화 할 수 없습니다.

사용 : 단지 소요 string에 대한 생성자가 없습니다

string base = string(1, tag1[j]) 대신

3

string tag1 = arg_vec [1];

tag1은 문자열 리터럴입니다.

string base = tag1[j];char * 대신 char으로 초기화됩니다.

char base = tag1[j]; 
4

변경이 오류 메시지가 실제로이 필요할 때 프로그램이 하나 개의 인수를 예상 말한다는 것이다. 'argv를'매우 기존의 (그리고 내가 본 유일한 주요 대안은 '교류 있습니다

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

이름'는 argc을 '과 : 당신은 아마 유닉스 규칙을 따라야하고 (대신 또는) 필요한 사용을 너무 표시해야합니다 '및'av '). 그것은 그만한 가치가있을 것입니다.

+0

하지만 그 경우 "(mutateNo <= 3) – neversaint

+0

@foolishbrat"내부의 "기본"과 충돌이 발생합니다. OP가 DNA (벡터 (char) 일 것임)에 잘못된 유형을 선택했기 때문에? – dmckee

+0

음. ..s/the OP/you/죄송합니다, 신중하게 읽지 않았습니다 ... – dmckee

1

한 문제에

시도, char base = tag1[j];

+0

나는 'argv'가 매우 일반적이라는 것을 의미한다고 가정합니다. –

2

char (tag1[j]이 바로 이것이다). 어쨌든 거기에 모든 문자열 작업을 수행하지 않는 때문에

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

, 당신은 charbase을 정의 할 수 있습니다 : 당신은 몇 가지 옵션이 있습니다. 이렇게하려면 DNAvector<char>으로 변경하고 DNA의 초기화를 문자열 대신 문자를 사용하도록 변경해야합니다.