2d vector, mehrdimensional
-
nun ich hab ein prob
ich habe eine struct
in dieser einen titel
dann kommen commandos rein ( welche ich trace )
so bis jetzt klappt das gut mit
struct Tracedata { CString titel; vector<CString> command; };jezt kann aber ( optional ) eine usereingabe (keyboard z.b. ) erfolgen welche auch einen traffic ausloesst.
jezt muss ich zu einem halt:
speichern titel ( immer ! )
dann die trace daten ( hier commandos bezeichnet )oder
speichern titel ( immer ! )
dann z.b. Press xyz
und dann dafuer denn trafficals schaubsp
titel 1
press xyz
0x00
0xff
0xaa
press zxy
0x44
0xaaund das andere bsl
titel 2
0x11
0xaa
0xffhmm wie mache ich das am besten
sprich ich muss einmal am schluss in meinem vec
alle titel durchgehen
wenn press enthaelt dann alle press durchgehen ( und die commandos vergleichen )
wenn nicht dann nur alle commandos vergleichen
ich habe einen "muster" vec mit z.b. 5 titeln
dazu 3 mal den fall keine press sachen und 2 mal mit press sachendann trace ich und bekomme z.b.
einmal mit und einmal ohne press
jetzt muss ich vergleichen
den trace vec titel suchen mit dem muster trace vec
wenn gefunden dann entweder alle commandos verlgeichen
oder wenn press vorhanden die suchen mit den commandos-----
ist alles bissle konfus aber ich hoffe du weisst was ich in etwa meine.
deswegen wollte ich sowas haben wie
struct Tracedata { CString titel; vector<CString> press; vector<CString> command; };das prob ist. ich weiss ja dann nicht das die ersten 3 commandos zu press[0] und die anderen 5 zu press[1] gehoeren.
deswegen wollte ich sowas machen wie
struct Tracedata { CString titel; vector<CString><CString> command; };oder soll ich linear suchen nach schluesselwoertern
z.b.
trace_vec[0].titel = "erster test";
trace_vec{0].command[0] = press1
.... [1] = 0xaa
0xff
press2
0x12
0x44und dann die press suchen und vergleichen bis naechsten. und wenn nicht dann einfach alle comands vergleichen.
denn ich muss wissen in welcher line fehler sind beim tracen. anhand eines muster traces
hab ihr tips
momentan hab ich titel und alle commandos in dem ersten struct
und wollte "umfuellen" im anderen mit 2d
dein std::vector<std::vector<CString> > vec;
verstehe ich nicht ganz. kannst mir das prinzip erklaeren. wie tue ich inti. und resizen dznamisch und so?
-
LOL

brauchst mir nicht nen ganzen Roman schreiben..

ich würde das so in die richtung machen:
typedef enum TRACE_DATA_TYPE { td_type_title, td_type_command, td_type_press, td_type_traffic }TRACE_DATA_TYPE; typedef struct Tracedata_item { TRACE_DATA_TYPE type; CString value; }Tracedata_item; typedef struct Tracedata { std::vector<Tracedata_item> items; }jetzt kannst du dir dein Tracedata mit beliebigen daten vollstpofen

Tracedata_item tmp_item; std::vector<Tracedata> vec; Tracedata data1; tmp_item.type = td_type_title; tmp_item.value = "bla"; data1.items.push_back(tmp_item); // das ist der title tmp_item.type = td_type_command; tmp_item.value = "bla"; data1.items.push_back(tmp_item); // das ist das command vec.push_back(data1); // und speichern Tracedata data2; tmp_item.type = td_type_title; tmp_item.value = "bla"; data2.items.push_back(tmp_item); // das ist der title tmp_item.type = td_type_press; tmp_item.value = "bla"; data2.items.push_back(tmp_item); // das ist die taste tmp_item.type = td_type_traffic; tmp_item.value = "bla"; data2.items.push_back(tmp_item); // das ist ... 1 tmp_item.type = td_type_traffic; tmp_item.value = "bla"; data2.items.push_back(tmp_item); // das ist ... 2 vec.push_back(data2); // und speichern ....
-
danke werd ich mir mal anschauen
nur hab ich ein prob das ich die dinger schon gemacht habe ( die speicherungen ) und war echt viel code weil ich nicht einfach reinspeichere sondern verglecihe ect. machen muss das es passt.
war viel arbeit
jetzt koennte ich ich ja deine lsg nehmen und dann meine vec struct deleten. und dann damit arbeiten. sieht bissle kommpl aus bei dir. hmmm
geht auch die lsg
was meinst dazu??
struct Tracedata { CString titel; vector<CString> press; vector<CString> command; vector<int> count; };jetzt kann ich entweder
fall 1:
titel + commands haben und dann habe ich nur titel + commands
und wenn der vec press > 0 ist dann weiss ich
zu press[0] gehoeren count[0] = 3 ; daten ( z.b. erste 3 werte von commandos )
und bei press[1] gehoeren bei count[1] = 5 die nachsten 5 elemente in commandos
wenn press == 0 dann geh ich nur die commandos zum titel durch
was meinste dazu?
1 fall: titel 1 und 10 commandos
2 fall: titel 1 und 10 commandos und 2 press und 2 counts
hmmmm
aber hab dank fuer deine arbeit
-
kannst du auch machen, wird das sicher fehleranfällig, da du da über 3 vectoren kreuz und quer schreiben/lesen/vergleichen musst.. irgendwo ein push_back vergessen und schon ist dein ganzer vector schrott..
-
eine frage
warum geht das nicht
z.b.
struct Tracedata { CString titel; vector<CString> command; }; vector<Tracedata> m_trace_vec // und dann im prog m_trace_vec[pos].titel.push_back(str); // oder m_trace_vec[pos].command[index].push_back(str);ich habs bis jezt immer so gemacht, dass ich ein resize ( ein element mehr ) gemacht habe und dann halt reingespeichert. ist aber nicht so toll die methode.
und bitte nur konstruktive beitreage( mal gespannt wer den satz gelesen hat ). merci im voraus
-
m_trace_vec[pos].titel.push_back(str);
CString hat keine push_back Methode.
m_trace_vec[pos].command[index].push_back(str);
Und noch mal, CString hat keine push_back Methode.

denke mal du willst so was machen:
Tracedata data; data.title = str; data.command.push_back(str); m_trace_vec.push_back(data);
-
jep genau so
aber das mit CString versteh ich nicht.
denn ich hab auch einmal
vector<CString> m_Testsuite_text; //... m_Testsuite_text.push_back(Strx);das geht bei mir, ist aber CString. hmmm
jetzt werd ich wohl umaendern mussen und so machen wie du es gezeigt hast, da mit resize halt doch etwas fusch ist, oder?
-
CMatt
einmal braucht ich dich noch
oder jemand anders wer es weiss
wie uebergebe ich einen vector? bei mit klappt das nicht
hier mein fall
// Tracedata ist ein String und ein weiterer String vector int CRunDlg::delete_blanks(vector<Tracedata> *vec, int nr, int pos) { for( int i = 0; i < vec[nr].command[pos_com].GetLength(); i++) // command ist not a member bla bla bla { if( vec[nr].command[pos_com].Mid(i,1) == " " ) { vec[nr].command[pos_com].Delete(i,1); } } // er schlagt mir nicht bei vec[nr]. z.b das command vor // auch nicht bei vec[nr]-> hier schlaegt er mir auch nichts vor return 0; }wie mache ich das jetzt, einen vector uebergeben und dann sachen drin zu verandern? dank allem im voraus
-
natuerlich hab ich die sachen geandert, mit
if( vec[nr].command[pos].Mid(i,1) == " " ) { vec[nr].command[pos].Delete(i,1); }nicht das einer denkt, dass es daran lag
-
int CRunDlg::delete_blanks(vector<Tracedata> *vec...
Du übergibst hier nen Zeiger auf nen Vector, also die Addresse wo deine vector-klasse im Ram liegt. vec[nr] greift jetzt also auf den vector zu, der an der übergeben Adresse + sizeof(std::vector<Tracedata>)*nr liegt und da liegt mit ziehmlich sicherheit was, nur kein std::vector<Tracedata> ==> crash.
Möglichkeit 1:
Übergib ne Referenzint CRunDlg::delete_blanks(vector<Tracedata> &vec, int nr, int pos)Möglichkeit 2:
Verwende den die at methodevec->at(x)...aber das mit CString versteh ich nicht.
vector<CString> m_Testsuite_text; //... m_Testsuite_text.push_back(Strx);m_Testsuite_text ist eine Variable vom typ vector, die hat ne push_back methode.
vector<Tracedata> m_trace_vec // und dann im prog m_trace_vec[pos].titel.push_back(str);m_trace_vec ist vom typ vector, dort verwendest du nen []oprator um auf ein element zuzugreifen, ist ok. Das im element greifst du nun auf titel zu, welches vom typ CString ist und willst push_back aufrufen -> geht net, CString hat keine push_back methode.
-
ja klar, es klappt
klar referenzen sollen immer besser sein anscheinend
ein buchstabe und dann so ne wirkung
merci merci
hab beschlossen, dass du mein lieblingsmember hier bist
jetzt checks ich es auch, danke