Condividi:        

[C]Stampa strani simboli e chiusura inaspettata programma

Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!

Moderatori: Anthony47, Triumph Of Steel, archimede

[C]Stampa strani simboli e chiusura inaspettata programma

Postdi makuto » 07/09/10 14:09

Vi chiedo una grossa mano. Ho scritto questo programma, una volta compilato lo avvio e mi funziona fino al momento di fare la stampa nel main (mi inizia a stampare dei simboli strani e poi windows lo chiude). Ho messo degli "stampa" di prova nella funzione e vedo così che il vettore si carica correttamente. Cosa può essere a non andare? Succede qualcosa tra il passaggio del vettore dalla funzione al main secondo me...Grazie mille!
Codice: Seleziona tutto
#include<stdio.h>

typedef struct{
char destinazione[21];
char tipologia;
float costo;
int data;
}viaggio;
typedef viaggio viaggi[100];

int carica(viaggi v, int dim){
char risp='s';
while(risp=='s'){
printf("IInserire destinazione: ");
scanf("%s", v[dim].destinazione);
printf("Inserire tipologia (A: all inclusive H: Hotel V: Viaggio): ");
scanf("%1s", &v[dim].tipologia);
printf("Inserire costo: ");
scanf("%f", &v[dim].costo);
printf("Inserisci data (gg/mm/aa): ");
scanf("%d", &v[dim].data);
printf("Inserire altro viaggio?(s/n): ");
scanf("%1s", &risp);
dim++;}

return (dim);
}

void stampa(viaggi v, int dim){
int i;
for(i=0;i<dim;i++){
printf("/n %s %c %f %d", v[i].destinazione, v[i].tipologia, v[i].costo, v[i].data);}
}

int main(){
viaggi v;
int dim=0, i;
dim=carica(v, dim);
stampa(v, dim);

return 0;
}

Moderazione: titolo modificato perché in violazione della netiquette (#3).
makuto
Newbie
 
Post: 6
Iscritto il: 07/09/10 14:08

Sponsor
 

Postdi clax99 » 08/09/10 16:55

Ciao,
scusami se ti faccio questa domanda, ma è da poco che scrivi codice in C?

Permettimi un consiglio: la prima cosa è scrivere il codice in maniera più "ordinata", ovvero indentata, io lo leggo molto meglio così:
Codice: Seleziona tutto
#include<stdio.h>

typedef struct{
char destinazione[21];
char tipologia;
float costo;
int data;
}viaggio;
typedef viaggio viaggi[100];

int carica(viaggi v, int dim)
{
    char risp='s';
    while(risp=='s')
    {
        printf("IInserire destinazione: ");
        scanf("%s", v[dim].destinazione);

        printf("Inserire tipologia (A: all inclusive H: Hotel V: Viaggio): ");
        scanf("%1s", &v[dim].tipologia);

        printf("Inserire costo: ");
        scanf("%f", &v[dim].costo);

        printf("Inserisci data (gg/mm/aa): ");
        scanf("%d", &v[dim].data);

        printf("Inserire altro viaggio?(s/n): ");
        scanf("%1s", &risp);

        dim++;
    }
    return (dim);
}

void stampa(viaggi v, int dim)
{
        int i;
        for( i=0; i<dim; i++)
                printf("/n %s %c %f %d", v[i].destinazione, v[i].tipologia, v[i].costo, v[i].data);
}

int main()
{
        viaggi v;
        int dim=0, i;
        dim=carica(v, dim);
        stampa(v, dim);

        return 0;
}
Anzitutto all'interno del main hai dichiarato la variabile i e poi non la usi... Cerca inoltre di evitare i nomi di variabili con un solo carattere, personalmente li uso solo negli indici.

Non ricordo bene la parola chiave typedef, ma mi sembra che tu abbia dichiarato un vettore come variabile globale del tipo della tua struttura, se così perché effttuare un passaggio di variabili alle funzioni?

Utilizzando un vecchissimo C++ della Borland, io dichiarerei così la tua struttura:
Codice: Seleziona tutto
struct viaggio
{
    char destinazione[21];
    char tipologia;
    float costo;
    int data;
};
viaggio viaggi[100];
Inoltre dovresti testare nella tua funzione di inserimento anche la condizione di non aver raggiunto il limite dei 100, con una and (&&).

Per quanto riguarda la chiusura del programma è normalissimo: inserisci nel main() l'attesa della digitazione di un carattere da tastiera, altrimenti il PC esegue il programma e poi lo termina, non è dato per scontato l'attesa che l'utente legga i risultati. Includi anche la libreria "conio.h" e dopo la funzione di stampa del main inserisci un richiamo alla funzione "getch()".

Spero di non averti incasinato di più le idee, non ho un compilatore sottomano da qualche anno e sto leggendo mentre sono in treno (con tutto il caos annesso :!: )il tuo codice, comunque dovresti testarlo con qualche ambiente IDE ed introducendo dei breakepoint, in modo da seguire passo passo anche i valori delle variabili... fammi sapere se posso esserti di aiuto in qualcosa.

Ciao. :D
Ciao Eddie.
clax99
Utente Senior
 
Post: 173
Iscritto il: 31/10/05 11:03

Re: [C]Stampa strani simboli e chiusura inaspettata programm

Postdi clax99 » 08/09/10 16:59

ultimo: ma perché alla funzione stampa stai passando una variabile e poi la vuoi trattare come vettore?
Ciao Eddie.
clax99
Utente Senior
 
Post: 173
Iscritto il: 31/10/05 11:03

Re: [C]Stampa strani simboli e chiusura inaspettata programm

Postdi makuto » 08/09/10 18:44

La struttura l'ho così dichiarata in quanto, utilizzando Eclipse, mi da meno problemi di compilazione.
La chiusura del programma non è normale, in quanto (con windows 7) la finestra mi si opacizza e mi comunica con un messaggio l'errore, dicendo che il programma ha smesso di funzionare.
Il punto principale è che di programmi simili a questo ne ho fatti diversi ma fin'ora sono sempre andati senza problemi.
Questo non mi va per qualche oscura ragione.
Inoltre:
Ho testato che sui mac il programma gira.
Ho provato su un altro computer windows e il programma non va.
Ho modificato un file vecchio scrivendoci il nuovo programma e sembra andare, quando però copio-incollo il testo e lo faccio eseguire da un altro compilatore (tipo lcc) non va più.
Indi per cui mi viene da pensare che non sia mio l'errore, ma che sia successo qualcosa alla macchina.
Ti ringrazio infinitamente se riesci a risolvere il problema!
makuto
Newbie
 
Post: 6
Iscritto il: 07/09/10 14:08

Re: [C]Stampa strani simboli e chiusura inaspettata programm

Postdi makuto » 08/09/10 18:47

Dimenticavo: alla funzione stampa passo v che è un parametro di tipi viaggi, che a sua volta è un vettore del tipo viaggio.
Quindi sono abbastanza sicuro di poterla trattare come vettore, anche perchè fin'ora ho fatto sempre così senza problemi!
makuto
Newbie
 
Post: 6
Iscritto il: 07/09/10 14:08

Re: [C]Stampa strani simboli e chiusura inaspettata programm

Postdi clax99 » 08/09/10 19:23

Ok, non conosco il tuo compilatore... hai provato a seguire passo passo in una fase di debug il contenuto delle variabili?

Io scriverei il codice un pò diversamente, ognuno ha un proprio stile, proprio come la calligrafia.

Perché non tetare di dichiarare solo variabili globali ed evitare i passaggi a funzione, anche solo per provare... se vuoi potremmo riscriverlo...

Ciao.
Ciao Eddie.
clax99
Utente Senior
 
Post: 173
Iscritto il: 31/10/05 11:03

Re: [C]Stampa strani simboli e chiusura inaspettata programm

Postdi makuto » 08/09/10 19:26

Non posso usare variabili globali e i break (consegna dei superiori).
Il debug l'ho seguito passo a passo, nel momento di fare la stampa iniziano a comparire simboli a casaccio nelle celle di memoria, non capisco il perchè. :eeh:
E' possibile, mi chiedo, che Dev-c++ entro in conflitto con Eclipse? Io li ho installati entrambi... :?:
makuto
Newbie
 
Post: 6
Iscritto il: 07/09/10 14:08

Re: [C]Stampa strani simboli e chiusura inaspettata programm

Postdi clax99 » 08/09/10 19:52

Purtroppo non conosco direttamente i due compilatori, ma ti posso dire che con Dev... alcuni miei compagni di classe hanno avuto qualche difficoltà...

Provato a compilarlo su un altro PC che non abbia installato la duplice combinazione di compilatori. Certo che se andasse...
Ciao Eddie.
clax99
Utente Senior
 
Post: 173
Iscritto il: 31/10/05 11:03

Re: [C]Stampa strani simboli e chiusura inaspettata programm

Postdi makuto » 08/09/10 21:47

Per esempio, ho appena scritto questo programma, non va. Ho sbagliato qualcosa?
Codice: Seleziona tutto
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct {
   char nome[51];
   char cognome[20];
   int eta;
} persona;
typedef persona persone[30];

int carica(persone p, int dimp){
   char risp='s';
   while(risp=='s' && dimp<30){
      printf("Nome: ");
      scanf("%s", p[dimp].nome);
      printf("Cognome: ");
      scanf("%s", p[dimp].cognome);
      printf("Eta: ");
      scanf("%d", &p[dimp].eta);
      dimp++;
      printf("Caricare altro?: ");
      scanf("%1s", &risp);
   }
   return dimp;
}

int main(){
   persone pers;
   int i, dim=0;
   dim=carica(pers, dim);
   printf("Hai caricato un totale di %d persone", dim);
   for(i=0;i<dim;i++){
      printf("\n\n %s", pers[i].nome);
      printf("\n %s", pers[i].cognome);
      printf("\n %d", pers[i].eta);
   }
   scanf("%d", &i);
}

makuto
Newbie
 
Post: 6
Iscritto il: 07/09/10 14:08

Re: [C]Stampa strani simboli e chiusura inaspettata programm

Postdi clax99 » 09/09/10 07:45

Codice: Seleziona tutto

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct {
   char nome[51];
   char cognome[20];
   int eta;
} persona;
typedef persona persone[30];

int carica(persone p, int dimp){
   char risp='s';
   while(risp=='s' && dimp<30){
      printf("Nome: ");
      scanf("%s", p[dimp].nome);
      printf("Cognome: ");
      scanf("%s", p[dimp].cognome);
      printf("Eta: ");
      scanf("%d", &p[dimp].eta);
      dimp++;
      printf("Caricare altro?: ");
      scanf("%1s", &risp);          [b]Attenzione alla scanf()[/b]
   }
   return dimp;
}

int main(){
   persone pers;
   int i, dim=0;
   dim=carica(pers, dim);
   printf("Hai caricato un totale di %d persone", dim);
   for(i=0;i<dim;i++){
      printf("\n\n %s", pers[i].nome);
      printf("\n %s", pers[i].cognome);
      printf("\n %d", pers[i].eta);
   }
   scanf("%d", &i);
}





Io scriverei tipo così:

Codice: Seleziona tutto

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>

struct persona
{
   char nome[51];
   char cognome[20];
   int eta;
};

persona  persone[30];   // Vettore ti tipo persona
int carica();    // Prototipo funzione

int carica()
{
   char risp='s';
   int dimp;

    for( dimp=0; risp=='s' && dimp<30; dimp++ )
    {
        printf("Nome: ");
        gets(persone[dimp].nome);    // se includi la string.h usiamo questa
        printf("Cognome: ");
        gets(persone[dimp].cognome);
        printf("Eta: ");
        scanf("%d", &persone[dimp].eta);
        printf("Caricare altro?: ");
        risp=getche();   // attende la pressione di un carattere e te lo fa vedere
   }

   return dimp;
}

int main()
{
   int i, dim;

   dim=carica();    // non avendo un menù di scelta esterno perché passare una variabile che vale perforza zero?

   printf("Hai caricato un totale di %d persone", dim);

   for( i=0; i<dim; i++ )
   {
      puts(pers[i].nome);
      puts(pers[i].cognome);
      printf("\n %d", pers[i].eta);
   }

   // scanf("%d", &i); se questa la usi per arrestare la finestra... non è bellissimo

   getch();

}



Scusami sempre la fretta e qualche imprecisione, ma ti scrivo sempre dal solito treno.

Ciao.
Ciao Eddie.
clax99
Utente Senior
 
Post: 173
Iscritto il: 31/10/05 11:03

Re: [C]Stampa strani simboli e chiusura inaspettata programm

Postdi zello » 21/09/10 10:38

Dal primo programma
Codice: Seleziona tutto
scanf("%1s", &v[dim].tipologia);

Così si legge una stringa lunga un carattere, ma una stringa lunga un carattere occupa due caratteri in memoria (il carattere più lo zero terminatore). Il campo tipologia è definito di un carattere solo, e quindi BANG, buffer overflow. Per leggere un carattere si usa %c, direi.
Il secondo programma:
Codice: Seleziona tutto
scanf("%1s", &risp);

risp è un char, quindi stessa medesima cosa.
Sulle differenze di comportamento: andare oltre al buffer vuole dire sovrascrivere qualcosa, dipende quanto è vitale ciò che sovrascrivi e dipende se sei in modalità debug o meno (spesso, le modalità debug prevedono controlli contro i buffer overflows).
Il faut être toujours ivre. Tout est là : c'est l'unique question. Pour ne pas sentir l'horrible fardeau du Temps qui brise vos épaules et vous penche vers la terre,il faut vous enivrer sans trêve...
Avatar utente
zello
Moderatore
 
Post: 2351
Iscritto il: 06/05/02 13:44


Torna a Programmazione


Topic correlati a "[C]Stampa strani simboli e chiusura inaspettata programma":


Chi c’è in linea

Visitano il forum: Nessuno e 12 ospiti