Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    152

    Segmentation fault

    ragazzi sto da giorni a compilare ed eseguire un benedetto programmino in c semplicissimo, ma che dopo aver inserito in input un dato mi esce l'errore sulla schermata : segmentation fault < core dumped>...come posso risolverlo? se volete vi copio anche il testo del programma, breve e semplice credetemi ( elementare ). aiutatemi, grazie

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Si,copia il testo del programma usando i tag code.
    Generalmente accade quando tenti di scrivere su un' area di memoria non allocata,posta il codice.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466

    Re: Segmentation fault

    Originariamente inviato da johnnny
    se volete vi copio anche il testo del programma, breve e semplice credetemi ( elementare ). aiutatemi, grazie
    Non è che vogliamo, è che devi, visto che a priori così senza vederlo non possiamo tirare a indovinare..

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    152
    #include<stdio.h>
    #include<stdlib.h>


    int main()

    {
    int n,importo,i;
    float prod,bonus,quota;

    printf("\n\n Quante squadre vuoi giocare?\n\n");
    scanf("%d",&n);

    printf("\n\n Inserisci le quote delle tue giocate\n\n");
    prod=1;
    for(i=0;i<n;i++)

    { scanf("%f",quota);
    prod=prod*quota;
    }

    printf("\n\n\n\n Qual'è l'importo della tua giocata?");
    scanf("%d",importo);
    prod=prod*importo;

    if(n==5)
    { bonus=(prod/100)*5;
    prod=prod+bonus;}
    else if(n==6)
    { bonus=(prod/100)*10;
    prod=prod+bonus;}
    else if(n==7)
    { bonus=(prod/100)*15;
    prod=prod+bonus;}
    else if(n==8)
    { bonus=(prod/100)*21;
    prod=prod+bonus;}


    printf("\n\n\n\n Probabile vincita:%f",prod);
    return 0;
    }

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Rivediti le scanf()... confronta ad esempio la prima con le altre.
    every day above ground is a good one

  6. #6
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    codice:
    printf("\n\n\n\n Qual'è l'importo della tua giocata?");
    scanf("%d",importo);
    prod=prod*importo;
    Crasha perchè nella scanf non hai messo l' operatore indirizzo &,tenta di scrivere il tuo input nella locazione di memoria importo (valore della variabile),che non è stata allocata.
    Ecco il perchè del segmentation fault.

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    152
    mmm...non ho capito bene, cioè l'unica cosa da fare è mettere & solo prima della variabile importo??? o vicino ad ogni altra variabile?

  8. #8
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Così:
    codice:
    scanf("%d",&importo);
    Come hai fatto prima con n (hai scritto &n).
    In generale in ogni scanf si passa l' indirizzo della variabile (&n=indirizzo di n).

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    152
    ragazzi grazie mille, finalmente è riuscito a girare...dovevo mettere la &anche negli altri due scanf, ma qualcuno sa spiegarmi perchè c'è bisogno sempre dell'indirizzo??? quando programmavo in c++ non ce n'era bisogno...mmaaa

  10. #10
    In C++ sarebbe comunque un errore. Ci sono funzioni che si aspettano come parametro un puntatore.

    Sai bene cosa è un puntatore?

    Per semplificare (semplificare tanto), un puntatore è identico ad un int, anzi è proprio un int (magari di 64 bit, magari di 32... o altro dipende dalla macchina hardware e dal S/O).

    Immagina la memoria del tuo computer come una lista di celle capaci di contenere un byte (semplificando), ogni cella può contenere un valore di un byte. Inoltre ogni cella ha un numero intero associato, che è il suo indirizzo.

    cella numero 0: valore 120
    cella numero 1: valore 0
    cella numero 2: valore 0
    cella numero 3: valore 0
    cella numero 4: valore 11
    cella numero 5: valore 0
    cella numero 6: valore 0
    cella numero 7: valore 0

    ora supponi che il tuo codice C riporti il seguente:

    codice:
    int a;
    diciamo per esempio che il compilatore mappa questa variabile a con l'indirizzo di memoria 4.
    essendo un int composto da 4 byte il valore di "a" sarebbe 0 0 0 11 ovvero 11, mentre il suo indirizzo è 4.

    quindi riepilogando:

    codice:
    printf("val:%d ind:%d", a, &a);
    stamperebbe
    val:11 ind:4

    se tu poi fai il seguente
    codice:
    scanf("%d", a);
    scanf cerca di scrivere il valore letto da tastiera all'indirizzo 11 (vedere manuale scanf), che non hai allocato, quindi il sistema operativo si arrabbia e da segmentation fault.

    se invece fai
    codice:
    scanf("%d", &a);
    scanf cerca di scrivere il valore all'indirizzo 4, che è quello giusto e non hai segmentation fault.

    Mi piace rispolverare questi concetti di tanto in tanto , nell'epoca di garbage collectors e programmazione ad alto livello dei giorni d'oggi.

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.