«Ошибка сегментации (ядро сброшено)» при запуске программы - PullRequest
0 голосов
/ 10 апреля 2019

(извините за мой плохой английский кстати) Ну, я копирую решение этого кода. Мой код идентичен решению (код в порядке, все сделано), но когда я запускаю программу, появляется сообщение «1001». Я не знаю, как показать вам снимки моей программы, но мой код кажется нормальным. Когда я запускаю программу, она заканчивается, когда запрашивает объем Good. Тогда это сообщение: Segmentation fault (core dumped) появляется

#include <stdio.h>

#define NUM 5
#define MAX_WAGON_CAPACITY 0.85
#define MAX_WAGON_CAPACITY_ANIMALS 0.5
#define LIMIT1 500
#define LIMIT2 2500
#define FRAGILE 1.10
#define DANGEROUS 1.15
#define FIRST_PRICE 0.50
#define SECOND_PRICE 0.45
#define THIRD_PRICE 0.40

typedef enum { FOOD, CHEMICAL, ANIMALS, VEHICLES,
               ELECTRONICS, CONSTRUCTION, OTHERS } tGoodType;
typedef enum { FALSE, TRUE } boolean;

int main(int argc, char **argv) {
    int idGood;
    float volumeGood;
    tGoodType typeOfGood;
    boolean isFragile;
    boolean isDangerous;
    float train [NUM];
    int nWagons;
    float volumeTrain;
    float price;  
    float surchargeFragile;
    float surchargeDangerous;

    printf("Good identifier: \n");
    scanf("%d", &idGood);
    printf("\nInsert volume of Good\n");
    scanf("%f", volumeGood);
    printf("\nInsert Good type (0-FOOD, 1-CHEMICAL, 2-ANIMALS, 3-VEHICLES, 4-ELECTRONICS, 5-CONSTRUCTION, 6-OTHERS)\n");
    scanf("%u", &typeOfGood);
    printf("\nIs the Good fragile? (0-FALSE, 1-TRUE)\n");
    scanf("%u", &isFragile);
    printf("\nIs the Good dangerous) (0-FALSE, 1-TRUE\n");
    scanf("%u", &isDangerous);
    printf("\nThe maximum length of the train is>> ");
    scanf("%f", train[0]);
    printf("\nThe length of the locomotive is>> ");
    scanf("%f", train[1]);
    printf("\nThe length of each wagon is>> ");
    scanf("%f", train[2]);
    printf("\nThe space between each wagon is>> ");
    scanf("%f", train[3]);
    printf("\nThe volume of a wagon is>> ");
    scanf("%f", train[4]);

    nWagons = (int)((train[1] - train[2]) / (train[3] + train[4]));

    if (typeOfGood == 2)
        volumeTrain = nWagons * train[4] * MAX_WAGON_CAPACITY_ANIMALS;
    else
        volumeTrain = nWagons * train[4] * MAX_WAGON_CAPACITY;

    price = 0.0;
    surchargeFragile = 0.0;
    surchargeDangerous = 0.0;
    if (volumeTrain >= volumeGood) {
        if (volumeGood > 0 && volumeGood < LIMIT1) { 
            price = volumeGood * FIRST_PRICE;
        } else if (volumeGood >= LIMIT1 && volumeGood <= LIMIT2) {
            price = volumeGood * SECOND_PRICE;
        } else {
            price = volumeGood * THIRD_PRICE;
        }
    }
    if (isFragile == 1) {
        surchargeFragile = (price * FRAGILE) - price;
    }
    if (isDangerous == 1) {
        surchargeDangerous = (price * DANGEROUS) - price;
        price = price + surchargeFragile + surchargeDangerous;
    }   

    if (price > 0.0) {
        printf("The Good id is %d", &idGood);
        printf("The number of wagons is %d", &nWagons);
        printf("The price for the good is %f", &price);
    } else {
        printf("The good does not fit the train");
    }

    return 0;
}

1 Ответ

1 голос
/ 10 апреля 2019

у вас есть несколько ошибок в вашем scanf, приводящих к вашей ошибке сегментации, они указываются компилятором:

c.c:38:1: warning: ‘volumeGood’ is used uninitialized in this function [-Wuninitialized]
scanf("%f", volumeGood);
^~~~~~~~~~~~~~~~~~~~~~~

и

c.c:38:9: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double’ [-Wformat=]
scanf("%f", volumeGood);

, поскольку неопределенное значение volumeGood используется в качестве адреса, где scanf попытается написать

, который вы, вероятно, хотели

scanf("%f", &volumeGood);

а также все эти:

c.c:46:9: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double’ [-Wformat=]
scanf("%f", train[0]);
        ^
c.c:48:9: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double’ [-Wformat=]
scanf("%f", train[1]);
        ^
c.c:50:9: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double’ [-Wformat=]
scanf("%f", train[2]);
       ^
c.c:52:9: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double’ [-Wformat=]
scanf("%f", train[3]);
        ^
c.c:54:9: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double’ [-Wformat=]
scanf("%f", train[4]);

, потому что записи в train используются так, как если бы они содержали адреса, которые вы хотели

scanf("%f", &train[0]);
scanf("%f", &train[1]);
scanf("%f", &train[2]);
scanf("%f", &train[3]);
scanf("%f", &train[4]);

когда вы используете scanf и эквивалентный вам, вы должны указать адреса, где будут сохранены значения


Также в

c.c:84:29: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("The Good id is %d", &idGood);
                             ^
c.c:85:38: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("The number of wagons is %d", &nWagons);
                                      ^
c.c:86:40: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘float *’ [-Wformat=]
     printf("The price for the good is %f", &price);

в это времянаоборот, вы даете адрес, в то время как вы должны дать значения, должно быть

     printf("The Good id is %d", idGood);
     printf("The number of wagons is %d", nWagons);
     printf("The price for the good is %f", price);
...