2009-06-25 12 views
0

私は、このコンストラクタは(、ない私が他の誰かによって)C++ライブラリで実装されている:のconstのchar *パラメータとして変数が機能する

私は私自身の機能で使用したい
Variables(const char *s) 

、便利な() 。 これはuseful()関数で、コンストラクタの変数(const char * s)へのパラメータとして送信したいintを計算します。

私はintを文字列に変換してからconst char *データ型に変換します。 そして、それらをVariablesコンストラクタのパラメータとして送信しましたが、エラーメッセージが表示されます。

変数loopOEの整数に応じて、文字列「xi」を作成しています。ここで、iはベクトルloopOEのi番目の整数です。たとえば、ループ[0] = 2の場合、文字列 "x2"を作成し、次にconst char *に変換し、コンストラクタの変数(const char * s)に送信します。

My機能)(有用なのは、次のようになります。

void useful(){ 
    vector<int> loopsOE; 
    for (unsigned int i=0;i<6;i++) 
      loopsOE.push_back(i); 

for (unsigned int i=0;i<loopsOE.size();i++){ 
    //convering int to string 
    std :: ostringstream sstreamComplete; 
    sstreamComplete << loopsOE[i]; 
    std :: string loopsOEStr=sstreamComplete.str(); 
    //construct the string variable "xi" 
    string varPoly("x"); 
    varPoly.append(loopsOEStr); 
    //converting the string to char* 
    const char* varPolyConverted=varPoly.c_str() 
} 
std::vector<polynomial_t> Vec(myEdgesIntersect.size()); 
Variables V(varPolyConverted); 
} 

私は、この関数をコンパイルしようとすると、私は次のようなエラーメッセージが出ます:

QSweepComplete.cpp: In member function 'void QSweepComplete::prealexMatrix()': QSweepComplete.cpp:975: error: 'varPolyConverted' was not declared in this scope make: *** [.obj/QSweepComplete.o] Error 1

それでも私はのように理解していないが単純な定数で関数を次のように変更すると、次のようになります。

void usefulModified(){ 
    vector<int> loopsOE; 
    for (unsigned int i=0;i<6;i++) 
      loopsOE.push_back(i); 

for (unsigned int i=0;i<loopsOE.size();i++){ 
    //convering int to string 
    std :: ostringstream sstreamComplete; 
    sstreamComplete << loopsOE[i]; 
    std :: string loopsOEStr=sstreamComplete.str(); 
    //construct the string variable "xi" 
    string varPoly("x"); 
    varPoly.append(loopsOEStr); 
    //converting the string to char* 
    const char* varPolyConverted=varPoly.c_str() 
} 
std::vector<polynomial_t> Vec(myEdgesIntersect.size()); 
    const char * str="x0"; 
Variables V(str); 
} 

関数コンパイル何の問題もなく走ります。

誰かが何か提案があれば、私はそれらを高く評価します。

ありがとうございます。 幸運を祈り、 madalina

答えて

3

varPolyConverted変数は、ループ内でのみ表示され、あなたはループの後にそれを使用しよう - 変数がその時点で範囲外であるため、これは許可されていません。そのため、コンパイラはコードをコンパイルすることを拒否します。

変数をスコープ内でのみ使用するようにコードを変更する必要があります。ループ内で変数を宣言したり、ループ内で関数を呼び出すことができます。

前者を選択した場合は、STLオブジェクトが多く、そのうちの1つのバッファへのポインタが必要です。オブジェクトは、少なくともバッファへのポインタと同じスコープを持っていなければなりません定義されていない動作に変換します。

2

問題は、forループ内でvarPolyConvertedを宣言していることです。その後、forループの前に

const char* varPolyConverted; 

を追加するだけの操作を行います。

varPolyConverted = varPoly.c_str(); 

EDIT:これはコンパイル時のエラーを修正しますが、ダングリングポインタを残すことがあります。変数が宣言されている場所と同じスコープで関数呼び出しを行う方が良いでしょう。

+0

もしそうなら、彼はぶら下がりのポインタを得るでしょう。 – sharptooth

+0

この場合、ループを終了する前にvarPolyConvertedに0を代入すると効果があります。 – AlbertoPL

+0

それから彼はいつも彼が望むことではない関数呼び出しの場所でゼロを持つでしょう。 – sharptooth

0

変数varPolyConvertedのスコープはforループ内にあり、外部にアクセスすることはできません。

0

const char * varPolyConvertedがブロック内で宣言されているため、エラーが発生します。そのブロックの外側にアクセスしようとしていますが、ブロックの外側には表示されません。

forループの前に定義すると、forループの後に表示されます。

0

は、第二のループ

0
const char* varPolyConverted 

はあなたのためのループで定義されている前varPolyConverted 宣言します。 したがって、forループの後ではもはや有効な宣言ではありません。

関連する問題