Проблема при попытке скопировать структуру в C - PullRequest
0 голосов
/ 20 апреля 2020

Итак, я начинаю использовать C, и у меня почти всегда возникают проблемы с распределением памяти. В основном я застреваю, когда пытаюсь скопировать структуру в другую структуру.

Я поставлю вам код здесь: Файл заголовков:

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

//declaration constants
#define MAX_NAME 15+1
#define SEATS_PERCENTAGE 0.95
#define IN_TIME 60
#define OUT_TIME 120

//type declarations
typedef enum {FORBIDDEN, ALLOWED_WITH_COMPANION, ALLOWED} tFairgroundRideAccess;

typedef struct{
    tFairgroundRideAccess lessThan100;
    tFairgroundRideAccess between100_120;
    tFairgroundRideAccess between120_140;
    tFairgroundRideAccess greaterThan140;
} tFairgroundRideHeightRequirement;

typedef struct {
    char name[MAX_NAME];
    tFairgroundRideHeightRequirement accessHeight;
    int durationTrip;
    int numPersonsTrip;
    int peopleInQueue;
} tFairgroundRide;

tFairgroundRide myFairgroundRide;

//define function headers
void readFairgroundRide(tFairgroundRide *fRide);
void writeFairgroundRide(tFairgroundRide fRide);
void copyFairgroundRide(tFairgroundRide fRideSrc, tFairgroundRide *fRideDst);
int waitingTime (tFairgroundRide fRide, int people);
bool accessWithoutCompanion (tFairgroundRide fRide, int height);
void selectFairgroundRide (tFairgroundRide fRide1, tFairgroundRide fRide2, int people1, int people2, int height2);

Файл с функциями это следующее (что я хочу проверить , почему я не распределяю должным образом в памяти новую копию в функции copyFairgroundRide ):

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include "fairgroundRide.h"

void readFairgroundRide(tFairgroundRide *fRide){
    printf("NAME >> \n");
    scanf("%s", fRide->name);
    getchar();
    printf("ACCESS HEIGHT, LESSTHAN100 (0-FORBIDDEN, 1-ALLOWED_WITH_COMPANION, 2-ALLOWED) >> \n");
    scanf("%d", &fRide->accessHeight.lessThan100);
    getchar();
    printf("ACCESS HEIGHT, BETWEEN100_120 (0-FORBIDDEN, 1-ALLOWED_WITH_COMPANION, 2-ALLOWED) >> \n");
    scanf("%d", &fRide->accessHeight.between100_120);
    getchar();
    printf("ACCESS HEIGHT, BETWEEN120_140 (0-FORBIDDEN, 1-ALLOWED_WITH_COMPANION, 2-ALLOWED) >> \n");
    scanf("%d", &fRide->accessHeight.between120_140);
    getchar();
    printf("ACCESS HEIGHT, GREATERTHAN140 (0-FORBIDDEN, 1-ALLOWED_WITH_COMPANION, 2-ALLOWED) >> \n");
    scanf("%d", &fRide->accessHeight.greaterThan140);
    getchar();
    printf("TRIP DURATION >> \n");
    scanf("%d", &fRide->durationTrip);
    getchar();
    printf("NUMBER OF PERSONS ON A TRIP >> \n");
    scanf("%d", &fRide->numPersonsTrip);
    getchar();
}

void writeFairgroundRide(tFairgroundRide fRide){
    printf("NAME: %s\n", fRide.name);
    printf("ACCESS HEIGHT, LESSTHAN100 (0-FORBIDDEN, 1-ALLOWED_WITH_COMPANION, 2-ALLOWED): %d\n",fRide.accessHeight.lessThan100);
    printf("ACCESS HEIGHT, LESSTHAN100 (0-FORBIDDEN, 1-ALLOWED_WITH_COMPANION, 2-ALLOWED): %d\n",fRide.accessHeight.between100_120);
    printf("ACCESS HEIGHT, LESSTHAN100 (0-FORBIDDEN, 1-ALLOWED_WITH_COMPANION, 2-ALLOWED): %d\n",fRide.accessHeight.between120_140);
    printf("ACCESS HEIGHT, LESSTHAN100 (0-FORBIDDEN, 1-ALLOWED_WITH_COMPANION, 2-ALLOWED): %d\n",fRide.accessHeight.greaterThan140);
    printf("TRIP DURATION: %d\n", fRide.durationTrip);
    printf("NUMBER OF PERSONS ON A TRIP: %d\n", fRide.numPersonsTrip);
}

void copyFairgroundRide(tFairgroundRide fRideSrc, tFairgroundRide *fRideDst){
    strcpy(fRideDst->name,fRideSrc.name);
    fRideDst->accessHeight.lessThan100 = fRideSrc.accessHeight.lessThan100;
    fRideDst->accessHeight.between100_120 = fRideSrc.accessHeight.between100_120;
    fRideDst->accessHeight.between120_140 = fRideSrc.accessHeight.between120_140;
    fRideDst->accessHeight.greaterThan140 = fRideSrc.accessHeight.greaterThan140;
    fRideDst->durationTrip = fRideSrc.durationTrip;
    fRideDst->numPersonsTrip = fRideSrc.numPersonsTrip;
    fRideDst->peopleInQueue = fRideSrc.peopleInQueue;
}

int waitingTime (tFairgroundRide fRide, int people){
    int result;
    result = ((IN_TIME+OUT_TIME+(fRide.durationTrip*60)) * (fRide.numPersonsTrip * SEATS_PERCENTAGE) * people);
    return result;
}

bool accessWithoutCompanion (tFairgroundRide fRide, int height){
    if (height < 100 && fRide.accessHeight.lessThan100 == 2){
        return true;
    }
    if(height >= 100 && height<120 && fRide.accessHeight.between100_120 == 2){
        return true;
    }
    if(height >= 120 && height<=140 && fRide.accessHeight.between120_140 == 2){
        return true;
    }
    if (height > 140 && fRide.accessHeight.greaterThan140 == 2){
        return true;
    }else{
            return false;
    }
}


void selectFairgroundRide (tFairgroundRide fRide1, tFairgroundRide fRide2, int people1, int people2, int height2){
    if((accessWithoutCompanion(fRide1,height2) == true) && (waitingTime(fRide1,people1)<=waitingTime(fRide2,people2))){
        copyFairgroundRide(fRide1,&myFairgroundRide);
    }
    if((accessWithoutCompanion(fRide1,height2) == true) && (accessWithoutCompanion(fRide2,height2)==false)){
        copyFairgroundRide(fRide1,&myFairgroundRide);
    }
    if((accessWithoutCompanion(fRide1,height2) == false) && (accessWithoutCompanion(fRide2,height2))){
        copyFairgroundRide(fRide2,&myFairgroundRide);
    }
}

И основной код:

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include "fairgroundRide.h"

int main(){

    tFairgroundRide myFairgroundRide;
    tFairgroundRide fairgroundRide1;
    tFairgroundRide fairgroundRide2;
    int height1,people1,people2;

    printf("ENTER DATA FOR FIRST FAIRGROUND RIDE >>\n");
    readFairgroundRide(&fairgroundRide1);
    printf("ENTER THE PEOPLE IN THE QUEUE OF FAIRGROUND RIDE 1 >> \n");
    scanf("%d", &people1);
    getchar();
    printf("ENTER DATA FOR SECOND FAIRGROUND RIDE >>\n");
    readFairgroundRide(&fairgroundRide2);
    printf("ENTER THE PEOPLE IN THE QUEUE OF FAIRGROUND RIDE 2 >> \n");
    scanf("%d", &people2);
    getchar();
    printf("ENTER THE HEIGHT >> \n");
    scanf("%d", &height1);
    getchar();
    selectFairgroundRide(fairgroundRide1,fairgroundRide2,people1,people2,height1);
    printf("RESULTS:\n");
    writeFairgroundRide(myFairgroundRide);
    getchar();
    return 0;
}

Так что, когда я запускаю программу, я могу получить всю информацию обо всех входах, faigroundRide1 и fairgroundRide2, но если я скопирую ее в другую структуру с именем myFairgroundRide, я начну получать странные символы и числа, и я знаю, что связано с распределением памяти, но я не могу найти, почему или где проблема. Если вам нужны дальнейшие объяснения по поводу кода или в чем я сомневаюсь, просто дайте мне знать, и я постараюсь повторить это по-другому.

Заранее спасибо, Хорхе.

1 Ответ

1 голос
/ 20 апреля 2020

У вас есть два myFairgroundRide. Один в глобальной области видимости, а другой как локальная переменная в main. В selectFairgroundRide вы копируете в глобальный, но позже в main вы печатаете локальный.

И, кстати, copyFairgroundRide можно упростить:

void copyFairgroundRide(tFairgroundRide fRideSrc, tFairgroundRide *fRideDst)
{
   *fRideDst = fRideSrc;
}
...