프로그램은 잘 도는데 경고가 너무 많이 떠서요;;
      글쓴이: yangam / 작성시간: 화, 2005/04/05 - 2:27오후    
  
  FUNDAMENTALS OF DATA STRUCTURES IN C 133페이지 2번 문제를 나름대로 풀어봤습니다.
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
#define	EACH_TIME	100		// 단위 시간만큼 돌아감
#define	USED	1		// 활주로가 단위 시간에 이미 사용되었을 경우 
#define	NOTUSED	0		// 활주로가 단위 시간에 아직 사용되지 않았을 경우
#define SPECIAL 2		// Runway 2 에 Landing 했을 경우
#define LANDING	1		// 함수에서 Landing 인지 Takeoff 인지 구분하기 위해서 사용
#define TAKEOFF	0
// Queue Structure 
typedef struct {
	int	planeid;			// plane's ID
	int landing_wt;			// landing waiting time
	int left_ft;			// left fly time
	int takeoff_wt;			// takeoff waiting time
	struct queue *link;
} queue;
// f - head of queue, r - tail of queue 
void initq(queue **f, queue **r);
// f - head of queue, r - tail of queue, flag - Distinguish Landing or Takeoff, planenum - number of plane will create
void createq(queue **f, queue **r, int flag);
// f - head of queue
void deleteq(queue **f);
// df - Destination head of queue, dr - Destination tail of queue, sf - Source head of queue, flag - Distinguish Landing or Takeoff
void addq(queue **df, queue **dr, queue **sf, int flag);
int main()
{
	int usedrunway0, usedrunway1, usedrunway2;		// 활주로의 사용 여부를 확인하는 변수
	
	int crashed;				// 사고가 난 비행기의 수
	int decide_runway;			// 활주로를 결정하는 변수
	int decide_planenum;		// 단위 시간에 처리될 이륙 및 착륙 비행기의 수를 결정하는 변수
	int total_takeoff_time;	
	int total_landing_time;
	int total_takeoff_plane_count;
	int total_landing_plane_count;
	int each_time;		// EACH_TIME 단위 시간 만큼 loop 이 실행됨
	
	int i;		// for loop statement 을 위한 임시 변수
	queue *t;	// for loop statement 을 위한 임시 큐			
	queue *lqf0, *lqf1, *lqf2, *lqf3;		// 4개의 Landing Queue 의 Front
	queue *lqr0, *lqr1, *lqr2, *lqr3;		// 4개의 Landing Queue 의 Rear
	queue *tqf0, *tqf1, *tqf2;				// 3개의 Takeoff Queue 의 Front
	queue *tqr0, *tqr1, *tqr2;				// 3개의 Takeoff Queue 의 Rear
	queue *wlqf, *wlqr;		// Landing 될 비행기가 들어있는 Queue
	queue *wtqf, *wtqr;		// Takeoff 될 비행기가 들어있는 Queue
	// 각각의 Landing Queue 를 초기화
	initq(&lqf0, &lqr0);
	initq(&lqf1, &lqr1);
	initq(&lqf2, &lqr2);
	initq(&lqf3, &lqr3);
	// 각각의 Takeoff Queue 를 초기화
	initq(&tqf0, &tqr0);
	initq(&tqf1, &tqr1);
	initq(&tqf2, &tqr2);
	// Landing 될 비행기가 들어있는 Queue 와 Takeoff 될 비행기가 들어있는 Queue 초기화
	initq(&wlqf, &wlqr);
	initq(&wtqf, &wtqr);
	// 설정된 단위 시간 만큼 loop 이 실행됨
	each_time = EACH_TIME;
	crashed = 0;
	srand((unsigned)time(NULL));
	while (each_time-- >= 0) {
		usedrunway0 = usedrunway1 = usedrunway2 = 0;
		puts("\n========================================");
		printf("프로그램 종료까지 %d 단위 시간 남음\n", each_time);
		puts("========================================");
		// 한 번에 최소한 0 - 3 대는 착륙하게끔 해준다.
		decide_planenum = rand() % 4;
		for (i = 0; i < decide_planenum; i++)
			createq(&wlqf, &wlqr, LANDING);
		// 한 번에 0 - 3 대는 이륙하게끔 해준다.
		decide_planenum = rand() % 4;
		for (i = 0; i < decide_planenum; i++)
			createq(&wtqf, &wtqr, TAKEOFF);
		// Landing 될 비행기와 Takeoff 될 비행기들의 정보를 출력
		puts("\n==========================");
		puts("Landing 될 비행기들의 정보");
		puts("==========================");
		for (t = wlqf; t; t = t->link)
			printf("Plane ID: %-3d Left fly time: %-3d Landing waiting time: %-3d\n", t->planeid, t->left_ft, t->landing_wt);
		puts("\n==========================");
		puts("Takeoff 될 비행기들의 정보");
		puts("==========================");
		for (t = wtqf; t; t = t->link)
			printf("Plane ID: %-3d Takeoff waiting time: %-3d\n", t->planeid, t->takeoff_wt);
		/* ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */		
		/* Takeoff 보다 Landing 이 더 중요하므로 Takeoff 부터 처리한다. (Takeoff 는 시간만 지연될 뿐, Landing 처럼 인명 피해가 일어나지는 않는다.) <- 왜냐하면, 단위 시간에 각 활주로는 Landing 또는 Takeoff 할 수 있다. */
		/* ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */		
		// 만약 Landing 될 비행기의 체공 시간이 0 이라면 Runway 2(tqf2) 에 비상 착륙 시킨다.
		if (wlqf && wlqf->left_ft == 0) {
			// Runway 2 에 비상 착륙 시킴
			addq(&tqf2, &tqr2, &wlqf, SPECIAL);
			// Landing 될 비행기 Queue 에서 삭제
			deleteq(&wlqf);
			// 이로써, Runway 2 는 현재 단위 시간에 사용되었다.
			usedrunway2 = 1;
		}
		// 한 번에 0 - 3 대씩 착륙하게끔 해준다.
		decide_planenum = rand() % 4;
		for (i = 0; i < decide_planenum; i++) {
			decide_runway = i;
			if (decide_runway == 0)
				decide_runway = rand() % 2;
			if (decide_runway == 2)
				decide_runway = rand() % 2 + 2;
			switch (decide_runway) {
				case 0: 
					if (wlqf && usedrunway0 == 0) {
						addq(&lqf0, &lqr0, &wlqf, LANDING);
						deleteq(&wlqf);
						usedrunway0 = 1;
					}
					break;
				case 1:
					if (wlqf && usedrunway0 == 0) {
						addq(&lqf1, &lqr1, &wlqf, LANDING);
						deleteq(&wlqf);
						usedrunway0 = 1;
					}
					break;
				case 2:
					if (wlqf && usedrunway1 == 0) {
						addq(&lqf2, &lqr2, &wlqf, LANDING);
						deleteq(&wlqf);
						usedrunway1 = 1;
					}
					break;
				case 3:
					if (wlqf && usedrunway1 == 0) {
						addq(&lqf3, &lqr3, &wlqf, LANDING);
						deleteq(&wlqf);
						usedrunway1 = 1;
					}
					break;
			}
		}
		// 한 번에 0 - 3 대씩 이륙하게끔 해준다.
		decide_planenum = rand() % 4;
		for (i = 0; i < decide_planenum; i++) {
			decide_runway = i ;
			switch (decide_runway) {
				case 0:
					if (wtqf && usedrunway0 == 0) {
						addq(&tqf0, &tqr0, &wtqf, TAKEOFF);
						deleteq(&wtqf);
						usedrunway0 = 1;
					}
					break;
				case 1: 
					if (wtqf && usedrunway1 == 0) {
						addq(&tqf1, &tqr1, &wtqf, TAKEOFF);
						deleteq(&wtqf);
						usedrunway1 = 1;
					}
					break;
				case 2:
					if (wtqf && usedrunway2 == 0) {
						addq(&tqf2, &tqr2, &wtqf, TAKEOFF);
						deleteq(&wtqf);
						usedrunway2 = 1;
					}
					break;
			}
		}
		// Landing 될 Queue 에 있는 비행기의 Left fly time 을 1 만큼 줄이고, Landing waiting time 을 1 만큼 증가시킨다.
		for (t = wlqf; t; t = t->link) {
			t->landing_wt++;
			t->left_ft--;
		}
		// Takeoff 될 Queue 에 있는 비행기의 Takeoff waiting time 을 1 만큼 증가시킨다.
		for (t = wtqf; t; t = t->link)
			t->takeoff_wt++;
		// 만약 체공 시간이 0 미만이라면 사고가 난 것임
		if (wlqf && wlqf->left_ft < 0) {
			puts("\n========================================================================");
			printf("ID 가 %d 인 비행기가 체공 시간이 다 되어서 추락하였습니다ㅠOㅠ;\n", wlqf->planeid);
			puts("========================================================================");
			deleteq(&wlqf);
			crashed++;
		}
		// Runway 0 의 Takeoff Queue 를 출력한다.
		puts("\n================================");
		puts("Runway 0 의 Takeoff Queue 내용");
		puts("================================");
		for (t = tqf0; t; t = t->link)
			printf("Plane ID: %-3d Takeoff waiting time: %-3d\n", t->planeid, t->takeoff_wt);
		// Runway 1 의 Takeoff Queue 를 출력한다.
		puts("\n================================");
		puts("Runway 1 의 Takeoff Queue 내용");
		puts("================================");
		for (t = tqf1; t; t = t->link)
			printf("Plane ID: %-3d Takeoff waiting time: %-3d\n", t->planeid, t->takeoff_wt);
		// Runway 2 의 Takeoff Queue 를 출력한다.
		puts("\n================================");
		puts("Runway 2 의 Takeoff Queue 내용");
		puts("================================");
		for (t = tqf2; t; t = t->link) {
			if ((t->planeid % 2) == 0)
				printf("Plane ID: %-3d Takeoff waiting time: %-3d\n", t->planeid, t->takeoff_wt);
			else
				printf("Plane ID: %-3d Left fly time: %-3d Landing waiting time: %-3d\n", t->planeid, t->left_ft, t->landing_wt);
		}
		// Runway 0 의 Landing Queue A 를 출력한다.
		puts("\n==================================");
		puts("Runway 0 의 Landing Queue A의 내용");
		puts("==================================");
		for (t = lqf0; t; t = t->link)
			printf("Plane ID: %-3d Left fly time: %-3d Landing waiting time: %-3d\n", t->planeid, t->left_ft, t->landing_wt);
		// Runway 0 의 Landing Queue B 를 출력한다.
		puts("\n==================================");
		puts("Runway 0 의 Landing Queue B의 내용");
		puts("==================================");
		for (t = lqf1; t; t = t->link)
			printf("Plane ID: %-3d Left fly time: %-3d Landing waiting time: %-3d\n", t->planeid, t->left_ft, t->landing_wt);
		// Runway 1 의 Landing Queue A 를 출력한다.
		puts("\n==================================");
		puts("Runway 1 의 Landing Queue A의 내용");
		puts("==================================");
		for (t = lqf2; t; t = t->link)
			printf("Plane ID: %-3d Left fly time: %-3d Landing waiting time: %-3d\n", t->planeid, t->left_ft, t->landing_wt);
		// Runway 1 의 Landing Queue B 를 출력한다.
		puts("\n==================================");
		puts("Runway 1 의 Landing Queue B의 내용");
		puts("==================================");
		for (t = lqf3; t; t = t->link)
			printf("Plane ID: %-3d Left fly time: %-3d Landing waiting time: %-3d\n", t->planeid, t->left_ft, t->landing_wt);
	}
	total_landing_time = 0;
	total_landing_plane_count = 0;
	for (t = lqf0; t; t = t->link) {
		total_landing_time += t->landing_wt;
		total_landing_plane_count++;
	}
	for (t = lqf1; t; t = t->link) {
		total_landing_time += t->landing_wt;
		total_landing_plane_count++;
	}
	for (t = lqf2; t; t = t->link) {
		total_landing_time += t->landing_wt;
		total_landing_plane_count++;
	}
	for (t = lqf3; t; t = t->link) {
		total_landing_time += t->landing_wt;
		total_landing_plane_count++;
	}
	total_takeoff_time = 0;
	total_takeoff_plane_count = 0;
	for (t = tqf0; t; t = t->link) {
		total_takeoff_time += t->takeoff_wt; 
		total_takeoff_plane_count++;
	}
	for (t = tqf1; t; t = t->link) {
		total_takeoff_time += t->takeoff_wt; 
		total_takeoff_plane_count++;
	}
	for (t = tqf2; t; t = t->link) {
		if ((t->planeid % 2) == 0) {
			total_takeoff_time += t->takeoff_wt; 
			total_takeoff_plane_count++;
		}
		else {
			total_landing_time += t->landing_wt;
			total_landing_plane_count++;
		}
	}
	puts("\n===================================================");
	printf("총 %d 대의 비행기가 착륙하였습니다.\n", total_landing_plane_count);
	printf("총 %d 대의 비행기가 이륙하였습니다.\n", total_takeoff_plane_count);
	printf("총 %d 대의 비행기가 추락하였습니다.\n\n", crashed);
	printf("평균 %.2f 단위 시간만에 착륙하였습니다.\n", (float)total_landing_time / total_landing_plane_count);
	printf("평균 %.2f 단위 시간만에 이륙하였습니다.\n", (float)total_takeoff_time / total_takeoff_plane_count);
	puts("===================================================");
	return 0;
}
void initq(queue **f, queue **r)
{
	*f = NULL;
	*r = NULL;
}
void createq(queue **f, queue **r, int flag)
{
	static int landing_id = 1;		// Landing 은 Odd number
	static int takeoff_id = 2;		// Takeoff 는 Even number
	queue *temp;
	// 메모리 할당을 실패할 경우에 Error Message 를 출력한 후 프로그램 종료
	if ((temp = (queue *)malloc(sizeof(queue))) == NULL) {
		fprintf(stderr, "Out ot memory! Can't create Queue!\n");
		exit(0);
	}
	// Landing 할 비행기라면 아래의 if 문 실행
	if (flag == LANDING) {
		temp->planeid = landing_id;				// 비행기 ID 저장
		temp->left_ft = rand() % EACH_TIME;		// 체공 가능 시간
		temp->landing_wt = 0;					// Landing waiting time 은 우선 0 으로 설정
		landing_id++;
		landing_id++;
	}
	// Takeoff 할 비행기라면 아래의 else-if 문 실행
	else if (flag == TAKEOFF) {
		temp->planeid = takeoff_id;			// 비행기 ID 저장
		temp->takeoff_wt = 0;				// Takeoff waiting time 은 우선 0 으로 설정
		
		takeoff_id++;
		takeoff_id++;
	}
	temp->link = NULL;
	if (*f)
		(*r)->link = temp;
	else
		*f = temp;
	*r = temp;
}
void deleteq(queue **f)
{
	queue *temp = *f;
	if (*f == NULL) {
		fprintf(stderr, "The queue is empty! Can't delete queue\n");
		exit(0);
	}
	*f = temp->link;
	
	free(temp);
}
void addq(queue **df, queue **dr, queue **sf, int flag)
{
	queue *temp;
	// 메모리 할당을 실패할 경우에 Error Message 를 출력한 후 프로그램 종료
	if ((temp = (queue *)malloc(sizeof(queue))) == NULL) {
		fprintf(stderr, "Out ot memory! Can't create Queue!\n");
		exit(0);
	}
	
	if (flag == LANDING) {
		temp->left_ft = (*sf)->left_ft;		
		temp->landing_wt = (*sf)->landing_wt;
	}
	else if (flag == TAKEOFF)
		temp->takeoff_wt = (*sf)->takeoff_wt;
	else if (flag == SPECIAL) {
		temp->left_ft = (*sf)->left_ft;		
		temp->landing_wt = (*sf)->landing_wt;
	}
	temp->planeid = (*sf)->planeid;
	temp->link = NULL;
	if (*df)
		(*dr)->link = temp;
	else
		*df = temp;
	*dr = temp;
}
Compile 해보면 아시겠지만, 경고가 20개이상이 뜨는데.
제가 보기에는 전혀 문제 없는 부분인데.. 경고가 뜨네요.
주로, for(t = lqf0; t; t = t->link) 이런 부분에서 나더군요.
구조체 포인터 t 와 lqf0 모두 같은 queue * 형 인데
왜 타입이 다르다는건지 이해가 가지 않아서요;
올바른 답변 부탁드립니다^-^;;;
Forums: 


[code:1]// Queue Structuretypedef stru
// Queue Structure typedef struct { int planeid; // plane's ID int landing_wt; // landing waiting time int left_ft; // left fly time int takeoff_wt; // takeoff waiting time struct queue *link; } queue;이 부분은 C 언어도 아니고 C++ 언어도 아니네요. 어느 언어로 짜셨나요? :(
[code:1]typedef struct _queue{
typedef struct _queue{ int planeid; // plane's ID int landing_wt; // landing waiting time int left_ft; // left fly time int takeoff_wt; // takeoff waiting time struct _queue *link; } queue;위와 같이 고치세요.
queue = struct _queue와 같습니다.
struct queue != queue
경고가 발생하는것 같네요.
참고로 typedef인 경우 queue_t와 같에 정의하는것도 괜찮습니다.
그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
음.. C언어 맞구요~ ㅎ_ㅎ;; (혹시 농담하신건가요? ;;;)
음.. C언어 맞구요~ ㅎ_ㅎ;; (혹시 농담하신건가요? ;;;)
typedef struct {
....
struct queue *link;
} queue;
라고 해주면 문제가 있는거군요.
그러고보니..
struct 구조체-TAG { ... } 선언자-리스트;
이런식으로 정의하는게 완전한 정의인걸로 아는데
맨 위의 정의에서는 구조체-TAG 가 없어서 문제가 되는것 같네요;
답변 주셔서 정말 감사합니다^0^
작은 것들, 사소한 것들을 소중히 여기고,
항상 최선을 다하는 멋진 사람이 되고 싶다.
그들이 나에게 일깨워준 것처럼,
그들 자신이 얼마나 소중한 존재인지 알 수 있도록
도와주는 그런 좋은 사람이 되고 싶다
댓글 달기