Written by coh at home

보물지도 찾기. 본문

languages/c

보물지도 찾기.

och 2022. 3. 31. 21:18

static library와 header file을 전달 받고 baseline 과 함수를 구현해서 

포인터로 보물지도에 담긴 값을 출력했습니다.

 

문제의 핵심은

1. void* 의 간접참조는 error를 발생시킨다는 것. 

왜냐하면 void pointer는 간접참조해도 타입을 알 수 없기 때문.

 

2.마찬가지로 char* 타입의 변수를 *(char*) 하면은 char형태이기 때문에 

원하는 만큼의 간접참조를 할 수 없었습니다. 따라서 이를 해결하는 것이 문제의 핵심이었습니다. 

 

이를 해결하기 위해 주소를 담을 변수 unsigned long long arrVar;를 선언했고

(64 bit CPU는 8byte의 주소길이를 갖기 때문.) 

arrVar = *arrVar 를 필요한 횟수만큼 loop를 돌았습니다. 

 

base case인 depth = 0을 미리 해결하였습니다.

#include<stdio.h>
#include"inc/treasureMap.h"

void* FindingTreasure(void* map, int depth) {
	unsigned long long* arrVar;
	arrVar = map;
	if (depth == 0)
		return map;
	for (int i = 0; i < depth; i++)
	{
		arrVar = *arrVar;
		if (i == depth-1) {
			map = arrVar;
			return map;
		}
	}
}

void main(void)
{
	void* map[MAX_SIZE] = { 0 };
	int hints[MAX_SIZE] = { 0 };
	int treasureSize = getMap(map, hints);

	for (int i = 0; i < treasureSize; i++)
	{
		printf("%c", *((char*)FindingTreasure(map[i], hints[i])));
	}

	printf("\n");
}

이를 다 돌리면 

교수님이 숨겨놓은 보물지도 글씨...를 찾을 수 있습니다. 

처음에 loop 길이를 잘못 설정해서 Access violation error가 떴던 기억이.. 

'languages > c' 카테고리의 다른 글

c언어 data filter 만들기  (0) 2022.03.29
동적메모리 예제  (0) 2022.03.25
동적메모리  (0) 2022.03.24
정적 메모리 예제  (0) 2022.03.24
.c file I/O studentDB.bin  (0) 2022.03.23