Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2008
    Messaggi
    19

    [C++] Structure, puntatori e funzioni

    Ciao,
    sto cercando di prendere confidenza con structure e puntatori.

    Ho scritto un programma nel quale definisco una struct (che ho chiamato cinema) con dentro una type string;
    nel main definisco una variabile di tipo cinema e un puntatore che punta alla variabile.
    Ho scritto due function da far fare e cerco di muovermi solo con i puntatori:
    è un programma stupidotto, ma è giusto per imparare.

    Questo è il codice:



    codice:
    #include<iostream> 
    #include<string>    
    
    using namespace std; 
    
    struct cinema {  
    string titolo; 
    };   
    
    string setTitle (cinema* nome_in) {   
    cin >> nome_in -> titolo;    
    }    
    
    void getTitle (cinema* nome_out) {   
    cout << nome_out->titolo << endl; 
    }    
    int main ()  
    {  
    cinema offerta;
    cinema * pointer;  
    pointer = &offerta;    
    cout << "Scrivere il titolo del film " << endl;  
    setTitle (pointer);  
    getTitle (pointer);     
    return 0;   
    }
    Compilo il tutto e, quando provo a eseguire esce il primo cin e, subito dopo averlo immesso esce Segmentation fault.

    Avete qualche suggerimento?

    Grazie!!

  2. #2
    Sicuro che l'hai compilato ?

    No perchè vedo un po' di errori di sintassi...
    codice:
    #include<iostream> 
    #include<string>    
    
    using namespace std; 
    
    struct cinema {  
    string titolo; 
    };
    
    ...
    
    cinema offerta;
    cinema * pointer;
    Se il prototipo della struct l'hai dichiarato così, ogni votla che ne dichiari una variaible, devi mettere struct avanti al nome (struct cinema offerta)

    Anche nel prototipo delle funzioni.

    E poi nella funzione setTitolo, devi restituire una string, che non restituisci.
    lolide
    Java Programmer

    Informati

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da lolide
    Se il prototipo della struct l'hai dichiarato così, ogni votla che ne dichiari una variaible, devi mettere struct avanti al nome (struct cinema offerta)

    Anche nel prototipo delle funzioni.
    In C++ non è necessario.

    Originariamente inviato da lolide
    E poi nella funzione setTitolo, devi restituire una string, che non restituisci.
    E' questa la causa dell'errore: una funzione non-void deve restituire esplicitamente un valore con return. Al massimo poi lo puoi ignorare nella funzione chiamante (cosa peraltro da evitare).
    every day above ground is a good one

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2008
    Messaggi
    19
    Ok,
    forse è meglio fare un passo indietro perchè probabilmente ho mal compreso qualche caratteristica della structure.
    Questo è quello che io ho capito:
    quando io scrivo
    "struct cinema""
    sto definendo un nuovo tipo di variabile, che per me si chiama cinema.

    Ora, da quel momento in poi, cinema si comporta esattamente come si comporterebbe "int", "float", piuttosto che qualunque altra variabile: sono sullo stesso livello.
    Infatti, se provo a chiedere di farmi vedere le dimensioni della mia variabile "offerta" (che è di tipo cinema), lui mi restituisce 4 bytes (ho un sistema 32bit), he è la dimensione di una variabile di tipo stringa. Questo, credo, mi dice prima di tutto che la variabile è vista e che, in secondo luogo, ha le stesse dimensioni di una variabile stringa. Quindi, suppongo di poter tralasciare ogni volta struct (attenzione, sto dicendo tutto molto a spanne).

    Per quel che riguarda la funzione setTitle, finchè la definisco string, devo mettere un return "qualcosa", mentre se la definisco void dovrei essere a posto: lui mi setta direttamente il contenuto della cella puntata dal puntatore con la stringa che scrivo io da fuori. Infatti, compilando ed eseguendo, ora non c'è più Segmentation fault.

    Quanti strafalcioni ho detto?

    Nel caso che io sia testone e voglia avere la funzione setTitle come string, cosa gli devo chiedere di restituire?

    Grazie ancora per l'aiuto.




    Ok, scusa YuYevon, ho visto che hai risposto esattamente lo stesso mentre io scrivevo.
    Quindi, nel dubbio, lascio la funzione di tipo void e senza return!
    Grazie mille per l'aiuto!!

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Un consiglio: non usare >> su un tipo string, altrimenti salta gli spazi.
    Piuttosto usa getline
    codice:
    void setTitle (cinema* nome_in) {   
        getline(cin, nome_in -> titolo);   
    }
    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.

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2008
    Messaggi
    19
    Grande!!

    Grazie, la questione dello spazio era una di quelle cose che avevo letto di sfuggita nei primi capitoli del manuale e subito rimosso:
    ottimo.
    Grazie mille: i consigli dai più esperti per un codice funzionale ed elegante sono sempre ben accetti!!!

    ...ma quanto mi piace questo forum...

  7. #7
    Originariamente inviato da program
    Ok,
    forse è meglio fare un passo indietro perchè probabilmente ho mal compreso qualche caratteristica della structure.
    Questo è quello che io ho capito:
    quando io scrivo
    "struct cinema""
    sto definendo un nuovo tipo di variabile, che per me si chiama cinema.

    Ora, da quel momento in poi, cinema si comporta esattamente come si comporterebbe "int", "float", piuttosto che qualunque altra variabile: sono sullo stesso livello.
    Si è così. Il problema è che per mantenere la compatibilità con il C, se vuoi usare quella variabile come vuoi fare tu, devi anteporre a struct typedef:

    codice:
    typedef struct cinema_ {
    ...}
    cinema;
    Se vuoi usare le struct, la compatibilità con il C la devi mantenere secondo me, altrimenti usi le classi.

    Originariamente inviato da program
    Per quel che riguarda la funzione setTitle, finchè la definisco string, devo mettere un return "qualcosa", mentre se la definisco void dovrei essere a posto: lui mi setta direttamente il contenuto della cella puntata dal puntatore con la stringa che scrivo io da fuori. Infatti, compilando ed eseguendo, ora non c'è più Segmentation fault.
    Infatti non serve ritornare nulla, perchè lavori direttamente con il puntatore.
    lolide
    Java Programmer

    Informati

  8. #8
    Originariamente inviato da lolide
    Si è così. Il problema è che per mantenere la compatibilità con il C, se vuoi usare quella variabile come vuoi fare tu, devi anteporre a struct typedef:

    codice:
    typedef struct cinema_ {
    ...}
    cinema;
    Se vuoi usare le struct, la compatibilità con il C la devi mantenere secondo me, altrimenti usi le classi.
    Secondo me questa è una sciocchezza, non vedo perché portarsi dietro una delle storture del C anche in C++: se programmi in C++ struct e classi sono la stessa cosa, l'unica differenza è il modificatore di accesso predefinito per membri ed ereditarietà.
    E soprattutto, se fai una struct che contiene una stringa (std::string) parlare di compatibilità con il C non ha nessun senso.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Originariamente inviato da MItaly
    Secondo me questa è una sciocchezza, non vedo perché portarsi dietro una delle storture del C anche in C++: se programmi in C++ struct e classi sono la stessa cosa, l'unica differenza è il modificatore di accesso predefinito per membri ed ereditarietà.
    E soprattutto, se fai una struct che contiene una stringa (std::string) parlare di compatibilità con il C non ha nessun senso.
    Appunto :P Che usi le classi ...
    Vabbè scusate, era una mia opinione personale.
    lolide
    Java Programmer

    Informati

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.