Puntatori a Void: informazioni

di il
10 risposte

Puntatori a Void: informazioni

Salve,

Sono nuovo di questo forum , vi volevo chiedere informazioni per quanto riguardo i puntatori a void, vi mostro il sottoprogramma:
void leggi_vettore ( void *& p_void, int n , const int t, const char nome) {
cout <<endl<< "---------> Lettura del Vettore "<< nome <<" <---------"<<endl;
if ( t == 0 )
{
unsigned short *u = new unsigned short[n];
p_void = u ;
for ( int i =0 ; i < n ; i++ )
{
cout << nome <<"["<< i <<"]: ";
cin >> u;
}
}
else
{
float *u= new float[n];
p_void = u;
for ( int i =0 ; i < n ; i++ )
{
cout << nome <<"["<< i <<"]: ";
cin >> u;
}
}
cout << "---> Vettore "<< nome << " creato di tipo "<<
( ( t == 1 ) ? "float" : "unsigned short") ;
cout <<endl<<endl;
}


come potete vedere consiste nel creare un vettore di tipo float o unsigned short a seconda del valore che assume t durante l' esecuzione , quindi ho bisogno di un puntatore a void. La mia domanda è questa: Per la lettura volevo utilizzare un for in cui al posto di cin >> u; volevo mettere cin >> p_void; pensando che , una volta allocato memoria forzandolo in un tipo , andasse bene, ma mi da errore di compilazione e quindi ho dovuto inserire due for identici a seconda se sto creando un float o un unsigned shot . La domanda è: posso creare un unico for per entrambi utilizzando il puntatore a void o cmq c'è un modo meno complesso per risolvere questo algoritmo avendo gli stessi parametri della funzione? Grazie sono alle prime armi vi chiedo scusa se tale domanda può sembrare stupida

10 Risposte

  • Re: Puntatori a Void: informazioni

    Classico esempio dove utilizzare i template risolve ogni cosa.
    
    #include <iostream>
    #include <typeinfo>
    
    using namespace std;
    
    template <typename T>
    void leggi_vettore ( T *& p_void, int n , const char *nome) {
    	cout <<endl<< "---------> Lettura del Vettore "<< nome <<" <---------"<<endl;
    
    	T *u = new T[n];
    	p_void = u ;
    	for ( int i =0 ; i < n ; i++ )
    	{
    		cout << nome <<"["<< i <<"]: ";
    		cin >> u[i];
    	}
    
    	cout << "---> Vettore "<< nome << " creato di tipo "<< typeid(T).name();
    	cout <<endl<<endl;
    }
    
    int main()
    {
    	unsigned short *u = NULL;
    	leggi_vettore(u,5,"prova unsigned short");
    	float *f = NULL;
    	leggi_vettore(f,5,"prova float");
    	return 0;
    }
    
  • Re: Puntatori a Void: informazioni

    I template non li conosco , buio totale xD cmq se ho capito bene con il template T come parametro significa che posso passargli un qualsiasi tipo alla funzione?
  • Re: Puntatori a Void: informazioni

    Certo qualsiasi tipo di dato. Come vedi dal main decido io che dato passarli e la funzione viene compilata per quel tipo di dato. Se li passi un tipo non standard (tipo una struct tua) non può funzionare se prima non fai il modo che lo struct abbia definito l'overload del >> per gli istream, ma quì andiamo sul avanzato. cmq qualsiasi tipo di dato standard quali: int, short, float, double, char, ecc...
    typeid(T).name() ti dice il tipo di dato. Nel tuo esempio serve solo per vedere che la funzione è stata compilata nel modo giusto.
  • Re: Puntatori a Void: informazioni

    Grazie mille finisco il programma e vedo se ci riesco. ^^
  • Re: Puntatori a Void: informazioni

    Scusami un ultima info :
    void leggi_vettore ( T *& p_void, int n , const char *nome) {
       cout <<endl<< "---------> Lettura del Vettore "<< nome <<" <---------"<<endl;
    
       T *u = new T[n];
       p_void = u ;
       for ( int i =0 ; i < n ; i++ )
       {
          cout << nome <<"["<< i <<"]: ";
          cin >> u[i];
       }
    ecc....
    
    ma il T*u = new T[n]; è indinspensabile? cioè non posso fare direttamente p_void = new T[n]; e di conseguenza anche il for con p_void?
  • Re: Puntatori a Void: informazioni

    Ah si certo. volevo tenere la tua implementazione ma si puoi fare anche direttamente così.
  • Re: Puntatori a Void: informazioni

    Ho provato a farlo ma mi da tanti errori del tipo T non è dichiarato :S , il tuo me lo fa partire ma se lo voglio cambiare mi da errore, forse non posso fare qualche operazione quindi ti posto il codice sempre se ti va xDDD scusami di tutto il disturbo è che vorrei capire per bene
    #include <iostream>
    #include <typeinfo>
    using namespace std;
    
    template <typename T>
    void leggi_vettore ( void *&, int , const int , const char nome);
    void produci_pfunz( const int );
    void inserimento( T *&, const int);
    
    int main() {
    	int t , n;
    	void *A,*B;
    	cout << "--> Inserisci il riemp: ";
    	cin >> n;
    	do
    	{
    	cout<< "--> 0 unsigned short"<<endl
    		<< "--> 1 per float "<<endl
    		<< "--> Inserisci il numero a seconda di che tipo vuoi creare il vettore: ";
    	cin >> t;
    	} while (( t !=1 ) && ( t != 0 ));
    	leggi_vettore(A,n,t,'A');
    	leggi_vettore(B,n,t,'B');
    	return 0;
    }
    
    void leggi_vettore ( void *& p_void, int n , const int t, const char nome) {
    	cout <<endl<< "---------> Lettura del Vettore "<< nome <<" <---------"<<endl;
    	if ( t == 0 )
    	{
    	  unsigned short *u = new unsigned short[n];
    	  inserimento ( u,n );
    	  p_void = u ;
    	}
    	else
    	{
    	   float *u= new float[n];
    	   inserimento (u,n);
    	   p_void = u ;
    	}
    	cout << "---> Vettore "<< nome << " creato di tipo "<<
    		( ( t == 1 ) ? "float" : "unsigned short") ;
    	cout <<endl<<endl;
    }
    
    
    void inserimento ( T *& u , const int n )
    {
    	 for ( int i =0 ; i < n ; i++ )
    		  	{
    		  		cout << nome <<"["<< i <<"]: ";
    		  	    cin >> u[i];
    		  	}
    }

    mi da tanti errori :S non riesco a trovare degli errori , scusami ancora
  • Re: Puntatori a Void: informazioni

    Perche non c'è niente di uguale al mio codice.
    
    #include <iostream>
    #include <typeinfo>
    using namespace std;
    
    template <typename T>
    void leggi_vettore ( T *&, int , const int , const char nome);
    void produci_pfunz( const int );
    template <typename T>
    void inserimento( T *&, const int, const char nome);
    
    int main() {
    	int t , n;
    	unsigned short *A = NULL;
    	float *B = NULL;
    	cout << "--> Inserisci il riemp: ";
    	cin >> n;
    	do
    	{
    		cout<< "--> 0 unsigned short"<<endl
    			<< "--> 1 per float "<<endl
    			<< "--> Inserisci il numero a seconda di che tipo vuoi creare il vettore: ";
    		cin >> t;
    	} while (( t !=1 ) && ( t != 0 ));
    	
    	if(t == 0)
    		leggi_vettore(A,n,t,'A');
    	else
    		leggi_vettore(B,n,t,'B');
    	return 0;
    }
    
    template <typename T>
    void leggi_vettore ( T *& p_void, int n , const int t, const char nome) {
    	cout <<endl<< "---------> Lettura del Vettore "<< nome <<" <---------"<<endl;
    
    	p_void = new T[n];
    	inserimento ( p_void,n,nome );
    	cout << "---> Vettore "<< nome << " creato di tipo "<< typeid(T).name();
    	cout <<endl<<endl;
    }
    
    template <typename T>
    void inserimento ( T *& u , const int n, const char nome )
    {
    	for ( int i =0 ; i < n ; i++ )
    	{
    		cout << nome <<"["<< i <<"]: ";
    		cin >> u[i];
    	}
    }
    
  • Re: Puntatori a Void: informazioni

    Ok Grazie mille per la disponibilità ^^
  • Re: Puntatori a Void: informazioni

    Salve scusate ho un problema con puntatori a void forse ancora nn li ho capiti bene....
    void potenza ( void* A, void* B, void* C,const int t) {
    	if ( t == 0 )
    	{
    		unsigned short *u = (unsigned short*)A;
    		unsigned short *v = (unsigned short*)B;
    		unsigned short *ris = new unsigned short;
    		cout << "potenza "<< *u << "alla "<< *v <<endl;
    		*ris = pow(*u,*v);
    		cout << "il risultato di e' "<< *ris<<endl;
    		*(unsigned short*)C=*ris;
    
    	}
    	else
    	{
    		float *u= (float*)A;
    		float *v= (float*)B;
    		float *ris= new float;
    		*ris= pow(*u,*v);
    		*(float*)C=*ris;
    	}
    }
    allora questo è un sottoprogramma nel quale mi serve a creare il Vettore C . Gli passo il puntatore void C il quale non sa se puntare ad un tipo unsigned short o float. Il problema è che il comando *(float*)C= *ris; e *(unsigned short*)C=*ris; non l' avrò utilizzato bene perchè quando stampo il vettore C mi da valori però il valore di *ris, controllandolo con quei due cout , è giusto per ogni ciclo. Vi ringrazio in anticipo. Se non sono stato chiaro vi incollo tutto il programma con i 3 file
Devi accedere o registrarti per scrivere nel forum
10 risposte