Как отобразить структуру списка другой структуры? - PullRequest
0 голосов
/ 28 октября 2019

Я работаю над небольшим проектом, в котором у меня есть структура автомобиля (год, марка и т. Д.) И структура коллекции, которая содержит автомобили. Как мне отобразить автомобили внутри коллекции?

в моем Car.h я определил:

struct CarP;
typedef struct CarP * Car;
typedef const struct CarP * constCar;

Car car_createCopy(constCar c); //returns a copied car from c 
void display_car(constCar c);

в своем файле Collection.h, который я определил:

struct CollectionP;
typedef struct CollectionP * Collection;
typedef const struct CollectionP * constCol;

и в Collection.c:

struct CollectionP{
    int nbCars;
    Car * carList;
}

int getNbCars(constCol c){
    return c -> nbCars;
}

void add_car(Collection c, constCar car){
    int nbCar = getNbCars(c);
    if(nbCar == 0)
        c -> carList = malloc(sizeof(car));
    else{
        c -> carList = realloc(c -> carList,(nbCar+1)*sizeof(car));
        c -> carList[nbCar] = car_createCopy(car);
    }
    c -> nbCars++;
}

void display_col(constCol c){
    int nbCar = getNbCars(c);
    for(int i = 0; i < nbCar; i++)
        display_car(c -> carList[i]);
}

после добавления некоторых автомобилей в коллекцию, я пытаюсь вызвать функцию отображения, я получаю только одну машину с нулевым для марки и другими номерами в качестве значений для других полей, а затем программа останавливается с ошибкой сегментации.

1 Ответ

1 голос
/ 28 октября 2019

Это неправильно. (см. // HERE ниже):

void add_car(Collection c, constCar car){
    int nbCar = getNbCars(c);
    if(nbCar == 0)
        c -> carList = malloc(sizeof(car));
    else{
        c -> carList = realloc(c -> carList,(nbCar+1)*sizeof(car));
        c -> carList[nbCar] = car_createCopy(car);  // HERE
    }
    c -> nbCars++;
}

Эта отмеченная строка отвечает за размещение автомобильной копии в списке. но он никогда не выполняется при первом добавлении. Его следует перемещать, в частности, после блока else и за его пределы.

void add_car(Collection c, constCar car){
    int nbCar = getNbCars(c);
    if(nbCar == 0)
        c -> carList = malloc(sizeof(car));
    else{
        c -> carList = realloc(c -> carList,(nbCar+1)*sizeof(car));
    }
    c -> carList[nbCar] = car_createCopy(car);  // FIXED
    c -> nbCars++;
}

Тем не менее в нем есть масса мест, требующих проверки на ошибки, и использование вами realloc должнопройти через временный указатель, чтобы вы не потеряли свой выделенный список из-за ошибочного NULL результата. Но суть вашей проблемы, как я показал выше.

...