Итак, я начинаю использовать 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, я начну получать странные символы и числа, и я знаю, что связано с распределением памяти, но я не могу найти, почему или где проблема. Если вам нужны дальнейшие объяснения по поводу кода или в чем я сомневаюсь, просто дайте мне знать, и я постараюсь повторить это по-другому.
Заранее спасибо, Хорхе.