Array mit bliebig festgelegten Zahl an Feldern



  • Hallo !

    Wie kann ich einen Array deklarieren der n-Felder hat wobei n also Integer in einer Variablen gespeichert ist.

    So hab ich es probiert... ging aber nicht:

    int n = 200;
    Array meinArray[n];
    


  • Das geht so:

    std::vector< Array > my_array( anzahl_an_elementen );
    

    Google einfach mal nach "stl vector" und schau den Beitrag von der sgi Webseite an.



  • Die Größe eines Array muss bei compile-Zeit bekannt sein:

    const int size = 15;
    char array[size];
    
    // oder direkt als literal
    char array[15];
    

    Willst du die Größe des Arrays von einer Benutzereingabe abhängig machen, bleibt dir nichts anderes übrig, als dynamischen Speicher zu alloziieren;

    int size = benutzereingabe();
    char* array = new char[size];
    
    // ...
    
    delete[] array;
    

    Wenn du dynamisch wachsende Arrays benötigts, solltest du besser auf die Container-Klassen der STL zurückgreifen (z.B. std::vector).

    Grüße...

    Heiko



  • Darum geht es eigentlich :

    #define D3DFVF_MY_VERTEX ( D3DFVF_XYZ | D3DFVF_DIFFUSE )
    
    struct Vertex
    {
    	float x, y, z; // Position of vertex in 3D space
        DWORD color;   // Color of vertex
    };
    
    Vertex g_lineStrip[2000];
    

    Ich will die Größe von g_lineStrip von einer Benutzereingabe abhängig machen.



  • Ich zitiere mich selbst:

    bwbg schrieb:

    (...)

    Willst du die Größe des Arrays von einer Benutzereingabe abhängig machen, bleibt dir nichts anderes übrig, als dynamischen Speicher zu alloziieren;

    int size = benutzereingabe();
    char* array = new char[size];
    
    // ...
    
    delete[] array;
    

    (...)



  • wobei size natürlich unsigned sein sollte ... oder einfach std::size_t 😛

    struct basic_vertex
    {
        float x, y, z; // Position of vertex in 3D space
        enum fvf { D3DFVF_XYZ };
    };
    
    struct diffuse_vertex : public basic_vertex
    {
        DWORD dwColor;
        enum fvf { D3DFVF_XYZ | D3DFVF_DIFFUSE };
    };
    
    int main()
    {
        std::size_t size(0);
        do
        {
            std::cout << "Vertex Anzahl: " << std::flush;
            std::cin.sync();
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        } while (!(std::cin >> size));
        std::vector<basic_vertex> vertexdata(size);
        for (std::size_t i = 0; i < size; ++i)
            vertexdata[i].x = vertexdata[i].y = vertexdata[i].z = i * 5;
    }
    

    ...
    }
    Vertex g_lineStrip[2000];



  • Ich hab es jetzt wie folgt gemacht:

    #include <vector>
    using namespace std;
    
    struct Vertex
    {
    	float x, y, z; // Position of vertex in 3D space
        DWORD color;   // Color of vertex
    };
    
    vector<Vertex> g_lineStrip;
    

    Doch nun habe hier ein Problem:

    g_pLineStrip_VB->Lock( 0, sizeof(g_lineStrip), (void**)&pVertices, 0 );
        memcpy( pVertices, g_lineStrip, sizeof(g_lineStrip) );
        g_pLineStrip_VB->Unlock();
    

    Mein Kompiler sagt folgendes:

    .\main.cpp(388) : error C2664: 'memcpy': Konvertierung des Parameters 2 von 'std::vector<_Ty>' in 'const void *' nicht möglich
    1> with
    1> [
    1> _Ty=Vertex
    1> ]
    1> Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werden

    Wie schreibe ich so einen Operator für diese Konvertierung ?



  • Du solltest dich besser von diesen Low-Level Sachen lossagen, und gleich Sachen wie std::copy nutzen - Das funktioniert dann auch bei Vektoren.



  • Wie kann ich den diese Direct3D-Funktion mit str::copy verwenden...

    Mein Problem ist einfach folgendes:
    Ich habe eine unbekannt Anzahl von Wert (x,y,z) und diese will ich mit Direct3D mit einem Linestrip ausgeben. Bin gerne bereit das anders zu machen - die Frage ist nur wie.



  • Schau dir mal im C++-Buch deiner Wahl den Abschnitt zur STL (Standard Template Library) an, mach dich mit Containern, Iteratoren udn Algorithmen vertraut. danach sollte das eigentlich kein Problem sein. Und nutze bitte nie nie nie memcpy Bei Speicher der mit Objekten belegt ist. In 10% der Faelle ists mehr als fragwuerdig, eher unschoen und ekelhaft. Und in 90% gehts gnadenlos schief und zerreisst dir die Konsistenz der Klassen die du da initialisierst. Bei jeder Klasse die intern Speicher allokiert besitzt jedes Objekt diesen Speicher und gibt ihn auch wieder frei. Mit memcpy sorgst du dafuer dass zwei Objekte den selben Speicher besitzen, spaetestens wenn das zweite Objekt zersoert wird krachts.



  • Könnt ihr mir nicht irgendwie dabei helfen...
    In keine C++ Buch, dass ich besitze steht dazu was. Ich weiß wirklich nicht mehr weiter. Den Code den ich hatte (von jmd. anderen kopiert) funktionierte mit Vertex in Form von Arrays, daraus habe ich nun Vektoren gemacht... daher gab es eine Fehler mit memcop. Dass hab ich jetzt versucht mit copy zu lösen... geht aber irgendwie nicht.

    Mein Code, sieht nun wie folgt aus. Es kommt zwar keine Fehlermeldung mehr aber es wird nichts angezeigt.

    void init( void )
    {
    	g_pD3D = Direct3DCreate9( D3D_SDK_VERSION );
    
        D3DDISPLAYMODE d3ddm;
    
        g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm );
    
        D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory( &d3dpp, sizeof(d3dpp) );
    
        d3dpp.Windowed               = TRUE;
        d3dpp.SwapEffect             = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat       = d3ddm.Format;
        d3dpp.EnableAutoDepthStencil = TRUE;
        d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
        d3dpp.PresentationInterval   = D3DPRESENT_INTERVAL_IMMEDIATE;
    
        g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd,
                              D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                              &d3dpp, &g_pd3dDevice );
    
    	D3DXMATRIX matView;
        D3DXMatrixLookAtLH( &matView, &D3DXVECTOR3(0.0f, 0.0f,-10.0f), 
    		                          &D3DXVECTOR3(0.0f, 0.0f, 0.0f), 
    		                          &D3DXVECTOR3(0.0f, 1.0f, 0.0f ) );
        g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
    
        D3DXMATRIX matProj;
        D3DXMatrixPerspectiveFovLH( &matProj, D3DXToRadian( 45.0f ), 1.0f, 1.0f, 10000000.0f );
        g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
    
    	g_pd3dDevice->SetRenderState( D3DRS_LIGHTING,  FALSE );
    	vector<Vertex> pVertices (g_lineStrip.size());
    
    	//
    	// Line Strip
    	//
    	g_pd3dDevice->CreateVertexBuffer( (g_lineStrip.size()-1)*sizeof(Vertex), 0, D3DFVF_MY_VERTEX,
    									  D3DPOOL_DEFAULT, &g_pLineStrip_VB,
    									  NULL );
    
    	g_pLineStrip_VB->Lock( 0, sizeof(g_lineStrip),(void**) &pVertices, 0 );
    	copy(g_lineStrip.begin(),g_lineStrip.end(),pVertices.begin());
        g_pLineStrip_VB->Unlock();
    
    }
    
    void render( void )
    {
        g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                             D3DCOLOR_COLORVALUE(1.0f,1.0f,1.0f,1.0f), 1.0f, 0 );
    
    	getRealTimeUserInput();
    

    updateViewMatrix();

    g_pd3dDevice->BeginScene();

    D3DXMATRIX mWorld;
    D3DXMatrixTranslation( &mWorld, 0.0f, 0.0f, 5.0f );
    g_pd3dDevice->SetTransform( D3DTS_WORLD, &mWorld );

    //g_pd3dDevice->SetStreamSource( 0, g_pLineStrip_VB, 0, sizeof(Vertex) );
    g_pd3dDevice->SetFVF( D3DFVF_MY_VERTEX );
    g_pd3dDevice->DrawPrimitive( D3DPT_LINESTRIP, 0, sizeof(g_lineStrip)-1);

    g_pd3dDevice->EndScene();
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
    }



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Du musst ueberhaupt kein Array anlegen, wenn das legt ja DX ehh schon an. Also kannst du die Daten auch direkt da hinein schreiben, statt selbst noch ein zweites Array zu erstellen, die Daten da rein zu tun und dann alles in das andere Array zu kopieren. Das ist doch Schwachsinn. f'`8k

    Autocogito

    Gruß, TGGC (making great games since 1992)



  • Kannst du mir konkret sagen wie es geht... ich es einfach nicht, selbst wenn es für dich offensichtlich ist.



  • Ganz einfach! Du machst Lock auf den Buffer und als Rueckgabewert bekommst du einen Zeiger auf dein Array. Da schreibst du deine Datein rein. Dann wieder Unlock aufrufen. Fertig. f'`8k

    Autocogito

    Gruß, TGGC (making great games since 1992)



  • TGGC schrieb:

    Ganz einfach! Du machst Lock auf den Buffer und als Rueckgabewert bekommst du einen Zeiger auf dein Array. Da schreibst du deine Datein rein. Dann wieder Unlock aufrufen. Fertig. f'`8k

    Autocogito

    Gruß, TGGC (making great games since 1992)

    Ich hab irgendwo gelesen, dass die größe eines Arrays definiert werden muss und damit dieser nicht variabel ist. Wo wird da die Größe dieses Array beschrieben ?

    Und wie bekomme ich in den Array dann variabel viele Daten hinein ?

    Ich glaube ich sehe irgendwie den Wald vor lauter Bäumen nicht... 😕

    Kannst du mir mal diese paar Zeilen zwischen Buffer aufruf mit Lock und Unlock aufschreiben und wie man in den Array dann die Daten aus den Vector reinschreibt.

    Ich wäre dir sehr verbunden 🙂

    Danke schon mal für die Antworten !

    Mfg pressure



  • Die Groesse des Arrays gibt man nicht bei Lock sondern schon beim Erstellen des Buffers an. Dabei kannst du ja aber eine quasi beliebige Zahl angeben. f'`8k

    Autocogito

    Gruß, TGGC (making great games since 1992)



  • Vertex *pVertices = NULL;
    
    	//
    	// Line Strip
    	//
    	g_pd3dDevice->CreateVertexBuffer( g_lineStrip.size()*sizeof(Vertex), 0, D3DFVF_MY_VERTEX,
    									  D3DPOOL_DEFAULT, &g_pLineStrip_VB,
    									  NULL );
    
    	g_pLineStrip_VB->Lock( 0, g_lineStrip.size()*sizeof(Vertex), (void**)&pVertices, 0 );
    
    	for(unsigned i = 0;i < g_lineStrip.size();i++)
    	{
    		pVertices[i].x = g_lineStrip[i].x;
    		pVertices[i].y = g_lineStrip[i].y;
    		pVertices[i].z = g_lineStrip[i].z;
    		pVertices[i].color = g_lineStrip[i].color;
    	}
        g_pLineStrip_VB->Unlock();
    

    Ist es so richtig... 😕

    Ich bekomme weder Fehlermeldung noch den Linestripangezeigt.



  • Fuer die Anzeige des Linestrips ist da ja auch kein Code. Also funktioniert alles wie es sollte. f'`8k

    Autocogito

    Gruß, TGGC (making great games since 1992)



  • Ah...
    ich hatte

    g_pd3dDevice->SetStreamSource( 0, g_pLineStrip_VB, 0, sizeof(Vertex) );
    

    auskommentiert. Jetzt funktioniert es, Danke !


Anmelden zum Antworten