Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [C++] Restituire array da funzione

    Salve a tutti, ho questo programma insensato che sto sfruttando per capire il procedimento da impiegare quando voglio far restituire ad una funzione un array di valori..

    codice:
    #include <iostream>  using namespace std; 
    void passarray(int x);  
    int main()
    {         
     int x = 3;     
     passarray(3);               
    
    system("PAUSE");     
    return 0; 
    }  
    
    void passarray(int x){                    
    
    int array[3];                    
    int i;                    
    for (i=0; i<3; i++){                        
      array[i]= x;                       
      cout << array[i] << endl;                    
    }                   
     return &array;                         
     }
    In pratica il mio ragionamento è, se passo il valore 3 alla funzione, e metto 3 in tutti gli slot del mio array, poi come lo passo di nuovo al main?
    So che conviene usare i puntatori, sicchè ho pensato di ritornare l'indirizzo dell'array che è presente nella funzione, ma non saprei come riceverlo..

    dapprima ho pensato: ok sistemo così
    int *p = passarray(3);
    Ma in realtà l'indirizzo non è composto da interi, quindi giustamente c'è un errore.

    Non so proprio dove sbattere la testa, probabilmente è più semplice di come me lo sto immaginando ma non riesco proprio ad uscirne!

    Grazie!

  2. #2
    codice:
    #include <iostream>  using namespace std; 
    void passarray(int x);  
    int main()
    {         
     int x = 3;     
     passarray(3);               
    
    system("PAUSE");     
    return 0; 
    }  
    
    void passarray(int x){                    
    
    int array[3];                    
    int i;                    
    for (i=0; i<3; i++){                        
      array[i]= x;                       
      cout << array[i] << endl;                    
    }                   
     return &array;                         
     }
    In realtà hai un errore perchè ritorni un valore da una funzione che hai dichiarato void.
    Però non puoi ritornare "array" perchè è un array allocato sullo stack quindi l'area di memoria puntata da array verrà deallocata al return dalla funzione.
    Per ritornare un puntatore dalla funzione lo devi allocare dinamicamente oppure gli passi un puntatore creato nel main.

    Comunque visto la domanda, ti consiglio di leggerti qualcosa sui puntatori
    lolide
    Java Programmer

    Informati

  3. #3
    Gli array in C++ non si passano per valore (quando lo passi ad una funzione decade in puntatore, nonostante la sintassi talvolta possa far credere il contrario). Purtroppo è così per ragioni di compatibilità con il C, il quale se non erro è fatto così per ragioni di compatibilità con il BCPL o roba del genere. Per motivi analoghi non è neanche possibile restituire un array per valore.

    Le strategie usate in genere per gli array "stile-C" sono:
    - farsi passare l'array di destinazione come parametro e scriverci dentro
    codice:
    void RiempiDiUni(int array[], size_t dimensioni)
    {
        for(size_t i=0; i<dimensioni; i++)
            array[i]=1;
    }
    
    // ...
    int vettore[10];
    RiempiDiUni(vettore, 10);
    - restituire un array allocato sull'heap:
    codice:
    // Attenzione: questo codice non è exception-safe
    
    int * ArrayPienoDiUni(size_t dimensioni)
    {
        int * arr = new arr[dimensioni];
        for(size_t i=0; i<dimensioni; i++)
            array[i]=1;
        return arr;
    }
    
    // ...
    int * arr = ArrayPienoDiUni(10);
    // ...
    // La responsabilità della deallocazione ricade sul chiamante
    delete [] arr;
    Nota che devi necessariamente usare new[]/delete[] e non puoi restituire un puntatore ad un array allocato sullo stack all'interno della funzione, poiché questo cessa di esistere quando la funzione termina.

    Se però si ricorre all'allocazione dinamica, tanto vale semplificarsi la vita e usare direttamente un std::vector e dimenticarsi dei problemi di memory leak:
    codice:
    std::vector<int> ArrayPienoDiUni(size_t dimensioni)
    {
        std::vector<int> ret(dimensioni, 1);
        return ret; // la copia dovrebbe essere elisa tramite NRVO
    }
    
    // ...
    std::vector<int> arr = ArrayPienoDiUni(10);
    // la memoria viene deallocata automaticamente quando arr esce dallo scope
    std::vector è ottimo quando il numero di elementi non è noto a compile-time, quando gli elementi sono tanti, in generale nei casi in cui conviene allocare sull'heap. D'altra parte, spesso l'uso dell'heap non è ottimale: in particolare, se le dimensioni dell'array sono note a compile-time e non sono troppo grandi. Per queste evenienze, nel nuovo standard C++ è fornita la classe template std::array<Tipo, Dimensione>, che fornisce un'ottima alternativa per questi casi:

    codice:
    std::array<int, 10> ArrayDiDieciUni()
    {
        std::array<int, 10> ret;
        for(size_t i=0; i<10; i++)
            ret[i]=1;
        return ret;
    }
    std::array ha dimensioni fissate a compile-time mediante il secondo parametro template, non usa l'heap (a meno che non venga allocato esplicitamente con new) e ha un costruttore di copie, il che lo rende perfetto molti casi in cui std::vector è eccessivo.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    MItaly, questo tuo post è una piccola lezione, ti ringrazio anche io, come sicuramente lo farà lordsabbath88
    /*NO COMMENT*/

  5. #5
    Sono contento che ti sia stato utile!
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Ti ringrazio tantissimo, finalmente ho trovato alcune soluzioni valide per risolvermi questo problema, in particolare la soluzione con vector è molto interessante.
    Ho provato anche quella con std::array, ma ho svariati errori, soprattutto per quanto riguarda la dichiarazione della funzione in alto.. mi dice che mancano i ; e cose del genere..
    codice:
    #include <cstdlib> 
    #include <iostream> 
    using namespace std;  
    array<int,10> ArrayDiDieciUni();
    int main(){     
    
    array<int, 10> arr = ArrayDiDieciUni();
    
    system("PAUSE");     
    return 0; 
    }  
    
    array<int, 10> ArrayDiDieciUni() {            
    array<int, 10> ret;            
    for(size_t i=0, i<10; i++)
    {                       
    ret[i]=1;                       
    }           
     return ret;             
    }
    Sembra che non riconosca come valida la dichiarazione.. da che può dipendere?

    Gli errori:
    6 C:\Users\Public\Documents\C++ Uni\arraydidieci1.cpp expected constructor, destructor, or type conversion before '<' token
    6 C:\Users\Public\Documents\C++ Uni\arraydidieci1.cpp expected `,' or `;' before '<' token
    C:\Users\Public\Documents\C++ Uni\arraydidieci1.cpp In function `int main()':
    9 C:\Users\Public\Documents\C++ Uni\arraydidieci1.cpp `array' undeclared (first use this function)
    (Each undeclared identifier is reported only once for each function it appears in.)
    9 C:\Users\Public\Documents\C++ Uni\arraydidieci1.cpp expected primary-expression before "int"
    9 C:\Users\Public\Documents\C++ Uni\arraydidieci1.cpp expected `;' before "int"
    9 C:\Users\Public\Documents\C++ Uni\arraydidieci1.cpp At global scope:
    14 C:\Users\Public\Documents\C++ Uni\arraydidieci1.cpp expected constructor, destructor, or type conversion before '<' token
    14 C:\Users\Public\Documents\C++ Uni\arraydidieci1.cpp expected `,' or `;' before '<' token

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Manca l'include file:
    <array>
    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.

  8. #8
    Originariamente inviato da shodan
    Manca l'include file:
    <array>
    Quando provo ad inserirlo mi dice che non esiste nessun file/cartella di nome array!
    Avevo già provato in precedenza..

  9. #9
    <array> sarà presente dal prossimo standard C++ ed è presente nel TR1, per cui è fornito solo dai compilatori più recenti, e in alcuni casi è necessario usare degli switch particolari. Che compilatore usi?
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Uso il dev 4.9.9.2.. avevo pensato che in qualche modo fosse "antiquato"

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 © 2024 vBulletin Solutions, Inc. All rights reserved.