2017-07-21 26 views
-5

私は呼び出す必要がある機能を持つArduinoプロジェクト用のライブラリを使用しています。この関数は、const char*の1つのパラメータを受け入れます。 fooとしましょう。int型の値を持つchar配列を入力してください

intの値をfooに渡す必要があるので、最初にsprintfを使用して変換します。ここまでは順調ですね。私はcharに変換int値で配列を埋めた後、配列の値のそれぞれにFOOを呼び出すしようとすると、

問題が来ます。

私はこの問題より良いを説明願っています:

#include <iostream> 
using namespace std; 


// This function cannot be modified because 
// is a part of a library 
void foo(const char *bar){ 
    cout << "Result: " << bar << endl; 
} 

int main() { 
    char *values[10]; // My array of values 
    char tmp[10]; // Temporary buffer for the int > char conversion 

    for(int i = 0; i < 10; i++){ 
     int samplevalue = i * 2; // Just a sample value, not important 
     sprintf(tmp, "%d", samplevalue); // Copy the sample value to the temporary buffer 
     values[i] = tmp; // Assign the value of the temp var to a position in my values array 
     cout << values[i] << endl; 
    } 

    cout << "==============" << endl; 


    // Here comes the problem: 
    for(int i = 0; i < 10; i++){ 
     foo(values[i]); 
    } 

    return 0; 
} 

そのコードの出力は以下の通りです:

0 
2 
4 
6 
8 
10 
12 
14 
16 
18 
============== 
Result: 18 
Result: 18 
Result: 18 
Result: 18 
Result: 18 
Result: 18 
Result: 18 
Result: 18 
Result: 18 
Result: 18 

あなたが見ることができるように、結果の全てが行が等しいです最後の値はtmp varに割り当てられています。私は、values[10]配列内の各値に、実際の値ではなくtmp変数へのポインタが含まれているからだと思います。

私はそれぞれの結果がの行と異なる番号を持っています。最初のforのように、ループします。

私はC++のエキスパートではありませんし、どんな助けも高く評価されることは間違いないと思います。

ありがとうございます!

+1

あなたは1つの 'tmp'しか持っていませんが、なぜ複数の値を期待しますか? – stark

+0

これは[tag:arduino]とタグ付けされているので、あなたは 'std :: sting'と' std :: to_string() 'へのアクセス権がないということですか? – NathanOliver

+0

期待値(char *)values [10]またはchar(* values [10])、 ブラケットを使用して、使用しようとしている種類を指定してください。 –

答えて

-1

私はついにそれを稼働させなければなりませんでした。 Arduinoのでは文字列はString variable;として宣言されている、とc_str()機能がconst char *に文字列を変換し、私はStringint数を変換し、const char *へ:

for(int i = 0; i < 10; i++){ 
    String tmp = String(i * 2); 
    values[i] = tmp.c_str(); 
} 

をそして、それはそれです!それは今働きます:)

+0

それは間違っています、 'values [i]'はぶら下がりポインタになります。 –

1

char *ポインタと配列は文字列ではありません。代わりにstd::stringを使用してください。

#include <iostream> 
using namespace std; 


// This function cannot be modified because 
// is a part of a library 
void foo(const char *bar) 
{ 
    cout << "Result: " << bar << endl; 
} 

int main(void) 
{ 
    std::string values[10]; // My array of values 
    char tmp[10]; // Temporary buffer for the int > char conversion 

    for (int i = 0; i < 10; i++) { 
     int samplevalue = i * 2; // Just a sample value, not important 
     sprintf(tmp, "%d", samplevalue); // Copy the sample value to the temporary buffer 
     values[i] = tmp; // Assign the value of the temp var to a position in my values array 
     cout << values[i] << endl; 
    } 

    cout << "==============" << endl; 


    // Here comes the problem: 
    for (int i = 0; i < 10; i++) { 
     foo(values[i].c_str()); 
    } 

    return 0; 
} 

tmpに配列、あなたのvalues配列ポイントですべてのポインタを使用している場合、あなたはtmpにあるため、あなたがsprintf()したがって、この

fprintf(stdout, "%p\n", values[i]); 

ようvaluesをループしてアドレスを印刷していることを確認することができますすべての値、印刷される値は常に最後のものです。

values[i] = tmp; 

は、values[i]tmpを指しているため、values[i]にアクセスすると、実際にはtmpにアクセスします。

std::stringでコピーが発生します。

また、sprintf()は非常に危険であるため、文字列ストリームを使用して各values[i]に直接数値を書き込む必要があります。今、あなたがvalues内の要素の数を変更することができますし、あなたがする必要がある場合は、配列としてそれを使用することができます

それとも、より良い、このような現実のC++のソリューションを使用し、

#include <iostream> 
#include <vector> 
#include <sstream> 

// This function cannot be modified because 
// is a part of a library 
void foo(const char *bar) 
{ 
    std::cout << "Result: " << bar << std::endl; 
} 

int main(void) 
{ 
    std::vector<std::string> values; 
    for (int i = 0; i < 10; i++) { 
     values.push_back(std::to_string(2 * i)); 
     std::cout << values[i] << std::endl; 
    } 
    std::cout << "==============" << std::endl; 
    for (size_t i = 0; i < values.size(); i++) { 
     foo(values[i].c_str()); 
    } 
    return 0; 
} 

注意、ちょうどstd::vectorのドキュメントをお読みください。

+0

'foo(values [i]);も変更する必要があります;' values'は 'std :: string'の配列です。 – NathanOliver

+0

OPは 'const char * 'をとる関数を変更できないことに注意してください。 – NathanOliver

+0

@NathanOliver注目! –

関連する問題