디시인사이드 갤러리

마이너 갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

[|] (수정) 아랫글 관련

lgsc갤로그로 이동합니다. 2024.05.14 02:11:03
조회 110 추천 2 댓글 1
														

(수정: 새벽에 글써서 그런지 오류가 많습니다 맨밑에 결론만 보시는것을 권장)


안녕하세요

일단 저도 다음과 같이 컴파일한 후 실행해봤는데


2eb2dd36ecde39b267b0d8fb06df231dc726fef4c4f27ca71139


28afc229f7ed2aa37eadd9b103d2303447bb064628df4801e63f2b208ce8f9cf6d

(1) 글에서 말씀하신 것처럼 맵상에 사선으로 점 찍히거나

(2) 블럭이 아래로는 잘 떨어지는데, 양옆으로 움직이면 사라진 후 얼마 뒤 게임이 꺼지거나

둘중 하나의 상황으로 되는 것 같습니다.


한편 질문하신글에 어떤분께서 댓글로 말씀하신부분이 저도 의심스러워서 나름 생각해봤는데요

(코드를 읽어보진 않았습니다 초보라 엄두가 안나네요 ㅈㅅ..)


예를 들어 맵상의 두번째 줄의 3번째 칸을 알고싶다고 하면, map[2][3] 이라고 해야 할텐데,

이것은 다음과 같다고 생각합니다: (수정: 2,3이 아니라 1,2이고, 세로길이가 아니라 가로길이여야 할 것 같네요)

== *(map[2] + 3)

== *(*(map + 2) + 3)

왜냐하면 a[i] == *(a + i) 니까...

근데 여기서 map에 2를 더한것과 map[2]에 3을 더한것과는 뭐랄까 이동되는 양(?)이 다를것같다고 생각합니다

왜냐하면 map의 타입은 char (*)[세로길이] 라서 map+2 하면 나오게 되는 주소는 &map[0][0] + (char * 세로길이 * 2) 일 것 같은데,

map[2] 는 char를 세로길이 만큼 들고있는 배열이니까,

배열명은 배열의 첫번째 원소를 가리키는 포인터로 사용될 수 있다는 점에 의해

map[2] == &map[2][0] 즉 char * 이기때문에 map[2]+3 하면 그 결과는 &map[2][0] + (char * 3) 일 것 같다고 생각합니다.


근데 애초에 이런 계산이 가능한 이유는 map이란게 아래와 같은 구조(?)를 가지고 있기 때문이 아닐까 싶은데요

(수정: map이 이차원배열인것과는 무관하게, a[i]의 정의(?)가 그렇게 되어 있기 때문이 아닐까 싶네요..)


3fb8c32fffd707f420b5c6b236ef203e4dae77dc5eec46

(출처: C Programming A Modern Approach, 2nd, 267페이지)


char map[MAP_LENGTH][MAP_WIDTH];

즉, 한줄의 길이가 map_width인 배열이 map_length개 만큼 붙어있으니까 그 안에서라면 (수정: 포인터 산술을 통한) 이동과 접근(?)이 자유로울 것 같다고 생각합니다.


근데, 현재 코드대로라면

char **map = malloc(MAP_LENGTH * sizeof(char *));
for (int i = 0; i < MAP_LENGTH; i++) {
map[i] = malloc(MAP_WIDTH);
memset(map[i], 0, MAP_WIDTH);
}

제가 이해한 바로는,

char * 형을 map_length 개만큼 수용할 수 있는 공간을 확보하고

각각의 char * 형 원소는 char 형이 map_width 개 만큼 들어가는 공간을 가리키게 된다는 느낌인데


뭐랄까 아래 사진같은 구조로 될거같다고 생각합니다.


3fb8c32fffd707f520b5c6b236ef203e2add6063dba442

(출처: 같은 책 301페이지)


근데 확실히 이대로라면 기존의 map[][] 과는 다를 것 같습니다 왜냐하면

이 구조에서 map[2][3] 을 하게되면 계산식은 아까와 동일할 것으로 생각하지만 실제로 계산되는 값은


*(*(map + 2) + 3)


map의 타입은 선언에 의해 char ** 이므로,

map+2 를 하게 되면 map + (sizeof(char **) * 2) 를 얻게 되지 않을까 추측합니다.

근데, 원하는 것은 map + (1 * 세로길이 * 2) 니까, 세로길이가 마침 char **의 크기와 같은 게 아니라면, 의도한 효과를 거둘 순 없으리라 생각합니다.

(나아가, *(map + 2) 를 해서 얻은 값은 (추측이지만) char * 로 취급되지 않을까 싶네요)

아무튼간에 부조리한 결과를 얻게될 것 같다고 생각합니다.


(수정: 새벽이라 피곤해가지고 생각을 다소 잘못된 방향으로 한거같은데 다시 보니까 이상하네요;;

map을 이차원배열이라고 가정한 상태에서 map의 주소를 char **형의 크기만큼씩 옮긴다고 생각해서 잘못된 결과를 얻을거라고 생각한 듯???

근데 이 가정이 틀린거같네요 지금은 char **map = malloc(len * sizeof(char *)); for(i) map[i] = malloc(width); 로 선언한 상태니까...

이 상태에서 map[2][3] 한다고 해도 잘못된 점은 전혀 없을 것 같다고 생각합니다.)



그래서 제가 하고싶은말:


map을 malloc으로 만들고싶으면


char (*map)[MAP_WIDTH];

map = malloc(MAP_LENGTH * MAP_WIDTH);
if (map == NULL) {
MessageBoxW(NULL, L"Failure of dynamic memory allocation.", L"Error", MB_OK);
return;
}
memset(map, 0, MAP_LENGTH * MAP_WIDTH);


이런식으로 해야될것같다고 (수정: 위처럼 하는 것이 하나의 방법이 될 수 있을 것 같다고) 생각합니다

map을 char (*)[] 으로 선언한 이유: 아래 사진의 밑부분에서 하라는 대로 함


3fb8c32fffd707f220b5c6b236ef203e180d46ef774188

(출처: 같은 책 269페이지)

이러면 map이 char을 map_width개 만큼 들고있는 배열을 가리키게 되므로 기존의 char map[][]과 같은느낌이라고 생각합니다.


컴파일하고 돌려본 결과 잘돌아가는듯??? 합니다 (메시지박스 함수썼기때문에 cl tetris.c user32.lib 으로 컴파일함)


29b8dd29abc236a14e81d2b628f17c6f7cad


감사합니다.

추천 비추천

2

고정닉 0

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 말머리 제목 글쓴이 작성일 조회 추천
2863 설문 시세차익 부러워 부동산 보는 눈 배우고 싶은 스타는? 운영자 24/05/27 - -
3018 공지 성의가 느껴지는 과제도움요청 글 예시 [4] 빅매치갤로그로 이동합니다. 20.11.23 2491 14
2421 공지 C언어 공부하기(강의&자료&도구) [10] entaro3000갤로그로 이동합니다. 20.10.13 16491 25
2420 공지 ※질문 올릴 거면 필독 [1] entaro3000갤로그로 이동합니다. 20.10.13 2811 9
1388 공지 SW 리버싱 툴 목록 [16] 리보띵갤로그로 이동합니다. 20.08.15 10236 31
6560 | 질문좀 남겨봅니다 C갤러(115.40) 05.28 13 0
6559 | 이게 어떻게 동작하는지 알려주실 수 있으신가요 [2] C갤러(115.40) 05.28 26 0
6558 | vs 작동이 안되는데 어캄? [1] C갤러(1.238) 05.26 31 0
6557 | c++ 코드 오류 질문 ㅇㅇ갤로그로 이동합니다. 05.24 51 0
6556 | 구조체 typedef로 바꿀 때도 대문자로 씀? [2] ㅇㅇ(211.36) 05.23 64 0
6555 | 백엔드쪽을 배워보고 싶은데 [3] ㅇㅇ갤로그로 이동합니다. 05.22 74 0
6554 | 도와줘 [3] ㅇㅇ갤로그로 이동합니다. 05.22 60 0
6553 | 나 과제좀 도와주라... C갤러(59.5) 05.19 48 0
6552 | (도움) 과제용 nCr(combination) 계산기인데 [1] C갤러(221.146) 05.19 77 0
6551 | 과제 ㅆㅂ ㅈㄴ 어렵다 C갤러(59.5) 05.19 55 0
6550 | AI딸깍이면 다되는 세상될텐데 c언어 배우는게 낫나? ㅇㅇ(118.235) 05.18 60 0
6549 | 뉴비 질문좀.. [5] C갤러(218.50) 05.15 105 0
6547 | (아랫글 계속) 댓글에서 언급된 다른 방법 lgsc갤로그로 이동합니다. 05.14 71 1
| (수정) 아랫글 관련 [1] lgsc갤로그로 이동합니다. 05.14 110 2
6545 | C린이 도움을 얻고 싶습니다... [8] C갤러(175.116) 05.13 178 0
6544 | 나랑 섹스하실분 성관계(49.169) 05.13 65 0
6543 | 도와주세요ㅠㅠ 맥 code bolcks 실행 오류 [1] C갤러(211.36) 05.13 43 0
6542 | 형님들 좀 도와주세요 [1] C갤러(175.203) 05.10 76 0
6541 | 코딩 꿀팁 모음 36개 (스압) [8] C갤러(58.127) 05.06 434 3
6540 정보 [호남권] 온라인 무료 부트캠프 백엔드+인공지능 참여자 모집 [1] [호남권](1.212) 05.03 72 0
6539 | 초보 위치지정 new 질문있음 [1] C갤러(221.144) 05.03 73 0
6538 | 허프만 부호화 도움 앙망 [1] C갤러(218.50) 04.30 73 0
6536 | 16진법 short타입 최댓값이 왜 0x7fff 임?? [2] ㅇㅇ(223.62) 04.24 151 0
6535 | 해킹 쪽으로 가고싶은데 [3] C갤러(49.161) 04.21 182 0
6534 | C언어 입문 도와주세요 ㅜ [8] C갤러(119.69) 04.21 284 0
6533 | 본인 어뜨캄? [5] C갤러(112.185) 04.21 105 0
6532 | c언어 강의 유튜브 추천좀 [3] C갤러(125.130) 04.21 119 0
6531 | 여기 분위기 너무 좋다 야마데갤로그로 이동합니다. 04.21 110 0
6530 | 이거 책 오타일까요? [2] C갤러(118.235) 04.18 136 0
6528 | ll2cpp dumper.gui 혹시 이게 뭔지 아시는 분 있나요?? [2] C갤러(180.81) 04.17 71 0
6527 | scanf는 형식지정자앞에 문자쓰면 오류나네 [4] ㅇㅇ갤로그로 이동합니다. 04.17 118 0
6526 | 안녕하세요 프로그래밍 소설 연재중인데 현실고증이 필요해서 부탁드립니다. [3] ㅇㅇ(123.248) 04.17 111 0
6525 | c언어 초보 for문 좀 도와주세요 [3] C갤러(106.101) 04.15 121 0
6524 | 형들 c언어 공부 방식에 대해서 질문좀 하고 싶어 [1] C갤러(125.184) 04.15 107 0
6523 | C언어 공부하려하는데 [1] C갤러(223.38) 04.12 130 0
6522 | 학교 과제도 물어봐도 될까 싶지만 한번 올려봄 [2] ㅇㅇ(211.217) 04.11 187 0
6521 | 여기가 코딩러들 모임임? [1] ㅇㅇ(117.111) 04.09 190 0
6520 | vscode에서 c언어 [1] C갤러(1.232) 04.08 119 0
6519 | 왜 안되냐고... [17] C갤러(222.236) 04.07 253 0
6518 | 늒네) printf 함수 문자열 입력할때 있잖아 [2] ㅇㅇ갤로그로 이동합니다. 04.06 126 0
6517 | 비주얼 스튜디오 버전 바꾸기 [5] ㅇㅇ갤로그로 이동합니다. 04.04 109 0
6516 | 선생님들 혹시 이거 왜 틀린건지 알려주실수 있나요..? [1] C갤러(125.133) 04.03 139 0
6515 | c# 이벤트로그 질문 ㅇㅇ(121.157) 04.03 42 0
6514 | c언어 스택 질문 [1] C갤러(118.40) 04.02 127 0
6513 | 멍청이좀 도와주세요 C갤러(121.157) 04.02 60 0
6509 | 형들 C언어 노베 공부해볼려고하는데 이중 어떤책으로 사는게 좋아? [2] C갤러(121.152) 04.01 182 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2