inflearn logo
강의

講義

知識共有

ホン・ジョンモのついていきながら学ぶC言語(付録)

17.12 配列による円形キューの実装

17.12) access violation

307

rea0001

投稿した質問数 1

0

#pragma once

#include <stdbool.h>

#define TSIZE 45
#define MAX_SIZE 4 // array size

typedef struct element
{
	char name[TSIZE];
} Item;

typedef struct queue
{
	int front;
	int rear;
	int n_items;
	Item items[MAX_SIZE];
} Queue;

void Init_queue(Queue* pq);
bool QueueIsFull(const Queue* pq);
bool QueueIsEmpty(const Queue* pq);
int QueueItemCount(const Queue* pq);
bool Enqueue(Item item, Queue* pq);
bool Dequeue(Item* pitem, Queue* pq);
void EmptyQueue(Queue* pq);
void TraverseQueue(Queue* pq);

void print_item(Item item);

 

#include "ArrayQueue.h"

#include <stdio.h>

#include <assert.h>

void Init_queue(Queue* pq)

{

	pq->front = 0;

	pq->rear = 0;

	pq->n_items = 0;

}

bool QueueIsFull(const Queue* pq)

{

	return (pq->rear + 1) % MAX_SIZE == pq->front;

}

bool QueueIsEmpty(const Queue* pq)

{

	return pq->front == pq->rear;

}

int QueueItemCount(const Queue* pq)

{

	return pq->n_items;

}

bool Enqueue(Item item, Queue* pq)

{

	if (QueueIsFull(pq))

	{

		printf("Queue is Full.\n");

		return false;

	}

	pq->rear = (pq->rear + 1) % MAX_SIZE;

	pq->items[pq->rear] = item;

	pq->n_items++;

	return true;

}

bool Dequeue(Item* pitem, Queue* pq)

{

	if (QueueIsEmpty(pq))

	{

		printf("Queue is Empty.\n");

		return false;

	}

	pq->front = (pq->front + 1) % MAX_SIZE;

	*pitem = pq->items[pq->front];

	pq->n_items--;

	return true;

}

void EmptyQueue(Queue* pq)

{

	Init_queue(pq);

}

void TraverseQueue(Queue* pq)

{

	for (int i = pq->front; i != pq->rear; i = (i + 1) % MAX_SIZE)

		print_item(pq->items[(i + 1) % MAX_SIZE]);

}

void print_item(Item item)

{

	printf('%s ', item.name);

}

 

 

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

#include "ArrayQueue.h"

Item get_item(const char* name);
void print_queue(Queue* pq);


int main()
{
	Queue queue;
	Item temp;

	Init_queue(&queue);

	Enqueue(get_item("Jack"), &queue);
	print_queue(&queue);

	Enqueue(get_item("Henry"), &queue);
	print_queue(&queue);

	Enqueue(get_item("Stan"), &queue);
	print_queue(&queue);

	Enqueue(get_item("Butters"), &queue); // capacity 4/3 fail
	print_queue(&queue);

	if (Dequeue(&temp, &queue))
		printf("Item from queue : %s\n", temp.name);
	print_queue(&queue);

	if (Dequeue(&temp, &queue))
		printf("Item from queue : %s\n", temp.name);
	print_queue(&queue);

	if (Dequeue(&temp, &queue))
		printf("Item from queue : %s\n", temp.name);
	print_queue(&queue);

	if (Dequeue(&temp, &queue))
		printf("Item from queue : %s\n", temp.name);
	print_queue(&queue);

	printf("====== Circulation Test ======");

	Init_queue(&queue);

	for (int i = 0; i < 10; ++i)
	{
		Enqueue(get_item("Hello"), &queue);
		print_queue(&queue);

		if (Dequeue(&temp, &queue))
			printf("Item from queue : %s\n", temp.name);

		print_queue(&queue);
	}

	return 0;
}

Item get_item(char* name)
{
	Item new_item;
	strcpy(new_item.name, name);

	return new_item;
}

void print_queue(Queue* pq)
{
	printf("Front : %d, Rear : %d, Size %d\n", pq->front, pq->rear, pq->n_items);

	printf("Queue : ");

	if (QueueIsEmpty(pq))
		printf("Empty");
	else
		TraverseQueue(pq);

	printf("\n\n");
}

 

순서대로 헤더, 헤더함수파일, 메인파일 입니다

 

디버깅시,

TraverseQueue함수 내의 print_item 함수가 실행되는 순간 access violation이 뜹니다

access violation 전까지는 값들 제대로 다 연산이 되다가

갑자기 print함수에서 저러니까 도저히 감이 안잡힙니다

방법이 없어 도움을 구합니다

 

 

 

 

 

 

 

 

 

 

c

回答 1

0

kangminchul

혹시 아래의 오류인가요?

image

 

 

관련 오류들을 검색해보니 해당 오류는 버퍼의 크기를 잘못 지정하거나

잘못된 주소를 참조하여 발생하는 오류인 것으로 보입니다.

https://m.blog.naver.com/dao8500/222112397866

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=onnelim7791&logNo=221550696178

 

TraverseQueue를

void TraverseQueue(Queue* pq) 로 customize하신 것으로 보이는데,

 

해당 코드의 주소에서 잘못된 주소 참조가 있는지 확인해보시거나

강의 내의 코드인

void TraverseQueue(Queue* pq, void (* func) (Item item)

형태로 맞춰보시겠어요?

안녕하세요. 계속 프로젝트를 해야지 하다가 결제하고 환경 설정 중입니다.

0

14

1

Export template 안됨

1

26

2

scanf("%d\n") 의미

0

20

1

필기자료 사라졌나요?(실기 일주일만에 안돼서 재도전-_-)

0

37

2

26년 1회 실기 해설 강의

0

51

2

주소 연산자(&) 간접 지정자(*) 반대 개념

0

33

1

이진 탐색: 탐색 실패하는 경우 어째서 first > last인 경우가 나오나요?

0

324

1

finditembyindex 질문드립니다!

0

348

1

19:20 부분에서 질문있습니다.

0

278

1

pnode = pnode->next; 와 pnode->next = pnode;는 같은 것으로 생각해도 될까요?

0

401

2

질문. warning뜨는 이유

0

301

1

링크드 리스트 질문 드립니다.

0

216

1

함수포인터 질문드립니다

0

224

1

강의 내용 질문 드립니다!

0

369

2

노드 주소 순서 관련 질문

0

282

1

질문드립니다!

0

242

1

DeleteAllNodes 에서 질문있습니다.

0

375

5

16:30 질문입니다.

0

343

4

scanf 질문이요!!

0

253

1

12:30 의 ArrayQueue.h

0

292

2

10:10 Add front에서 질문드립니다.

1

362

1

스택 자료구조

0

246

1

변수 count의 활용에 대해 질문이 있습니다.

0

320

1

1번 실행하면 에러가 뜨는데 이유를 모르겠습니다..

0

371

2