Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    8

    [C\C++] Matrice come valore di ritorno di una funzione

    Buongiorno a tutti!
    Ho un problema con una funzione e il suo valore di ritorno. Vorrei che la funzione restituisse una matrice 3x3.
    Questo è ciò che ho scritto:

    codice:
    double **Covarianza (int N_campioni , double **colonna , double *mu)
    {
    	double sigma[3][3] = { 0,0,0,0,0,0,0,0,0 };
    	double parz[3][3] = { 0,0,0,0,0,0,0,0,0 };
    
    	for ( int j=0 ; j < N_campioni ; j++ )
    	{
    		for ( int i=0 ; i < 3 ; i++ )
    			colonna[j][i] = colonna[j][i] - mu[i];
    	
    		for ( int m=0 ; m < 3; m++ )			// prodotto vettore colonna per se stesso trasposto
    			for ( int n=0 ; n < 3 ; n++ )
    				parz[m][n] = colonna[j][m] * colonna[j][n];
    		
    		for ( int g=0 ; g < 3 ; g++)			// aggiorno sigma con le matrici dei risultati parziali
    			for ( int h=0 ; h < 3 ; h++ )
    				sigma[g][h] = sigma[g][h] + parz[g][h];
    	}
    	
    	for ( int m=0 ; m < 3; m++ )			
    		for ( int n=0 ; n < 3 ; n++ )
    			sigma[m][n] = sigma[m][n] / N_campioni;
    	
    	return sigma;
    }
    il compilatore segnala l' incompatibilità tra il tipo del valore di ritorno e il tipo della funzione.
    Qualcuno potrebbe spiegarmi come modificare la funzione?
    Grazie a tutti!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Dovrai scrivere

    double **sigma;

    e allocare la matrice dinamicamente all'interno della funzione.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    8
    Grazie per la risposta.
    Ho modificato la funzione:
    codice:
    double **Covarianza (int N_campioni , double **colonna , double *mu)
    {
    	//double sigma[3][3] = { 0,0,0,0,0,0,0,0,0 };
    	double **sigma;
    	sigma = new double *[3];
    	for ( int h=0 ; h < 3 ; h++ )
    		sigma[h] = new double [3];
    	double parz[3][3] = { 0,0,0,0,0,0,0,0,0 };
    
    	for ( int j=0 ; j < N_campioni ; j++ )
    	{
    		for ( int i=0 ; i < 3 ; i++ )
    			colonna[j][i] = colonna[j][i] - mu[i];
    	
    		for ( int m=0 ; m < 3; m++ )			// prodotto vettore colonna per se stesso trasposto
    			for ( int n=0 ; n < 3 ; n++ )
    				parz[m][n] = colonna[j][m] * colonna[j][n];
    		
    		for ( int g=0 ; g < 3 ; g++)			// aggiorno sigma con le matrici dei risultati parziali
    			for ( int h=0 ; h < 3 ; h++ )
    				sigma[g][h] = sigma[g][h] + parz[g][h];
    	}
    	
    	for ( int m=0 ; m < 3; m++ )			
    		for ( int n=0 ; n < 3 ; n++ )
    			sigma[m][n] = sigma[m][n] / N_campioni;
    	
    	return sigma;
    	for ( int h=0; h < 3 ; h++ )
    		delete sigma [h];
    	delete sigma;
    
    }
    In questo modo compila ma il risultato non è quello corretto (inserendo il codice direttamente nel main senza inserirlo in una funzione mi dà il risultato atteso).
    Non capisco se continuo a sbagliare questa funzione o come la utilizzo nel main:
    codice:
    double **covarianza;
    covarianza = Covarianza ( righe , featureTR_in , media );
    Grazie ancora.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non hai azzerato sigma dopo averlo allocato ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131
    Come è stata dichiarata la matrice featureTR_in?

    edit:
    Questo codice non verrà mai eseguito visto che è dopo il return. (e non dovrebbe essere eseguito)
    codice:
    for ( int h=0; h < 3 ; h++ )
    		delete sigma [h];
    	delete sigma;

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da XAlbeX
    Questo codice non verrà mai eseguito visto che è dopo il return. (e non dovrebbe essere eseguito)
    Giustamente ... l'eliminazione del vettore la deve fare il codice chiamante *dopo* che il vettore non è più utile ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    8
    featureTR_in è una matrice dinamica ma non credo che dia problemi perchè viene utilizzata anche in un'altra funzione senza problemi.

    Quindi la deallocazione di sigma andrebbe nel main? Ma dato che nel main sigma non esiste dovrei deallocare covarianza?

    Scusate ma come avrete capito sono alle prime armi...

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    369
    domanda da ignorante: ma la matrice allocata così all'interno della funzione, non rimane locale?

    se rimanesse locale nel momento in cui la funzione termina questa viene cancellata, quindi il valore di ritorno è un puntatore a qualcosa che non esiste.

    Spero di non aver fatto un intervento completamente fuori luogo

    Ciao

  9. #9
    Originariamente inviato da alfa_19
    domanda da ignorante: ma la matrice allocata così all'interno della funzione, non rimane locale?

    se rimanesse locale nel momento in cui la funzione termina questa viene cancellata, quindi il valore di ritorno è un puntatore a qualcosa che non esiste.

    Spero di non aver fatto un intervento completamente fuori luogo

    Ciao
    La allochi con new apposta per evitare questo problema...
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131
    Originariamente inviato da alfa_19
    domanda da ignorante: ma la matrice allocata così all'interno della funzione, non rimane locale?

    se rimanesse locale nel momento in cui la funzione termina questa viene cancellata, quindi il valore di ritorno è un puntatore a qualcosa che non esiste.

    Spero di non aver fatto un intervento completamente fuori luogo

    Ciao
    Di allocato localmente (sullo stack) c'è soltanto il puntatore sigma che viene copiato su un registro al ritorno della funzione. Tutti i dati della matrice si trovano nella memoria heap.

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.