2017-11-08 3 views
1

構造ポインタ(st * ptr)として引数をとるループ内で関数を呼び出しています。このデータをSTLベクトルにプッシュバックして内容を表示する必要がありますループ。どうすればいい?助けてください。構造ポインタをstlベクトルに挿入して内容を表示する方法

struct st 
{ 
    int a; 
    char c; 
}; 
typedef struct st st; 


function(st *ptr) 
{ 
    vector<st*>myvector; 
    vector<st*>:: iterator it; 
    myvector.push_back(ptr); 
    it=myvector.begin(); 
    cout<<(*it)->a<<(*it)->c<<endl; 
} 

これは間違いありませんか?私は実際の出力を得ていない。

コードスニペット-----

void Temperature_sensor::temp_notification()//calling thread in a class------ 
{ 

    cout<<"Creating thread to read the temperature"<<endl; 
    pthread_create(&p1,NULL,notifyObserver_1,(void*)(this)); 
    pthread_create(&p2,NULL,notifyObserver_2,(void*)(this)); 
    pthread_join(p1,NULL); 
    pthread_join(p2,NULL); 

} 


void* Temperature_sensor::notifyObserver_1(void *data) 
{ 

    Temperature_sensor *temp_obj=static_cast<Temperature_sensor *>(data); 
    (temp_obj)->it=(temp_obj)->observers.begin(); 
    ifstream inputfile("temp.txt");//Reading a text file 

    while(getline(inputfile,(temp_obj)->line)) 
    { 
     stringstream linestream((temp_obj)->line); 
     getline(linestream,(temp_obj)->temperature,':'); 
     getline(linestream,(temp_obj)->temp_type,':'); 
     cout<<(temp_obj)->temperature<<"---"<<(temp_obj)->temp_type<<endl; 
     stringstream ss((temp_obj)->temperature); 
     stringstream sb((temp_obj)->temp_type); 
     sb>>(temp_obj)->c_type; 
     ss>>(temp_obj)->f_temp; 
     cout<<"____"<<(temp_obj)->f_temp<<endl; 
     (temp_obj)->a.temp=(temp_obj)->f_temp; 
     (temp_obj)->a.type=(temp_obj)->c_type; 
     cout<<"------------------q"<<(temp_obj)->a.type<<endl; 
     (*(temp_obj)->it)->update(&(temp_obj)->a);//Calling the function ------- 

} 
input file temp.txt 
20:F 
30:C 
40:c 
etc
void Temperature_monitor::update(st *p) {}//need to store in a vector------ 
+1

...あなたが記述したものをコードに入れているだけですか?何がうまくいかなかったのですか? – Quentin

+1

コンパイルしようとしましたか?結果? – Klaus

+0

実際の出力が得られない場合、あなたは何を得ていますか?また、C++はCではありません。 'typedef'行は必要ありません。このようにベクトルにポインタを置く用途はありますが、実際にはベクトルの中に 'st'を置くだけでよいかもしれません。 –

答えて

0

あなたがのstd ::ベクトルを使用している場合は、このような何か行う必要があります、あなたがもちろん

std::vector<st> v; //use st as type of v 

//read 
for(auto const& i : v) { 
    std::cout << i.param1 << ' ' << i.param2; 
} 
//push_back 
v.push_back({param1, param2}); 

を2つ以上のパラメータを持つことができます。

0

サンプルの入力データと期待される出力を共有できますか? あなたのコードでは、常に新しいベクトルを作成し、そこで1つの構造オブジェクトを配置します。あなたは、単一のベクトルストアすべての構造オブジェクトを持つようにしたい場合は は、その後、「機能」の関数を呼び出すには、ベクターを宣言する

+0

OPが彼の投稿を更新したので、答えにすることができます。あなたは正しい道にあります、ちょっと答えを肉付けする必要があります – smac89

0
あなたは、 malloc()とタイプ void*のバッファ dataまたは類似の機能を割り当てる dataをキャストしているように見えます

Temperature_sensor*Temperature_sensorは、std::stringのメンバーで、あなたが割り当てて印刷しようとしているクラスです。

std::stringPOD typeではない、ので、std::stringコンストラクタが実際に呼び出されることはありませんので、これは動作しませんが(それが非PODのメンバーを持ち、そのコンストラクタは、したがって、呼び出されることはありませんので、同様に、Temperature_sensorはPODタイプではありません)。

オブジェクトを構築するために、正しくあなたはなく直接operator new()(およびoperator delete())を使用してのstd::unique_ptrまたはstd::shared_ptrのようなスマートポインタを使用することがより慣用的になりそう

Temperature_sensor *tsensor = new Temperature_sensor; 
Temperature_sensor *five_tsensors = new Temperature_sensor[5]; 

ようmalloc()の代わりにoperator new()を使用する必要があります、最も良い/最も慣用的なstd::vectorを使用する。これらのメソッドのいずれも、割り当てられたオブジェクトを正しく構築します。

また、Temperature_sensorクラスを劇的に簡素化することを強く検討する必要があります。同じ情報を異なるフォーマットで重複して格納する多くのインスタンス変数があり、関数内のローカル変数として意味があるようです。

std::stringstreamのすべてを作成する必要はありません。 std::stod()std::stoi()を使用して文字列を浮動小数点または整数に変換し、std::to_string()を使用して数値を文字列に変換することを検討してください。

+0

コメントと提案のためにありがとう@レイ・ハーメル – Deepak

関連する問題