Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798

    [C++] CiaoMondo.cpp

    Buon giorno a tutti.
    Mi sto accingendo a studiare un po' di C++ perchè
    voglio saper leggere un listato in tale linguaggio.
    A dir la verità non solo questo.
    Ho tra le mani un testo che era allegato ad una rivista
    di programmazione: il testo fa riferimento, forse, a versioni
    non recenti del compilatore e/o standard C++.
    Il mio ambiente è Linux Slackware 9.1 e gcc 3.2.3
    Sta di fatto che devo utilizzare iostream in luogo di
    iostream.h, specificare obbligatoriamente un namespace, ecc.

    A fronte del seguente codice:
    codice:
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
            char* nome;
            cout << "Come ti chiami?\n";
            cin >> nome;
            cout << "Ciao, " << nome << "." << endl;
            return 0;
    }
    ho un paio di domande da fare.
    1) Perchè l'esecuzione termina con un "Segmentation Fault"?
    Cosa causa quest'errore a run-time? (overflow?)
    2) Potete chiarirmi la differenza tra gcc e g++ per compilare?

    Sicuramente avro detto qualche fesseria, scusatemi.

    Grazie per le eventuali risposte.
    Slack? Smack!

  2. #2
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    L'errore te lo da perchè tu hai dichiarato solo un puntatore, ma non hai allocato la memoria sufficente per contenere il nome.

    Prova con:
    codice:
    char nome[50];
    per avere massimo 49 caratteri.

    Buona fortuna!

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798
    Innanzitutto, grazie per la risposta.
    Conosco come si dichiarano i puntatori, i reference, la dereferenziazione, ma quella dichiarazione della variabile l'ho presa paro paro dal testo.
    Scusa, ma char* non equivale a dichiarare un variabile stringa, ovvero un'array di caratteri?
    Quindi la mia variabile punta alla prima area di memoria occupata dall'array?
    Con char nome[50], posso utilizzare 49 caratteri più un terminatore di stringa, vero?

    Grazie per l'aiuto,
    Slack? Smack!

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    A me non va in Segmentation Fault. Comunque per rispondere alla tua seconda domanda, la differenza dovrebbe essere questa (sono pronto a ricevere qualsiasi rettifica):

    il gcc (Gnu C Compiler) è, come dice il nome stesso, un compilatore per codice C, mentre il G++ è il compilatore per codice C++.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    Prima rettifica (anche se non mi intendo di linux):
    gcc = Gnu Compilers Collection (credo) e non compila solo C.


  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    Effettivamente sono rimasto un po' indietro con le definizioni e con i supporti.
    Tratto dal sito ufficiale del GCC:

    «GCC used to stand for the GNU C Compiler, but since the compiler supports several other languages aside from C, it now stands for the GNU Compiler Collection.»

    Grazie per la correzione!


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    ritornando ai puntatori...

    in C++
    codice:
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
            char* nome;
            nome = new char [20]; // alloco in memoria lo spazio per un puntatore a caratteri di venti elementi.
            cout << "Come ti chiami?\n";
            cin >> nome;
            cout << "Ciao, " << nome << endl;
            delete [] nome; // libero la meoria
            system("pause");
            return 0;
    }
    in C
    codice:
    #include <stdio.h>
    #include <malloc.h>
    
    int main()
    {
            char* nome;
            nome = (char*) malloc(20*sizeof(char)); /* alloco in memoria lo spazio per un puntatore a caratteri di venti elementi. */
            printf("Come ti chiami?\n");
            scanf("%s", nome);
            printf("Ciao, %s\n", nome);
            free(nome); /* libero la memoria */ 
            return 0;
    }
    Come vedi il problema del "segmentation fault" non è legato al linguaggio... (C++ piuttosto che C)
    N.B. con alcuni compilatori il codice postato da Sergio Pedone
    potrebbe anche passare, non mandando il programma in fault,
    ma è solo per puro caso, provate ad esempio a dichiarare 5 puntatori
    e a non allocare la memoria necessaria...
    Provate ad esempio questo codice:
    codice:
    #include <stdio.h>
    #include <malloc.h>
    
    int main()
    {
            char *nome1, *nome2, *nome3, *nome4, *nome5;
            //nome = (char*) malloc(20*sizeof(char)); // non alloco nulla
            printf("Come ti chiami?\n");
            scanf("%s", nome1);
            printf("Come ti chiami?\n");
            scanf("%s", nome2);
            printf("Come ti chiami?\n");
            scanf("%s", nome3);
            printf("Come ti chiami?\n");
            scanf("%s", nome4);
            printf("Come ti chiami?\n");
            scanf("%s", nome5);
            printf("Ciao, %s %s %s %s %s\n", nome1, nome2, nome3, nome4, nome5);
            //free(nome);
            return 0;
    }
    ...Terrible warlords, good warlords, and an english song

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798
    Ehila! Quanta roba per un CiaoMondo!

    Grazie tante a tutti quanti.
    In effetti dichiaravo una variabile senza definirne la
    dimensione. Cosa che malloc (C) e l'operatore new (C++)
    fanno automaticamente.

    @Johnny_Depp:
    system("pause");
    è valida solo su piattaforma windows, vero?
    Slack? Smack!

  9. #9
    la funzione system() appartiene allo standard ANSI per il C (basta includere <stdlib.h>) quindi la puoi usare benissimo anche con Linux.

    Il comando MS-DOS: "PAUSE" invece lo puoi usare soltanto con Windows.
    (ergo, non puoi passarlo a system() sotto Linux)
    ...Terrible warlords, good warlords, and an english song

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798
    Claro!

    Slack? Smack!

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.