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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top