سؤال

ولدي المقتطف التالي:

string base= tag1[j];

وهذا يعطي الخطأ تحويل غير صالح.

ما هو الخطأ في قانون بلدي أدناه؟ كيف يمكنني التغلب عليها.

ورمز كامل هنا:

#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* عندما حلقات عبر سلسلة؟

هل كانت مفيدة؟

المحلول

ووstd::string operator [] إرجاع حرف واحد. لا يمكن إنشاء مثيل سلسلة مع حرف واحد.

استخدم:

وstring base = string( 1, tag1[j] ) بدلا

نصائح أخرى

وتغييره إلى

char base = tag1[j];

وسلسلة tag1 = arg_vec [1]؛

وtag1 هو سلسلة الحرفي.

وتهيئة string base = tag1[j]; مع char بدلا من char *.

وحاول، char base = tag1[j];

وليس هناك المنشئ للstring أن يستغرق سوى 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 

وأو كما <لأ href = "https://stackoverflow.com/questions/613642/why-do-i-get-an-invalid-conversion-from-char-to-const-char-when-looping- أكثر من / 613656 # 613656 "> ذكر جوش ، يمكنك تحديد base باعتباره char منذ كنت لا تنفيذ أية عمليات سلسلة على أي حال. إذا قررت القيام بذلك ستحتاج إلى تغيير DNA أن يكون vector<char> (وتغيير تهيئة DNA لاستخدام حرف بدلا من السلاسل).

ومشكلة واحدة هي أن رسالة الخطأ تقول البرنامج يتوقع وسيطة واحدة عندما يتطلب بالفعل اثنين. ربما يجب عليك اتباع الاتفاقيات يونكس وتظهر استخدام المطلوبة جدا (أو بدلا من ذلك):

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

وأسماء "ARGC" و "ARGV" هم التقليدي جدا (والبديل الرئيسي الوحيد رأيت هو "ميلان" و "مركبات"). قد يكون من المفيد العالقة مع ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top