Vector Problem: out of range
-
Hallo miteinander
Ich habe ein kleines Problem bei dem ich nicht mehr ganz durchblicke:
Eine Datei wird in ein Verarbeitungsvector gelesen, und von dort in die eigentlichen Vectoren.
Späte sollte das ganze dann über die "RS232-Schnittstelle" (virtuell) an einen MCU gesendet werden.Das Einlesen und Umtischen funktioniert soweit, aber beim Auslesen und senden bekomme ich eine Fehlermeldung:
"Expression: vector subscript out of range"static std::vector< std::string > x_achse; static std::vector< std::string > y_achse; static std::vector< std::string > blue; static std::vector< std::string > green; static std::vector< std::string > red; std::vector< std::string > allItems; std::string item; if(fin.good()){ // Wenn die Datei geöffnet werden konnte x_achse.erase(x_achse.begin(), x_achse.end()); // Vektoren löschen y_achse.erase(y_achse.begin(), y_achse.end()); red.erase(red.begin(), red.end()); green.erase(green.begin(), green.end()); blue.erase(blue.begin(), blue.end()); label_File_Status->Text = "OK"; fin.seekg(0L, ios::beg); // an den Anfang der Datei springen while( getline( fin, item)){ // Zeilenweise Auslesen allItems.push_back(item); // Zeile in Vector speichern } allItems[0].erase(allItems[0].begin(),allItems[0].begin() + 32); // Ersten 32 Zeichen löschen (ILDA-Header) allItems[0].erase(allItems[0].size() - 32,allItems[0].size()); // Lesten 32 Zeichen löschen (ILDA-Header) for(size_t q = 0; q < allItems[0].size(); (q += 8) ){ x_achse.push_back( allItems[0].substr(q, 2) ); // 16Bit X-Achse y_achse.push_back( allItems[0].substr(q + 2, 2) ); // 16Bit Y-Achse blue.push_back( allItems[0].substr(q + 5, 1) ); // 8Bit Blau green.push_back( allItems[0].substr(q + 6, 1) ); // 8Bit Grün red.push_back( allItems[0].substr(q + 7, 1) ); // 8Bit Rot } }
Das Problem entsteht hier in der for-Schlaufe, bei der ich eigentlich das Frame für die Kommunikation vorbereite.
static int buffer[24100]; for(i = 2; i < (NUM + 2); i += 7){ buffer[i] = atoi(red[last_point].c_str());// C-String zu Int konvertieren buffer[i + 1] = atoi(red[last_point].c_str()); buffer[i + 2] = atoi(green[last_point].c_str()); buffer[i + 3] = atoi(blue[last_point].c_str()); buffer[i + 4] = ( atoi(x_achse[last_point].c_str()) >> 4); buffer[i + 5] = (( atoi(x_achse[last_point].c_str()) & 0x0F) << 4 ) | ( atoi(y_achse[i].c_str()) >> 8); buffer[i + 6] = ( atoi(y_achse[last_point].c_str()) & 0xFF ); if( last_point == (x_achse.size() - 1) ){ // Ring-System beim Vector last_point = 0; } else{ last_point ++; } }
Der Datei-Inhalt sollte im Buffersystem an den MCU gesendet werden, und dann wieder von vorne anfangen, wenn alle Werte gesendet wurden.
Kann mir da jemand auf die Sprünge helfen?
Besten Dank im voraus.
MFG
P51D
-
Hallo P51D,
ich glaube der Debugger kann dir hier schneller weiterhelfen
Überprüf mal bei welchem i die Fehlermeldung geworfen wird. Dann kannst du einen Breakpoint setzen (am besten mit Bedingung, sonst dauert es je nach Vektor-Größe ewig ;-)) und schauen, an welcher Stelle der Zugriff auf den Vektor schief geht.
Mich wundert außerdem die Zeile
for(i = 2; i < (NUM + 2); i += 7){
bzw, die Zugriffe auf das Array etwas. Hier könnte es ggf. auch Probleme geben, wenn NUM unabhängig von der Schrittweite ist. Es könnte sein, dass z.B.
buffer[i + 6]
(im letzten Schleifendurchlauf) ein Zugriff über die Arraygrenze hinaus darstellt. Aber das hängt vom Wert von NUM ab, der im Codeschnipsel nicht definiert ist.
Viele Grüße,
MaBa
-
ok, ich hab den Fehler gefunden:
buffer[i + 5] = (( atoi(x_achse[last_point].c_str()) & 0x0F) << 4 ) | ( atoi(y_achse[i].c_str()) >> 8);
y_achse[i]: das i sollte last_point sein....
die kleinen Fehler immer.
MFG
P51D
-
ich würde dir die stringstreams statt den vectoren für so eine aufgabe empfehlen.