Crash..?

di il
55 risposte

Crash..?

Salve, buonasera ho da poco iniziato a studiare il linguaggio c.
stavo svolgendo il seguente esercizio assegnatomi dal mio prof come esercitazione(nessuna verifica o altro serve solo a capire i meccanismi)
l'esercizio prevede:
Scrivere un programma per l’inserimento e visualizzazione di un tot
di automobili descritte da marca, modello e
numero di unità vendute. Il tot di automobili è inserito dall’utente del programma.+
#include <stdio.h>
#include <stdlib.h>

/*1. Scrivere un programma per l’inserimento e visualizzazione di un gruppo
di automobili descritte da marca, modello e
numero di unità vendute. Il gruppo di automobili è inserito dall’utente del programma.
*/
struct car{
char marca[20];
char modello[20];
int vendute;
}automobile;
void inserimento(struct car);
main(){
    struct car automobile;
inserimento(automobile);
printf("\necco i dati inseriti in precedenza:\n");
/*visualizza(automobile);*/
}
void inserimento(struct car automobile){
int i,a;
printf("quante auto vuoi inserire?");
scanf("%c",&a);
for (i=0;i<a;i++){
    printf("inserire\n1)la marca\n2)il modello\n3)auto vendute\n");
    scanf("%s",automobile.marca);
    scanf("%s",automobile.modello);
    scanf("%d",automobile.vendute);}
printf("\necco i dati inseriti in precedenza:\n");
printf("marca:%s\nmodello:%s\nauto vendute:%d",automobile.marca,automobile.modello,
       automobile.vendute);
  /*  (a<0)
    printf("devi inserirne  almeno 1 ");}*/
}
come mai dopo il primo inserimento il programma crasha?
cioè inserisco la prima auto
dovrebbe ridarmi di nuovo marca modello ecc..

55 Risposte

  • Re: Crash..?

    Per un numero intero devi usare %d e non %c

    Poi devi usare un array di strutture altrimenti non puoi memorizzare più automobili
  • Re: Crash..?

    Array di strutture???
    mai sentite nominare
    vedo cosa posso trovare online
  • Re: Crash..?

    Qui per una volta ti consiglierei un libro introduttivo, più che internet
  • Re: Crash..?

    Concordo... se non hai mai sentito parlare di elementi di base di un linguaggio forse ti serve un buon libro.
  • Re: Crash..?

    Ok ho studiato un po queste array di strutture..
    ed ho appreso che si deve dichiarare tramite una define una costante
    il fatto è che io che compilo non so ,in run time quante auto vuole inserire l'utente
    non ne vengo a capo :/
    il libro da cui sto studiando è il deitel.
  • Re: Crash..?

    Il programma funziona... sapete dove sbagliavo??
    #include <stdio.h>
    #include <stdlib.h>
    #define DIM 4
    
    /*1. Scrivere un programma per l’inserimento e visualizzazione di un gruppo
    di automobili descritte da marca, modello e
    numero di unità vendute. Il gruppo di automobili è inserito dall’utente del programma.
    */
    struct car{
    char marca[20];
    char modello[20];
    int vendute;
    };
    main(){
    
        struct car array_car[DIM];
    printf("\necco i dati inseriti in precedenza:\n");
    int i,a;
    printf("inserire\n1)la marca\n2)il modello\n3)auto vendute\n");
    for (i=0;i<DIM;i++){
        scanf("%s %s %d",&array_car[i].marca,&array_car[i].modello,
           &array_car[i].vendute);}
        printf("\necco i dati inseriti in precedenza:\n");
        for (i=0;i<DIM;i++){
    printf("\necco i dati inseriti in precedenza:\n");
    printf("%s %s %d",array_car[i].marca,array_car[i].modello,
           array_car[i].vendute);
        }}
    
    non utilizzando l'operatore & il programma continuava a crashare.
  • Re: Crash..?

    Ora vorrei provare in un diverso modo.
    il fatto è che io che compilo non so ,in run time quante auto vuole inserire l'utente
    ho provato cosi , ma dopo il secondo inserimento il programma crasha..??why?
    #include <stdio.h>
    #include <stdlib.h>
    
    /*1. Scrivere un programma per l’inserimento e visualizzazione di un gruppo
    di automobili descritte da marca, modello e
    numero di unità vendute. Il gruppo di automobili è inserito dall’utente del programma.
    */
    struct car{
    char marca[20];
    char modello[20];
    int vendute;
    };
    int DIM;
    main(){
    
        struct car array_car[DIM];
        printf("quanti elementi vuoi salvare?:");
        scanf("%d",&DIM);
    printf("\necco i dati inseriti in precedenza:\n");
    int i,a;
    DIM=(int*)malloc(DIM*sizeof(int));
    printf("inserire\n1)la marca\n2)il modello\n3)auto vendute\n");
    for (i=0;i<DIM;i++){
        scanf("%s %s %d",&array_car[i].marca,&array_car[i].modello,
           &array_car[i].vendute);}
        printf("\necco i dati inseriti in precedenza:\n");
        for (i=0;i<DIM;i++){
    printf("\necco i dati inseriti in precedenza:\n");
    printf("%s %s %d",array_car[i].marca,array_car[i].modello,
           array_car[i].vendute);
        }}
    
  • Re: Crash..?

    Ovvio DIM viene usato prima di essere valorizzato...

    Comunque se devi eseguire l'input e la visualizzazione dei dati di una automobile e POI quello di un'altra allora non ti serve l'array.

    Se devi eseguire prima l'input di TUTTE le automobili e poi visualizzare TUTTE le automobili allora ci vuole l'array.

    Tu che devi fare, la prima o la seconda cosa?
  • Re: Crash..?

    La seconda
  • Re: Crash..?

    Quindi ru indichi il numero di automobili e le inserisci.

    Dunque ti ci vuole un array di strutture e l'allocazione dinamica. Ma se non sai cosa sono non so che dirti ... sono argomenti che devi studiare ....
  • Re: Crash..?

    Certo conosco l'allocazione
    controlla se l'impostazione è giusta
    struct car{
    char marca[20];
    char modello[20];
    int vendute;
    };
    main(){
    int V;
    struct car array_car[V];
    printf("QUANTI ELEMENTI VUOI SALVARE?:")
    scanf("%d",&V);
    V=malloc(v*sizeof(int);
    ??? qualcosa non mi convince però..
  • Re: Crash..?

    No tutto sbagliato ... devi usare un puntatore a struttura e non un int ... non devi dichiarare l'array dato che lo vuoi allocare dinamicamente...

    Insomma non hai ancora chiari questi concetti ti consiglio di rivederli dato che dici di averli affrontati.
  • Re: Crash..?

    Neppure a me convince più di tanto.

    In estremissima sintesi ci sono vari approcci
    1) determini un limite massimo (fisso) del tuo array, e speri che l'utente non lo utilizzi tutto
    2) (meno diffuso) utilizzi un indice % dimensione (in sostanza un array circolare, che non va mai in overflow, ma con sovrascrittura dei dati, quando è possibile farlo)
    3) chiedi all'utente o determini in qualche modo PRIMA la dimensione massima dell'array
    4) allochi un array di dimensione fissata. Se ti accorgi che ne serve uno più grande allochi un secondo vettore (più ampio), ci copi dentro tutto quanto, rilasci il primo e continui a lavorare sul secondo, eventualmente ripetendo la procedura
    5) non usi un array del tutto, o meglio una struttura "intelligente" che si comporta come un vettore, ma che "dentro" può essere una lista, oppure un vettore del punto (4), o qualsiasi altra struttura dinamica ti venga in mente.

    Come vedi anche una cosa (apparentemente) banale come predisporre la memoria da riempire, in realtà, non è banale per nulla.
    Anche per motivi di performances: in certi casi il "costo" di allocare-copiare può essere rilevante.
    In altri no.
    Perchè poi entrano in gioco elementi molto più "specifici" (al 99.9% dei programmatori della domenica-junior eccetera non interessa), cioè la località del blocco di memoria.
    In sostanza la facilità con cui viene caricato nella cache della CPU.
    Un blocco di memoria contiguo può beneficiare di tutta una serie di ottimizzazione (precaching e chi più ne ha ne metta), mentre una struttura "a pezzi" (lista, albero o quello che vuoi), tipicamente, ha uno scattering che riduce notevolmente l'efficienza (e poi c'è tutto l'overhead del sistema operativo, tipicamente funzionante su pagine hardware da 4K).
    Tipicamente arriverai a queste considerazioni dopo una decina di anni di lavoro, quindi tranquillo (per ora).

    Quindi si fa presto a dire "allocare memoria".
  • Re: Crash..?

    Io seguirei una via di questo tipo...
    #define LMAX_STRINGHE   30
    
    const char *kStrNullPtr = "puntatore nullo";
    const char *kStrNoMem   = "memoria non allocata";
    
    typedef struct Car{
        char marca[LMAX_STRINGHE+2];
        char modello[LMAX_STRINGHE+2];
        int  vendute;
    } Car;
    
    int ricevi_intero( const char *msg, int *n );
    int ricevi_auto( Car *c, int iCar );
    int conferma_inserimento_auto( Car *c, int iCar );
    int mostra_auto( Car *c, int iCar );
    int errore( const char *msg );
    void attendi_invio( void );
    
    int main() {
        Car *ac = NULL; // ac: array di Car
        int i, e, qc;   // qc: quantita' di Car nell'array ac
    
        if( !ricevi_intero("quanti elementi vuoi inserire? ",&qc) )
            return 0; // errore gia' segnalato
    
        ac = calloc( qc, sizeof(*ac) );
        if( NULL == ac ) return errore( kStrNoMem );
        // da qui in poi occorre assicurarsi di rilasciare
        // con free() la memoria allocata quando non serve piu'
    
        for( e=0, i=0; i<qc; e=0, i++ ) { // e: esito
            if( ricevi_auto(ac,i) ) {
                e = conferma_inserimento_auto( ac, i );
    
                // e puo' essere: 0 (accettato), -1 (rifiutato), 1 (errore)
                if( e <= 0 ) // se e ==-1: ripetizione della richiesta d'inserimento
                    i += e;  // se e == 0: prosegue con l'inserimento successivo
                else break;  // se e == 1: errore (gia' segnalato)
            } else break;
        }
    
        if( i == qc ) {
            printf( "\necco i dati inseriti:\n" );
    
            for( i=0; i<qc; i++ )
                if( !mostra_auto(ac,i) )
                    break;
    
            attendi_invio();
        }
    
        free( ac );
        return 0;
    }
    Ovviamente, perché "giri" occorre implementare tutte quelle funzioni che ho inserito col nome in italiano.
Devi accedere o registrarti per scrivere nel forum
55 risposte