مشكلة التحويل غير صالحة في C ++
سؤال
ولدي المقتطف التالي:
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" هم التقليدي جدا (والبديل الرئيسي الوحيد رأيت هو "ميلان" و "مركبات"). قد يكون من المفيد العالقة مع ذلك.