Problema de conversión no válido en C ++
Pregunta
Tengo el siguiente fragmento:
string base= tag1[j];
Eso da el error de conversión no válido.
¿Qué tiene de malo mi código a continuación? ¿Cómo puedo superarlo?
El código completo está aquí:
#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;
}
¿Por qué obtengo una conversión no válida de char
a const char*
cuando hago un bucle sobre una cadena?
Solución
El std::string operator []
devuelve un único carácter. la cadena no se puede instanciar con un solo carácter.
Uso:
string base = string( 1, tag1[j] )
en su lugar
Otros consejos
Cámbialo a
char base = tag1[j];
string tag1 = arg_vec [1];
tag1 es un literal de cadena.
string base = tag1[j];
se inicializa con un char
en lugar de char *
.
Prueba, char base = tag1[j];
No hay ningún constructor para string
que tome solo un char
(que es lo que es tag1[j]
). Tienes un par de opciones:
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
o
string base( 1, tag1[j]); // create a string with a single char
O como Josh mencionó , puede definir base
como un DNA
ya que no está realizando ninguna operación de cadena de todos modos. Si decide hacer esto, deberá cambiar vector<char>
para que sea un <=> (y cambiar la inicialización de <=> para usar caracteres en lugar de cadenas).
Un problema es que el mensaje de error dice que el programa espera un argumento cuando en realidad requiere dos. Probablemente debería seguir las convenciones de Unix y mostrar el uso requerido también (o en su lugar):
if (arg_count != 3) {
cerr << "Usage: " << arg_vec[0] << " tag1 tag2";
return EXIT_FAILURE;
}
Los nombres 'argc' y 'argv' son muy convencionales (y la única alternativa importante que he visto es 'ac' y 'av'). Puede valer la pena seguir con eso.