디시인사이드 갤러리

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

갤러리 본문 영역

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

lgsc갤로그로 이동합니다. 2024.05.14 02:11:03
조회 125 추천 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
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 말머리 제목 글쓴이 작성일 조회 추천
2872 설문 연예인 안됐으면 어쩔 뻔, 누가 봐도 천상 연예인은? 운영자 24/06/17 - -
3018 공지 성의가 느껴지는 과제도움요청 글 예시 [4] 빅매치갤로그로 이동합니다. 20.11.23 2512 14
2421 공지 C언어 공부하기(강의&자료&도구) [10] entaro3000갤로그로 이동합니다. 20.10.13 16780 25
2420 공지 ※질문 올릴 거면 필독 [1] entaro3000갤로그로 이동합니다. 20.10.13 2822 9
1388 공지 SW 리버싱 툴 목록 [16] 리보띵갤로그로 이동합니다. 20.08.15 10345 31
6579 | 임베디드 관련업종 게이들아 좆됐다 C갤러(221.140) 06.17 77 0
6578 | 컴공 2학기 복학인데 ㅇㅇ(58.229) 06.17 37 0
6577 | 파일 입출력 수정 어케 하나요... [4] ㅇㅇ(117.111) 06.17 60 0
6576 | 원서로 공부하는거 어떠냐 ㅇㅇ갤로그로 이동합니다. 06.16 32 0
6575 | 여기 평균연령 몇이냐? [2] ㅇㅇ(106.101) 06.16 60 0
6574 | 응애가 만들다가 만 콘솔 체스게임 [1] C갤러(59.14) 06.15 61 0
6573 | 영어 공부 뭘로 할까요 [3] ㅇㅇ(115.23) 06.15 62 0
6572 | KNK는 이제 구식임?? [1] ㅇㅇ(211.234) 06.14 54 0
6571 | c언어 공부하는데 질문있습니다 [1] C갤러(118.235) 06.13 94 0
6570 | 포인터에 배열명 이렇게 쓸 수 있음? [3] ㅇㅇ갤로그로 이동합니다. 06.12 99 0
6569 | 리버싱 입문 [1] C갤러(49.161) 06.12 51 0
6568 | 혹시 리버싱 잘하는분있으실까요? [4] C갤러(122.43) 06.09 107 0
6567 | c언어 코드 작성 관련 질문.. [1] C갤러(125.184) 06.08 74 0
6565 | 콘솔 특정 좌표의 글자 유무를 뱉는 함수 있음?? [2] C갤러(219.255) 06.07 74 0
6564 | ps아카이브....jpg ㅇㅇ(106.102) 06.06 55 0
6563 | csapp공부중인데 질문좀 C갤러(121.167) 06.05 47 0
6562 | 정적 함수라는건 무슨뜻임?? [4] ㅇㅇ갤로그로 이동합니다. 06.05 108 0
6561 | C++ 영어 자료 [3] ㅇㅇ갤로그로 이동합니다. 06.02 100 0
6560 | 질문좀 남겨봅니다 [1] C갤러(115.40) 05.28 70 0
6559 | 이게 어떻게 동작하는지 알려주실 수 있으신가요 [2] C갤러(115.40) 05.28 78 0
6558 | vs 작동이 안되는데 어캄? [1] C갤러(1.238) 05.26 57 0
6557 | c++ 코드 오류 질문 ㅇㅇ갤로그로 이동합니다. 05.24 88 0
6556 | 구조체 typedef로 바꿀 때도 대문자로 씀? [2] ㅇㅇ(211.36) 05.23 99 0
6555 | 백엔드쪽을 배워보고 싶은데 [3] ㅇㅇ갤로그로 이동합니다. 05.22 128 0
6554 | 도와줘 [3] ㅇㅇ갤로그로 이동합니다. 05.22 77 0
6553 | 나 과제좀 도와주라... C갤러(59.5) 05.19 68 0
6552 | (도움) 과제용 nCr(combination) 계산기인데 [1] C갤러(221.146) 05.19 109 0
6551 | 과제 ㅆㅂ ㅈㄴ 어렵다 C갤러(59.5) 05.19 86 0
6550 | AI딸깍이면 다되는 세상될텐데 c언어 배우는게 낫나? ㅇㅇ(118.235) 05.18 90 0
6549 | 뉴비 질문좀.. [5] C갤러(218.50) 05.15 122 0
6547 | (아랫글 계속) 댓글에서 언급된 다른 방법 lgsc갤로그로 이동합니다. 05.14 75 1
| (수정) 아랫글 관련 [1] lgsc갤로그로 이동합니다. 05.14 125 2
6545 | C린이 도움을 얻고 싶습니다... [8] C갤러(175.116) 05.13 232 0
6544 | 나랑 섹스하실분 성관계(49.169) 05.13 95 0
6543 | 도와주세요ㅠㅠ 맥 code bolcks 실행 오류 [1] C갤러(211.36) 05.13 50 0
6542 | 형님들 좀 도와주세요 [1] C갤러(175.203) 05.10 78 0
6541 | 코딩 꿀팁 모음 36개 (스압) [8] C갤러(58.127) 05.06 483 3
6540 정보 [호남권] 온라인 무료 부트캠프 백엔드+인공지능 참여자 모집 [1] [호남권](1.212) 05.03 79 0
6539 | 초보 위치지정 new 질문있음 [1] C갤러(221.144) 05.03 74 0
6538 | 허프만 부호화 도움 앙망 [1] C갤러(218.50) 04.30 77 0
6536 | 16진법 short타입 최댓값이 왜 0x7fff 임?? [2] ㅇㅇ(223.62) 04.24 161 0
6535 | 해킹 쪽으로 가고싶은데 [3] C갤러(49.161) 04.21 202 0
6534 | C언어 입문 도와주세요 ㅜ [8] C갤러(119.69) 04.21 329 0
6533 | 본인 어뜨캄? [5] C갤러(112.185) 04.21 112 0
6532 | c언어 강의 유튜브 추천좀 [3] C갤러(125.130) 04.21 133 0
6531 | 여기 분위기 너무 좋다 야마데갤로그로 이동합니다. 04.21 120 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2