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 traffic

    als schaubsp

    titel 1
    press xyz
    0x00
    0xff
    0xaa
    press zxy
    0x44
    0xaa

    und das andere bsl

    titel 2
    0x11
    0xaa
    0xff

    hmm 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 sachen

    dann 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
    0x44

    und 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 Referenz

    int CRunDlg::delete_blanks(vector<Tracedata> &vec, int nr, int pos)
    

    Möglichkeit 2:
    Verwende den die at methode

    vec->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


Anmelden zum Antworten