Question

J'ai l'extrait suivant:

string base= tag1[j];

Cela donne l'erreur de conversion non valide.

Quel est le problème avec mon code ci-dessous? Comment puis-je le surmonter.

Le code complet est ici:

#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;
}

Pourquoi est-ce que je reçois une conversion non valide de char à const char* lors d'une boucle sur une chaîne?

Était-ce utile?

La solution

Le std::string operator [] retourne un seul caractère. la chaîne ne peut pas être instanciée avec un seul caractère.

Utiliser:

string base = string( 1, tag1[j] ) à la place

Autres conseils

Changez-le en

char base = tag1[j];

chaîne tag1 = arg_vec [1];

tag1 est un littéral de chaîne.

string base = tag1[j]; est initialisé avec un char au lieu de char *.

Essayez, char base = tag1[j];

Il n'y a pas de constructeur pour string qui prend juste un char (qui est ce que tag1[j] est). Vous avez plusieurs options:

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

ou

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

Ou sous la forme Josh a mentionné , vous pouvez définir base comme DNA car vous n’effectuez aucune opération sur la chaîne. Si vous décidez de le faire, vous devrez changer vector<char> pour devenir un <=> (et modifier l'initialisation de <=> pour utiliser des caractères au lieu de chaînes).

Un problème est que le message d'erreur indique que le programme attend un argument alors qu'il en a réellement besoin de deux. Vous devriez probablement suivre les conventions Unix et montrer l’utilisation requise (ou à la place):

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

Les noms "argc" et "argv" sont très classiques (et la seule alternative majeure que j'ai vue est "ac" et "av"). Cela vaut peut-être la peine de s'en tenir à cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top