Crash inaspettato

di lex5555 il
4 risposte

Sono un programmatore inesperto

Vi chiedo se potete verificare il mio codice che va in crush.

L'obbiettivo sarebbe riempire un array di puntatori (in modo casuale) molto grande e verificare il tempo di ordinamento con un classico algoritmo

//ordinamento puntatori di array. Calcolo del tempo
#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>

using namespace std;
const int NUM_ELE = 1000;
struct t_elemento   
{
   int n;      
   double v[1000];
};
t_elemento *vP[NUM_ELE];
int main()
{
   time_t start = time(0), stop = time(0); 

   srand(10); 
   for  (int i = 0; i<NUM_ELE; i++)
   {
       vP[i]->n = rand();
   }
cout << "ordinamento puntatori" << endl;


start = time (0);  //faccio partire il tempo
for (int i=0; i<NUM_ELE-1; i++)
{
   for (int j=i+1; j<NUM_ELE; j++)
   {
       if (vP[j]->n <= vP[i]->n) 
       {
           t_elemento *temp = vP[i];
           vP[i] = vP[j]; 
           vP[j] = temp;
       }

   }

}
stop = time(0);
cout << "Tempo con i puntatori: " << difftime(stop, start) << endl;
   return 0;
}

4 Risposte

  • Intanto si scrive “crash”, in secondo luogo quando posti il codice sul forum devi formattarlo usando il tasto <>

    Per quanto riguarda il problema, prima di usare ogni elemento i-esimo del vettore, devi allocare lo spazio per la struttura e assegnare il relativo puntatore al puntatore i-esimo

  • 05/11/2023 - oregon ha scritto:


    Intanto si scrive “crash”, in secondo luogo quando posti il codice sul forum devi formattarlo usando il tasto <>

    L'ho sistemato io, turbava la mia sensibilità 

  • 05/11/2023 - Toki ha scritto:


    turbava la mia sensibilità 

    :-)

    Anche la mia (anche quello nel corpo del post…)

  • Salve a tutti 

    difftime(stop, start) ; // il delta è sempre zero perchè la risoluzione (la grana) è in secondi

    se stai sotto UNIX e accedi a POSIX puoi usare la gloriosa gettimeofday

    05/11/2023 - oregon ha scritto:


    Intanto si scrive “crash”, in secondo luogo quando posti il codice sul forum devi formattarlo usando il tasto <>

    Per quanto riguarda il problema, prima di usare ogni elemento i-esimo del vettore, devi allocare lo spazio per la struttura e assegnare il relativo puntatore al puntatore i-esimo

    devi allocare ogni singolo elemento dell'array di puntatori altrimenti … non funge

    POICHE' SONO MOLTO PARANOICO , ho  messo sotto try and catch l'operatore new

    puoi anche scrivere,  risulta un po' grezza come soluzione ma meglio di niente:

    	// alloc memory
    	for (int i = 0; i<NUM_ELE; i++){
    		vP[i] = nullptr;
    		vP[i] = new t_elemento;
    		if (vP[i] == nullptr){
    			cout << "Elemento :" << i << " - non allocato " << endl;
    			return EXIT_FAILURE;
    		}
    	}
    #include <iostream>
    #include <string>
    //#include <ctime>
    #include <cstdlib>
    #include <exception>
    #include <sys/time.h>
    
    using namespace std;
    const int NUM_ELE = 1000;
    struct t_elemento{
    	int n;
    	double v[1000];
    };
    
    t_elemento *vP[NUM_ELE];
    
    int main(){
    	//time_t start = time(0), stop = time(0);
    	struct timeval t1, t2;
    	srand(10);
    
    	// alloc memory
    	for (int i = 0; i<NUM_ELE; i++){
    		try{
    			vP[i] = new t_elemento();
    		}
    		catch (exception& e){
    			cout << "Elemento :" << i << " non allocato - Standard exception: " << e.what() << endl;
    			return EXIT_FAILURE;
    		}
    	}
    
    	for (int i = 0; i<NUM_ELE; i++)
    		vP[i]->n = rand();
    
    	cout << "ordinamento puntatori" << endl;
    
    	//start = time (0);  //faccio partire il tempo
    	gettimeofday(&t1, NULL);
    
    	for (int i=0; i<NUM_ELE-1; i++)	{
    		for(int j=i+1; j<NUM_ELE; j++){
    			if (vP[j]->n <= vP[i]->n){
    					t_elemento *temp = vP[i];
    					vP[i] = vP[j];
    					vP[j] = temp;
    			}
    		}
    	}
    	//stop = time(0);
    	gettimeofday(&t2, NULL);
    
    	// tv_Usec = microsecondi per questo motivo dividiamo per 1000.0 
    	double millisec = (t2.tv_usec - t1.tv_usec) / 1000.0;
    
    	//cout << "Tempo con i puntatori: " << difftime(stop, start) << endl;
    	cout << "delta time (millisec): " << millisec << endl;
    
    	for (int i = 0; i<NUM_ELE; i++)
    		cout << " " << vP[i]->n ;
    	cout << endl;
    
    	// dealloc memory
    	for (int i = 0; i<NUM_ELE; i++){
    		delete vP[i];
    		vP[i] = nullptr;
    	}
    
    	return EXIT_SUCCESS;
    }
    
Devi accedere o registrarti per scrivere nel forum
4 risposte