Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]illegal zero-sized array

    ciao ho la seguente classe:
    [code]
    class CSubMesh
    {
    public:
    CSubMesh(void);
    virtual ~CSubMesh(void);

    //vertex buffer e indexbuffer
    Vertex m_VertexBuffer[];
    int m_IndexBuffer[];

    void setMaterial(tag_INT_MATERIAL Material);
    tag_INT_MATERIAL getMaterial();

    private:
    tag_INT_MATERIAL m_tagMaterial;

    };
    [code]

    questa riga mi da errore , del tipo illegal zero-sized array :
    int m_IndexBuffer[];

    come faccio a dichiarare un array di int come variabile membro?
    Grazie.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Specifica la dimensione.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    O un puntatore ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    62
    Oppure se hai bisogno di un vettore dinamico usa Vector<>.

  5. #5
    Originariamente inviato da mico90
    Oppure se hai bisogno di un vettore dinamico usa Vector<>.
    Ma non dovrebbe essere un std::vector ?

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    62
    Si ovviamente deve essere std::vector<>, sorry

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    no , non deve essere un vector per problemi di prestazioni (i dati che contiene sono dell'ordine dei 100.000 elementi),e non posso sapere la dimensione in anticipo , devo utilizzare un puntatore?
    grazie.

  8. #8
    Meglio una lista.
    Così è più facile da gestire e le prestazioni sono buone, se no te la devi vedere con la riallocazione.
    Auguri.

  9. #9
    Naturalmente se ti serve qualcosa a dimensione variabile.

    Ciao,
    Marco.

  10. #10
    La scelta del contenitore da utilizzare deve essere fatta in base all'utilizzo che ne intendi fare (soprattutto da come intendi accedere ai dati). Per la semplice allocazione std::vector è molto più veloce di std::list; ho fatto questo piccolo benchmark (GNU/Linux 2.6 64 bit, G++ 4.3)
    codice:
    #include <vector>
    #include <list>
    #include <iostream>
    #include <sys/time.h>
    
    using namespace std;
    
    double GetMSecDifference(timeval Before, timeval After)
    {
    	return (After.tv_sec-Before.tv_sec) * 1000 + (After.tv_usec - Before.tv_usec) / 1000;
    }
    
    int main()
    {
    	timeval before, after;
    	int max;
    	double elapsedTime;
    	cout<<"Inserire il numero di elementi: ";
    	cin>>max;
    	cout<<"std::vector, dimensione sconosciuta"<<endl;
    	gettimeofday(&before, NULL);
    	try
    	{
    		vector<int> vector1;
    		for(int i=0;i<max;i++)
    			vector1.push_back(i);
    	}
    	catch(exception & ex)
    	{
    		cerr<<"Catturata eccezione: "<<ex.what()<<endl;
    	}
    	gettimeofday(&after, NULL);
    	cout<<"Tempo trascorso: "<<GetMSecDifference(before, after)<<" ms"<<endl;
    	cout<<"std::vector, dimensione nota"<<endl;
    	gettimeofday(&before, NULL);
    	try
    	{
    		vector<int> vector2(max);
    		for(int i=0;i<max;i++)
    			vector2.push_back(i);
    	}
    	catch(exception & ex)
    	{
    		cerr<<"Catturata eccezione: "<<ex.what()<<endl;
    	}
    	gettimeofday(&after, NULL);
    	cout<<"Tempo trascorso: "<<GetMSecDifference(before, after)<<" ms"<<endl;
    	cout<<"Array C allocato con new"<<endl;
    	gettimeofday(&before,NULL);
    	try
    	{
    		int * vector3=new int[max];
    		for(int i=0;i<max;i++)
    			vector3[i]=i;
    	}
    	catch(exception & ex)
    	{
    		cerr<<"Catturata eccezione: "<<ex.what()<<endl;
    	}
    	gettimeofday(&after, NULL);
    	cout<<"Tempo trascorso: "<<GetMSecDifference(before, after)<<endl;
    	cout<<"std::list, dimensione sconosciuta"<<endl;
    	gettimeofday(&before, NULL);
    	try
    	{
    		list<int> list1;
    		for(int i=0;i<max;i++)
    			list1.push_back(i);
    	}
    	catch(exception & ex)
    	{
    		cerr<<"Catturata eccezione: "<<ex.what()<<endl;
    	}
    	gettimeofday(&after, NULL);
    	cout<<"Tempo trascorso: "<<GetMSecDifference(before, after)<<endl;
    	return 0;
    }
    .
    Risultati:
    codice:
    matteo@teoubuntu:~/cpp$ ./vectorbenchmark.o 
    Inserire il numero di elementi: 100000
    std::vector, dimensione sconosciuta
    Tempo trascorso: 3 ms
    std::vector, dimensione nota
    Tempo trascorso: 4 ms
    Array C allocato con new
    Tempo trascorso: 0 ms
    std::list, dimensione sconosciuta
    Tempo trascorso: 30 ms
    per 100000 elementi da 8 byte ciascuno è praticamente indifferente la scelta tra i primi tre, mentre la lista, come detto, è nettamente più lenta. Aumentando il numero di elementi il distacco si fa più consistente:
    codice:
    matteo@teoubuntu:~/cpp$ ./vectorbenchmark.o 
    Inserire il numero di elementi: 10000000
    std::vector, dimensione sconosciuta
    Tempo trascorso: 515 ms
    std::vector, dimensione nota
    Tempo trascorso: 565 ms
    Array C allocato con new
    Tempo trascorso: 140 ms
    std::list, dimensione sconosciuta
    Tempo trascorso: 2750 ms
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.