2017-11-08 9 views
1

Ich rufe eine Funktion in einer Schleife auf, die Argumente als Strukturzeiger (st * ptr) nimmt und diese Daten in einen AWL-Vektor zurückschieben und den Inhalt anzeigen soll eine Schleife. Wie kann ich es tun? bitte hilfe.Wie man den Strukturzeiger in den STL-Vektor einfügt und den Inhalt anzeigt

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; 
} 

ist das korrekt? Ich bekomme nicht die tatsächliche Ausgabe.

-Code-Schnipsel -----

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

... Durch ziemlich genau in Code, was Sie beschrieben? Was hat nicht funktioniert? – Quentin

+1

Haben Sie versucht zu kompilieren? Ergebnis? – Klaus

+0

Wenn Sie nicht die tatsächliche Ausgabe erhalten, was erhalten Sie? Außerdem ist C++ nicht C; Sie brauchen die 'typedef'-Zeile nicht.Und obwohl es sinnvoll ist, Zeiger in Vektoren wie diese zu setzen, vermute ich, dass Sie die "st" direkt in den Vektor einfügen wollen. –

Antwort

0

Wenn Sie ein std :: vector verwenden, sollten Sie etwas tun:

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}); 

Natürlich können Sie könnte mehr als 2 params haben.

0

Könnten Sie bitte Beispieleingabedaten und erwartete Ausgabe teilen? Mit Ihrem Code wird immer ein neuer Vektor erstellt und 1 Strukturobjekt dort platziert. , wenn Sie einzelne Vektor speichern alle Strukturobjekte haben wollen, dann Vektor erklären in Aufruf Funktion von „Funktion“

+0

Sie können dies zu einer Antwort machen, nachdem OP seinen Beitrag aktualisiert hat. Sie sind auf dem richtigen Weg, Sie müssen nur die Antwort ein wenig konkretisieren – smac89

0

Es sieht aus wie Sie einen Puffer data vom Typ void* mit malloc() oder eine ähnliche Funktion Zuordnen, dann data Gießen zu Temperature_sensor*. Es scheint auch, dass Temperature_sensor eine Klasse mit std::string Mitgliedern ist, die Sie versuchen zuzuweisen und zu drucken.

Das wird nicht funktionieren, weil std::string keine POD type ist, und so der std::string Konstruktor wird eigentlich nie aufgerufen (ebenso ist Temperature_sensor kein POD-Typ, weil es nicht-POD Mitglieder hat, und sein Konstruktor wird deshalb aufgerufen nie).

aufzubauen, um die Objekte korrekt müssen Sie operator new() anstelle von malloc() wie

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

Es wäre so nutzen mehr idiomatische einen intelligenten Zeiger wie std::unique_ptr oder std::shared_ptr anstelle von operator new() (und operator delete()) direkt zu verwenden, und am besten/am idiomatischsten, eine std::vector zu verwenden. Jede dieser Methoden erstellt die zugewiesenen Objekte korrekt.

Sie sollten die Temperature_sensor Klasse ebenfalls stark vereinfachen. Es scheint zahlreiche Instanzvariablen zu haben, die redundant dieselben Informationen in verschiedenen Formaten speichern und die als lokale Variablen in Ihren Funktionen sinnvoller wären.

Sie müssen auch nicht alle diese std::stringstream erstellen; Verwenden Sie std::stod() und std::stoi(), um Strings in Fließkommazahlen oder Ganzzahlen zu konvertieren und std::to_string(), um Zahlen in Strings umzuwandeln.

+0

Vielen Dank für die Kommentare und Anregungen @Ray Hamel – Deepak

Verwandte Themen