Passare string da funzione a main?

di il
23 risposte

Passare string da funzione a main?

Ciao ragazzi ho bisogno di un piccolo aiuto su questo pezzo di codice in C++, allora io ho una funzione che mi sceglie randomicamente una di queste parole tra le graffe. quello che mi serve fare è stampare nel main la stringa a. come posso fare?

  
  string positivo()
  {
    srand(time(0));
    int vare;
    vare=8;
    const string positivo[vare] = {"buono","giusto","corretto","meglio","coerente","luminoso","naturale","utile"};
    string c = positivo[rand() % vare];

      return c;
  }
  
  
  int main(){
  
  cout << c << endl;
  
  }

questa è una porzione del codice, ma mi serve assolutamente leggere il contenuto della stringa c. ho provato altri modi ma non mi sono utili, qualche aiuto? grazie

23 Risposte

  • Re: Passare string da funzione a main?

    
    << positivo()
    
    STUDIA SU UN LIBRO!!!!!

    NON PUOI fare richieste di QUESTO genere in un forum!

    Questi sono argomenti che trovi DETTAGLIATAMENTE DESCRITTI nelle PRIME pagine del PRIMO capitolo di QUALUNQUE LIBRO su C/C++!

    E questo perche', anche se SINTATTICAMENTE sembra tutto semplice, in REALTA' stai facendo una cosa PARECCHIO COMPLICATA:

    - "std::string" e' un oggetto complesso, e il passaggio da una funzione ad un'altra viene fatto mediante VALORE, MA IN QUESTO PARTICOLARE CASO la cosa funziona perche' "std::string" usa una tecnica chiamata "reference counting"
    - stai usando una FUNZIONE: bisogna SAPERE che cosa e' una funzione
    - vorresti utilizzare una variabile LOCALE alla funzione 'positivo()' all'interno del main: questo IMPLICA che non ha chiaro il concetto di SCOPE (contesto di visibilita') di una variable
    - ma vuol dire ANCHE che non hai chiaro di che cosa fare del risutato di una funzione
    - e ci sono N-mila latri dettagli subdoli che per spiegarli tutti ci vorrebbe un LIBRO. Ma guarda

    Vuoi imparare a programmare? COMPRATI UN LIBRO!

    Altro consigli: LASCIA PERDERE il C/C++, passa a Python: MOOLTO piu' semplice!

    Attenzione: non e' per dirti di non imparare a programmare, ma per consigliarti verso una strada meno ripida, almeno all'inizio.

    Con Python riesci a fare un sacco di cose decisamente carine: dai videogiochi (Unity si programma in Python), al Machine Learning (se non sai che cosa e', va bene lo stesso , ma c'e' anche di meglio .
    E puoi fare anche le cose semplici
  • Re: Passare string da funzione a main?

    Senza voler minimamente contraddire quel che ha risposto Migliorabile, a me sembra che per gli scopi minimi che dai l'idea di voler perseguire sia più lineare una soluzione che utilizzi un array statico di puntatori a costanti stringa, tipo (in C, non in C++)...
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define Q_VOCI_POSITIVE  8 /* "Q" sta per quantita' */
    
    const char *positivo( void ) {
        static const char *str_voci_positive[Q_VOCI_POSITIVE] = {
            "buono","coerente","corretto","giusto",
            "luminoso","meglio","naturale","utile"
        };
    
        return str_voci_positive[rand()%Q_VOCI_POSITIVE];
    }
    
    int main() {
        int i;
    
        srand( time(NULL) ); /* una sola volta */
    
        for( i=0; i<10; ++i )
            printf( "%s\n", positivo() );
    
        return 0;
    }
    
    L'usare "static" implica che il puntatore restituito dalla funzione rimane valido fino al momento in cui il programma terminerà. Inoltre, da quel che m'è capitato di leggere, l'inizializzazione dell'array avverrà una volta sola, a vantaggio della velocità d'esecuzione (anche se in questo caso è irrilevante).

    Per quel che ne so, inizializzare ogni volta il "casualizzatore" è superfluo, per cui srand() lo trasferirei all'inizio del main().
  • Re: Passare string da funzione a main?

    Volendo potresti anche fare a meno della funzione positivo(), semplicemente piazzando lì un array globale al quale accedere direttamente da qualsiasi punto del programma...
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define Q_VOCI_POSITIVE  8 /* "Q" sta per quantita' */
    
    const char *kStrVociPositive[Q_VOCI_POSITIVE] = {
        "buono", "coerente", "corretto", "giusto",
        "luminoso", "meglio", "naturale", "utile"
    };
    
    int main() {
        int i;
    
        srand( time(NULL) );
    
        for( i=0; i<10; ++i )
            printf( "%s\n", kStrVociPositive[rand()%Q_VOCI_POSITIVE] );
    
        return 0;
    }
    
  • Re: Passare string da funzione a main?

    Scusa Aldo, ma suggerire di non usare funzioni suggerendo anche di utilizzare variabili "globali", non è proprio una cosa positiva.

    E passare dal C++ al C, oltre a non essere richiesto, non è auspicabile dato che le string del C++ sono tanto più comode.

    Insomma, penso che i due suggerimenti siano poco "didattici" ...

    Semmai, è da evidenziare il corretto uso di srand e come riscrivere meglio il codice sempre in C++
    
    string positivo()
    {
    	const string positivo[] = { "buono","giusto","corretto","meglio","coerente","luminoso","naturale","utile" };
    	string c = positivo[rand() % 8];
    
    	return c;
    }
    
    int main()
    {
    	srand(time(NULL));
    
    	cout << positivo() << endl;
    }
    
  • Re: Passare string da funzione a main?

    Oregon il codice da te scritto è piu o meno quello che ho usato inizialmente, ma a seguire il mio codice ha un' altra funzione sintatticamente uguale a positivo() sempre fuori dal main, diciamo negativo(), a cui son affidate altre 8 parole negative da scegliere randomicamente.

    Nel main ho fatto pari/dispari per scegliere se prendere una parola da positivo() o da negativo(). pari da positivo(), dispari da negativo() usando semplicemente:

    string uno=positivo();
    string due=negativo();
    
    int A;
    srand(tile(NULL));
    A = rand()%100+1;
    
    if(A%2==0){ 
    cout << uno << endl;
    }
    
    else if(A%2!=0){
    cout << due << endl;
    }

    il Problema è che, quando avvio il programma questo mi prende numero pari e assegna una parola positivo() e stampa. o mi prende numero dispari e stampa la parola negativo().

    Il fatto è che mi stampa sempre quelle due inizialmente scelte positiva e negativa, senza restituirmene altre. questo è quello che sto cercando di risolvere. spero abbiate compreso e grazie per il vostro aiuto!
  • Re: Passare string da funzione a main?

    Non erano suggerimenti, ho indicato due "possibilità".

    Ricorrere o non ricorrere una funzione dipende (secondo me) da quelle che sono le finalità e le caratteristiche generali del programma nel quale occorrerebbe usare la scelta di un descrittore positivo casuale tra una rosa di descrittori positivi predefiniti. Nel caso specifico sono poche righe di programma, volendo si potrebbe anche spostare l'array kStrVociPositive[] direttamente nel main() senza che cambi sostanzialmente nulla.

    Sulle finalità didattiche hai ragione, ma non ci sono state esplicitate e una cosa tanto semplice e generica può essere affrontata in mille modi! Dipende da cosa vuole far "sperimentare" l'insegnante.

    P.S. Con "descrittore positivo" intendo una qualsiasi delle espressioni "buono", "giusto", ecc.
  • Re: Passare string da funzione a main?

    In C++ si può fare anche una cosa del genere...
    #include <iostream>
    using namespace std;
    
    int main() {
        string s;
    
        s = "Ciao";
    
        cout << s << endl;
    }
    
    ... per cui dovrebbe essere valido anche ...
    #include <cstdlib>
    #include <ctime>
    #include <iostream>
    using namespace std;
    
    const char *positivo( void ) {
        #define Q_VOCI_POSITIVE 8 // si potrebbe anche definirlo direttamente qui...
        static const char *kStrVociPositive[Q_VOCI_POSITIVE] = {
            "buono","coerente","corretto","giusto",
            "luminoso","meglio","naturale","utile"
        };
    
        return kStrVociPositive[rand()%Q_VOCI_POSITIVE];
    }
    
    const char *negativo( void ) {
        #define Q_VOCI_NEGATIVE 8 // si potrebbe anche definirlo direttamente qui...
        static const char *kStrVociNegative[Q_VOCI_NEGATIVE] = {
            "cattivo","incoerente","scorretto","sbagliato",
            "oscuro","peggio","innaturale","dannoso"
        };
    
        return kStrVociNegative[rand()%Q_VOCI_NEGATIVE];
    }
    
    int main() {
        srand( time(NULL) );
    
        string uno = positivo();
        string due = negativo();
    
        int pari = rand()%2;
    
        if( pari ){
            cout << uno << endl;
        }
        else {
            cout << due << endl;
        }
    }
    
    In questo modo direi che ci si evitano un bel po' di allocazioni/deallocazioni implicite nel processo di creazione/distruzione di oggetti string, nonché magari anche di copiatura e ricopiatura dei dati della stringa in sè e per sè. Intendo, restituire un puntatore a una costante che sta sempre lì, immutata e immutabile, dovrebbe essere più efficiente rispetto a costruire/distruggere oggetti a raffica anche quando non serve. Poi magari dico una scempiaggine, eh!
  • Re: Passare string da funzione a main?

    Jarvis: "Il fatto è che mi stampa sempre quelle due inizialmente scelte positiva e negativa, senza restituirmene altre."

    Questo succede perché usi srand() DOPO aver già chiamato positivo() e negativo() dove viene a sua volta chiamato rand(). In altre parole, chiami rand() senza prima inizializzarne il seed in modo ogni volta diverso, quindi ottieni sempre la stessa serie di valori in estrazione.
  • Re: Passare string da funzione a main?

    @Aldo ... quello che dico è che indicare (o suggerire!) come alternativa l'uso di codice C con "puntatori a char" al posto di codice C++ con le sue string, non è un'alternativa possibile, ma un errore a fini didattici (che contano tantissimo!). Anche se l'esempio è di una linea, questo potrebbe essere parte di un esercizio o di un programma molto più vasto in cui mischiare stringhe C e C++ non è per niente una buona idea. Figuriamoci poi se il prof. gli ha dato un compito da risolvere in C++ ...

    Insomma perché sei fissato con

    const char *

    e non usi semplicemente

    const string

    ?

    @jarvis ... hai letto quello che ti ho scritto sull'uso della funzione srand ?
  • Re: Passare string da funzione a main?

    Sono riuscito a sistemare il tutto ragazzi, ho dovuto soltanto ricollocare alcune stringhe nel codice completo, insomma risistemare un po la "scaletta" degli eventi funziona tutto ora. grazie mille per i suggerimenti!
  • Re: Passare string da funzione a main?

    Fermo restando che non è detta che io abbia ragione (ricordi qualche esempio recente in cui ho avuto torto? io sì), le ho spiegate prima le mie motivazioni. Replico:

    "In questo modo [usando puntatori a stringhe costanti] direi che ci si evitano un bel po' di allocazioni/deallocazioni implicite nel processo di creazione/distruzione di oggetti string, nonché magari anche di copiatura e ricopiatura dei dati della stringa in sè e per sè. Intendo, restituire un puntatore a una costante che sta sempre lì, immutata e immutabile, dovrebbe essere più efficiente rispetto a costruire/distruggere oggetti a raffica anche quando non serve."

    Quanto sopra parte da un presupposto: sbaglio a presupporre che le string del C++ siano oggetti che "vivono" tramite l'allocazione dinamica della memoria? Come tali, immagino che la restituzione per valore o il passaggio per valore implichino ulteriori allocazioni dinamiche, nonché la copia dei dati dell'oggetto originale in quello temporaneo creato per la bisogna. Il tutto nel contesto di svariate chiamate a funzioni "invisibili" (creatore, distruttore, costruttore di copie). Nel contesto del programmino che ha proposto Jarvis mi sembra che tutto questo sia un po' come sparare ai passeri con un cannone, a meno che ci siano intenzioni didattiche ben precise da parte di chi ha assegnato l'esercizio.
  • Re: Passare string da funzione a main?

    AldoBaldo ha scritto:


    Fermo restando che non è detta che io abbia ragione
    Qui si discute senza cercare qualcuno che abbia ragione.
    si evitano un bel po' di allocazioni/deallocazioni implicite nel processo di creazione/distruzione di oggetti string
    Le string esistono in C++ (come proprio il C++ in generale) proprio per rendere "trasparenti" (e più sicure...) queste operazioni al programmatore!
    nonché magari anche di copiatura e ricopiatura dei dati della stringa in sè e per sè.
    Perché questa mania di spaccare il microsecondo? Il C++ non nasce per questo ma per rendere più "astratto" tutto il funzionamento anche a patto di impiegare qualcosa in più (sebbene le librerie standard siano molto efficienti).
    sbaglio a presupporre
    No, non sbagli questo. Sbagli a non volerle usare in un programma C++ per trasformarlo in un programma C.
    A questo punto, estremizzando, trasformi tutto in Assembly x86, anche se non richiesto!
    Nel contesto del programmino
    Non insistere con i "programmini" ... non si danno risposte legate al contingente ma, in generale, a come si ragiona in tutte le situazioni con il linguaggio proposto. Pensa sempre che quello proposto sia parte di codice molto più vasto. Anche in questo caso (oltre che quello didattico) non è bene mischiare linguaggi, introdurre puntatori (sempre fonte di guai) e, peggio, variabili "globali" di cui si perde il controllo in 10 minuti. E questo chi inizia lo deve sapere perché in futuro scriva correttamente codice e non prenda cattive abitudini.

    La tua "paura" (o scarsa conoscenza) del C++ ti fa proporre sempre alternative C non richieste. E non è un bene mischiare linguaggi.
  • Re: Passare string da funzione a main?

    
    #include <ctime>
    #include <cstdlib>
    #include <iostream>
    #include <string>
    
    std::string positivo();
    
    int main()
    {
        std::srand(std::time(0));
        std::cout << positivo() << '\n';
    }
    
    std::string positivo()
    {
        int vare {8};
        const std::string positivo[] { "buono",    "giusto",   "corretto", "meglio",
                                       "coerente", "luminoso", "naturale", "utile"  };
        return positivo[rand() % vare];
    }
    
  • Re: Passare string da funzione a main?

    @Robiro ... che vuoi dire con questo tuo primo post ??
Devi accedere o registrarti per scrivere nel forum
23 risposte