Forum: PC-Programmierung aus Funktion auf Membervariable zurgreifen (C++)


von mr08b002 (Gast)


Lesenswert?

Hi,

ich hab eigentlich ein relativ einfaches Problem, das mich aber so 
langsam zur Verzweiflung bringt.
Ich möchte in einer Funktion aus einer Klasse (C++) auf einen Element 
einer Membervariable (vom Typ vector) der selben Klasse zugreifen. Es 
will aber einfach nicht funktionieren. Das Programm lässt sich zwar 
compilieren, beim Ausführen stürtz es aber immer ab.

Teil eines Minimalbeispiels:
1
#include <vector>
2
3
class cKlasse
4
{
5
  public:
6
    void fnFunktion();
7
  protected:
8
    std::vector<double> arVar_;
9
}
10
11
...
12
//Variable arVar_ wird initialisiert
13
...
14
15
void cKlasse::fnFunktion()
16
{
17
  this->arVar_ = this->arVar_;             //macht keine Probleme
18
  this->arVar_.at(1) = this->arVar_.at(1); //fürt zu Programmabsturz
19
}

Eigentlich will ich den vector natürlich nicht mit seinem eigenen Inhalt 
überschreiben, sondern das erste Element des vectors auswerten.

von Uhu U. (uhu)


Lesenswert?

Was kommt denn für eine Meldung beim Absturz?

von g457 (Gast)


Lesenswert?

> beim Ausführen stürtz es aber immer ab.

..mit welcher Fehlermeldung? Womöglich mit einer out_of_range-Exception?

> //Variable arVar_ wird initialisiert

Wie?

>  this->arVar_.at(1) = this->arVar_.at(1); //fürt zu Programmabsturz
                   ^                    ^
> [..] das erste Element des vectors auswerten.
           ^^^^^

..nur der Vollständigkeit halber: Obiger Code arbeitet mit dem ∗zweiten∗ 
Element. Wurde das ebenfalls initialisiert?

HTH

von mr08b002 (Gast)


Lesenswert?

in der Konsole kommt beim Absturz folgende Meldung:
1
[my_mr-3] process has died [pid 2007, exit code -6].
2
log files: /home/mr/.ros/log/790d5bd4-f81e-11e0-b5f3-000c29597391/my_mr-3*.log

aus dem Inhalt des log-Files wird man aber auch nicht wirklich schlau:
1
[Errno 111] Connection refused

g457 schrieb:
>>  this->arVar_.at(1) = this->arVar_.at(1); //fürt zu Programmabsturz
>                    ^                    ^
>> [..] das erste Element des vectors auswerten.
>            ^^^^^
>
> ..nur der Vollständigkeit halber: Obiger Code arbeitet mit dem ∗zweiten∗
> Element. Wurde das ebenfalls initialisiert?

da steht eine "Eins" zwischen den Klammern. Mit "das erste Element" 
meinte ich nur die erste Zahl aus dem Vektor (so als würde ich das erste 
Element eines Arrays auslesen).

von cpp-gast (Gast)


Lesenswert?

1 -> zweites Element!
Funktioniert 0?

von UR Schmitt (Gast)


Lesenswert?

Ein Vector ist ein dynamsches Array. Die Initialisierung hast du uns ja 
sauber vorenthalten.
Hast du in den Vector denn schon mindestens 2 Werte reingeschrieben?

von mr08b002 (Gast)


Lesenswert?

arVar_ wird in etwa so initialisiert:
1
int nr = 296;
2
3
for(int i=0; i<nr; i++){
4
arVar_[i] = hardware.values[i];
5
}

Es gibt also noch eine Klasse "hardware" mit einer Membervariable in die 
die Daten hineingeschriben werden. Diesen Teil wurde zwar nicht von mir 
geschrieben, aber er wurde eigentlich schon hinreichend getestet. Daher 
sollte es hier keine Probleme geben.

von mr08b002 (Gast)


Lesenswert?

UR Schmitt schrieb:
> Ein Vector ist ein dynamsches Array.

Danke, das war der Hinweis den ich gebraucht habe. Hab das jetzt 
ausgebessert.
1
void cKlasse::fnFunktion()
2
{
3
  if(laser_.empty()){
4
    //no Data
5
  }
6
  else{
7
    printf("Value: %f\n", laser_.at(1));
8
  }
9
}

Jetzt läuft das Ding wie gewollt.

Danke!

von Dirk K. (d-k)


Lesenswert?

Das kann aber immer noch schiefgehen.

Mit
1
laser_.empty()
prüfst du ob laser_ mindestens ein element enthält.

Dann greifst du auf Element 2 zu:
1
laser_.at(1)

Falls der vector also nur ein Element enthält fliegt dir dies immer noch 
um die Ohren.

Ich denke es könnte dir helfen die Dokumentation von std::vector 
anzuschauen. Eine API-doc auf Englisch findet sich hier: 
http://www.cplusplus.com/reference/stl/vector/
Falls es Deutsch sein soll mußt du selber googlen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.