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

    c++ funzione che ritorna un array

    Buon giorno a tutti,

    Sono un neofita della programmazione in C++ e da qualche tempo mi cimento in qualche esercizio.... nella maggior parte dei casi mi capita di dover creare classi con funzioni membro get...

    Ad esempio

    codice:
    class Foo{
    
    public:
    
        char * getVar(){
    
             char varA[] = "io sono un test";
             return varA;
    
        }
    
    };
    Questo codice ritorna un indirizzo all'allocazione di momoria che corrisponde alla lettera 'i' della frase "io sono un test"...

    Però è anche verò che questo blocco di memoria non è più likato in quanto nel momento in cui la funzione termina, l'array creato char varA[] = "io sono un test"; viene cancellato perche è un array locale... il fatto che io trovo ancora quella frase a quel blocco di memoria è solamente un caso perche quel blocco di memoria può essere sovrascritto in qualsiasi momento da un altra variabile...


    la domanda è... c'è un modo per ritornare un array in maniera consistente come avviane in linguaggi di più alto livello come il php?


    Grazie mille in anticipo cordiali saluti

    Andrea

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Alloca dinamicamente l'array e restituisci il puntatore. Finché non viene liberata la memoria esplicitamente i dati saranno validi.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Originariamente inviato da oregon
    Alloca dinamicamente l'array e restituisci il puntatore. Finché non viene liberata la memoria esplicitamente i dati saranno validi.
    Ciao e grazie mille della risposta...
    Come faccio a fare quello che mi hai detto? puoi fare un esempio please?

    Grazie ancora

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Per allocare dinamicamente la memoria usi la

    new

    ma per usarla è necessario qualche chiarimento ...

    La get restituisce il valore di una proprietà dell'oggetto ... non potrà essere allocato ad ogni chiamata della get ... chiarisci un po', magari con un esempio più completo, quello che vorresti ottenere ...

    Probabilmente la cosa migliore è usare la new nel costruttore e far restituire il puntatore dalla get.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    forse sbaglio perche sono abituato a programmare in php

    Immagina una classe "persona" come dati membro abbiamo l'età il nome e il cognome

    Se io volessi il nome di una determinata persona in php basta ritornare il nome ed è tutto ok invece in c++ ritorno (ammettiamo di non usare la classe string) un array char... qui sorge il problema...

    sicuramente non posso restituire il puntatore al dato membro altrimenti il client potrebbe pure modificare quella variabile private...

    a questo punto dovrei copiare il contenuto di quel dato membro in un altro array e restituire il puntatore di quell'array.. e qui il problema descritto in precedenza che alternativa proponi?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Una cosa non capisco ... la necessità di un array di char al posto di un oggetto string ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Ma se stai usando C++ non ti conviene usare std::string al posto degli array di char?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  8. #8
    per motivi didattici .

    Forse usare la classe string sarebbe stato più semplice... ma non avrei imparato ad usare gli array...

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quindi, per ricapitolare, tu vorresti

    1) allocare un array
    2) riempirlo con dei dati
    3) restituire il puntatore a questi dati
    4) non permettere a chi riceve il puntatore di modificare i dati

    e questo non è possibile senza fare una copia dei dati stessi ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Avevo pensato di fare una cosa del genere...
    (faccio un esempio con 2 funzioni perche più semplice da scrivere...)
    Creare un array al di fuori della funzione get e passare il puntatore a questo array alla funzione come parametro questa funzione lo riempe e poi io posso stamparlo... il problema che ho riscontrato è che devo inviare per forza un array con una grandezza maggiorata altrimenti il nome verrebbe troncato...

    Ho provato a fare pure una funzione che invia un array piccolo e poi tramite new lo espando in base alla dimensione del nome (ad esempio) da restituire...

    ma ho notato che utilizzando l'operatore "new" l'indirizzo alla memoria cambia quindi il nome viene allocato in una variabile da me sconosciuta e praticamente non va bene.... boh..

    codice:
    #include <iostream>
    using std::cout;
    
    void getNome( char array[] ){
    
    	// a questo punto io vorrei allargare il mio array
    	// mantenendo però invariato l'indirizzo passato come parametro...
    
    
    	// basta togliere il commento a questa lina per vedere che il main non stampa nulla piu
            // array = new char [20];
    
    
    	array[0] = 'c';
    	array[1] = 'i';
    	array[2] = 'a';
    	array[3] = 'o';
    	array[4] = '\0';
    
    
    	cout << "Stampo da dentro la funzione getNome: "<< array << std::endl << std::endl;
    
    }
    
    
    int main(){
    
    	char array[100] = {0};
    
    	getNome( array );
    
    
    	cout << "Stampo dalla funzione main: "<< array << std::endl;
        return 0;
    }
    che ne pensi??

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.