2017-10-06 6 views
-1

Visual StudioでC++でプログラミングしています。DLLで使用されているときに実行コードが動作しない

これはバックdouble配列から私に特定の値を与え、私のサブルーチン、次のとおりです。

double specific_value_search(std::string mol_fractions_name[], std::string mass_fractions_name_output[], double mass_fractions_output[], int molecule) 
{ 
    double specific_value=5;                
    std::string a = mol_fractions_name[molecule]; 
    std::string b; 
    for (int i = 0; i <= 11; i++) 
    { 
     b = mass_fractions_name_output[i]; 
     if (a.compare(b) == 0) 
     //if ((a.find(b) != std::string::npos))...this was my second try           // sollte string b in Zeile a gefunden werden, dann... 
     { 
      specific_value = mass_fractions_output[i]; 
      break; 
     } 
    } 
    return specific_value; 
} 

私は.exeファイルに私のプロジェクトでは、このコードを実行するときに、コードは正常に動作します。 私はそれをdllにコンパイルするとき、外部プログラムを介してそれを実行すると、初期化されていないので、値は5を返す。初期化されていない変数を返そうとするとプログラムがクラッシュする。

私は値

下のスクリーンショットでは、視覚スタジオから誰もが何かアドバイスはありますか?

Screenshot 1 - values from visual studio

Screenshot 2 - values from visual studio

+1

少なくとも、その方法をどのように表示するかを[mcve]にすることはできますか? – user463035818

+0

'std :: string'を使うつもりならば、' std :: vector 'はなぜですか?境界チェックを行う方法がないので、渡された配列の境界チェックは絶対に行いません。 'std :: vector'では、少なくともこれらのことを行うには' size() '、' at() 'などがあります。 – PaulMcKenzie

+0

'operator =='を 'std :: string'と一緒に使うことができます。あなたは' compare'メソッドを使う必要はありません。 –

答えて

0

標準のコンテナ(std :: mapまたはstd :: unsorted_map)を使うことができれば、これは簡単になります。それはmoleculeは、名前の数よりも大きいことを可能なら

std::map<std::string, double> fractionNames; 
// fill map 
double specificValue = fractionNames[mol_fractions_name[molecule]]; 

または分数名がマップに見つからない場合は、エラーを生成する必要があることを、あなたは検出するいくつかのコードを追加する必要がありますし、これらの状況に対処してください。

あなたはマップを使用することができない場合は、あなたが

struct FractionName { 
    std::string name; 
    double value; 
} 
typedef std::vector<FractionName> FractionNameVector; 
FractionNameVector fractionNames; 
// again fill fractionNames 

FractionNameVector::iterator iter = std::find(fractionNames.begin(), fractionNames.end(), SearchPredicate(mol_fractions_name[molecule])); 

ベクトルを使用することができますこれは、あなたがCを使用している場合は、ラムダを使用することができ、この

struct SearchPredicate 
{ 
    bool operator()(const FractionName& haystack) { return haystack.name == 
     needle; } 
    explicit SearchPredicate(const std::string name) : needle(name) {} 
    std::string needle; 
}; 

ようSearchPredicateが必要になります++ 11以降。

関連する問題