Restituire un array da una funzione (C++)

di il
11 risposte

Restituire un array da una funzione (C++)

Salve a tutti, stavo eseguendo un esercizio il quale mi chiede di scrivere un metodo per scambiare di posto in un array l'elemento massimo con l'elemento minimo.
Il programma funziona, ma per colpa della mia curiosità ho cercato di capire da questo esercizio come faccio a restituire un intero array.la

la funzione è la seguente:

unsigned int func(unsigned int a[], int n)
{
unsigned int *b= new unsigned int [n]; 
for (int i=0; i<n; i++) // in questa sezione inizializzo l'array a a[] che a sua volta prende l'indirizzo di v
{
	b[i]=a[i];
}
unsigned int indicemin=0;
unsigned int indicemax=0;
unsigned int box=0;

for (int i=1; i<5; i++)
{
	if(b[i]<b[indicemin])
	{
		indicemin=i;
	}
}
for (int i =1; i<5; i++)
{

if(b[i]>b[indicemax])
	{
		indicemax=i;
	}
}
box=b[indicemin];
b[indicemin]=b[indicemax];
b[indicemax]=box;

for (int i=0; i<n; i++)
{
cout << return *b[i] << endl;
}
arrivati ad un certo punto del main abbiamo:

cout << func(v,5) << endl;
il quale però mi stampa solo ed esclusivamente il primo elemento dell'array (3) se volessi stampare tutto b (il quale è allocato nell heap) come faccio?

11 Risposte

  • Re: Restituire un array da una funzione (C++)

    Cout << return ?
  • Re: Restituire un array da una funzione (C++)

    Ma perché dovresti restituire l'array?
  • Re: Restituire un array da una funzione (C++)

    Weierstrass ha scritto:


    Cout << return ?
    Si scusami è stata una pensata così a caso... so che dovrei scrivere:
    
    return b;
    
    ma come scrissi sopra questo mi da esclusivamente il primo elemento dell'array.
  • Re: Restituire un array da una funzione (C++)

    oregon ha scritto:


    Ma perché dovresti restituire l'array?
    In che senso?.
    Voglio restituire l'array "modificato" ossia quello dove l'elemento massimo e l'elemento minino sono scambiati di posto.
  • Re: Restituire un array da una funzione (C++)

    L'array viene modificato all'interno della funzione dato che passa per indirizzo. Non devi restituire proprio nulla.

    Fra l'altro, a che ti serve b ???
  • Re: Restituire un array da una funzione (C++)

    Ha ragione oregon: non devi allocare nulla, nel tuo caso, modifica direttamente a[]

    Se invece, in generale, vuoi allocare dentro una funzione e restituire l'array all'esterno, dimensione compresa, in C++ puoi fare così
    
    char* array_ciao(int& dimensione){
    	int byte_da_allocare = 5;
    	char* arr = new char[byte_da_allocare];
    
    	arr[0] = 'C';
    	arr[1] = 'i';
    	arr[2] = 'a';
    	arr[3] = 'o';
    	arr[4] = '\0';
    
    	dimensione = byte_da_allocare;
    	return arr;
    }
    
    da fuori
    
    	int size;
    	char* stringa = array_ciao(size);
    	printf(stringa);
    	printf("\r\nDimensione = %d\n", size);
    	delete[] stringa;
    
  • Re: Restituire un array da una funzione (C++)

    oregon ha scritto:


    L'array viene modificato all'interno della funzione dato che passa per indirizzo. Non devi restituire proprio nulla.

    Fra l'altro, a che ti serve b ???
    Ho scritto il codice eliminando b, effettivamente da un pò fastido:
    
     #include <iostream>
    
    using namespace std;
    
    unsigned int func(unsigned int a[], int n)
    {
    unsigned int indicemin=0;
    unsigned int indicemax=0;
    unsigned int box=0;
    
    for (int i=1; i<5; i++)
    {
    	if(a[i]<a[indicemin])
    	{
    		indicemin=i;
    	}
    }
    for (int i =1; i<5; i++)
    {
    
    if(a[i]>a[indicemax])
    	{
    		indicemax=i;
    	}
    }
    box=a[indicemin];
    a[indicemin]=a[indicemax];
    a[indicemax]=box;
    
    return *a;
    
    }
    int main()
    {
    
    unsigned int v[5]={3,2,7,1,8};
    cout<< "The array v before the func change the position of max and min value"<< endl;
    for (int i=0; i<5; i++)
    {
    cout << v[i] << " ";
    
    }
    cout << endl;
    cout << "The array after change the position of the max and min value:" << endl;
    
    cout << func (v,5) << " ";
    
    }
    

    L'array come giustamente mi fai notare viene passato per indirizzo ossia:
    
    unsigned int func ( unsigned int a[], int n)
    
    mi colloca alla prima parole di dell'array "v"

    successivamente viene svolto il corpo della funzione
    e dovrei restituire l'array che ho modificato ossia l'array che dopo avrà il massimo e il minimo valore scambiati di posizione.
    il problema è che quando scrivo:
    
    return *a;
    
    in:
    
    cout << func(v,5) << " ";
    

    viene stampato solo il primo elemento ossia 3.
    io vorrei stampare tutti l'elementi, come potrei fare?.
  • Re: Restituire un array da una funzione (C++)

    Ma se l'hai stampato prima tutto v come fai a bloccarti?

    func(v,5);

    E poi lo stesso for con cui hai stampato prima
  • Re: Restituire un array da una funzione (C++)

    Allora non hai capito.

    La funzione deve essere void perché non devi restituire nulla! L'array v sarà modificato dalla funzione.
    Gli elementi li visualizzi con il solito for su v che hai già usato !

    Mi sembri abbastanza confuso ...
  • Re: Restituire un array da una funzione (C++)

    oregon ha scritto:


    Allora non hai capito.

    La funzione deve essere void perché non devi restituire nulla! L'array v sarà modificato dalla funzione.
    Gli elementi li visualizzi con il solito for su v che hai già usato !

    Mi sembri abbastanza confuso ...
    Hai ragione, ho risolto
    
    #include <iostream>
    
    using namespace std;
    
    void func(unsigned int a[], int n)
    {
    unsigned int indicemin=0;
    unsigned int indicemax=0;
    unsigned int box=0;
    
    for (int i=1; i<5; i++)
    {
    	if(a[i]<a[indicemin])
    	{
    		indicemin=i;
    	}
    }
    for (int i =1; i<5; i++)
    {
    
    if(a[i]>a[indicemax])
    	{
    		indicemax=i;
    	}
    }
    box=a[indicemin];
    a[indicemin]=a[indicemax];
    a[indicemax]=box;
    
    return;
    
    }
    int main()
    {
    
    unsigned int v[5]={3,2,7,1,8};
    cout<< "The array v before the func change the position of max and min value"<< endl;
    for (int i=0; i<5; i++)
    {
    cout << v[i] << " ";
    
    }
    cout << endl;
    cout << "The array after change the position of the max and min value:" << endl;
    func (v,5);
    for (int i =0; i<5; i++)
    {
    cout << v[i] << " ";
    }
    
    }
    
    Era una cosa stupidissima ,non so come abbia fatto a bloccarmi, i puntatori sono una bella batosta.mi confondo troppo, mi ha anche confuso il fatto che ogni volta che si parla di array dentro funzioni (visto che l'array ha molte carattetistiche con i puntatori) debba obbligatoriamente metterli nell'HEAP anche se come abbiamo visto non è necessario.
    mi rivedrò la teoria e smanetterò un'altro pò
  • Re: Restituire un array da una funzione (C++)

    Anche se va bene lo stesso, vedi come usare una sola for nella funzione...
Devi accedere o registrarti per scrivere nel forum
11 risposte