반응형

전체 글 45

17) 함수 포인터

프로세스 메모리 영역에 저장되는 명령 C언어로 작성한 소스 코드가 컴파일러에 의해 기계어로 번역되면 실행 파일이 된다. 이 실행 파일은 CPU가 처리할 수 있는 '기계어 명령문' 단위로 이루어진다. 그리고 해당 프로그램이 실행되어 프로세스 형태로 메모리에 저장되면 프로그램의 명령문들은 코드 세그먼트에 옮겨진다. 프로세스 구성 기계어 명령문 문자열 상수 목록 동적 메모리 할당 (Heap) 전역변수 (0으로 초기화) static 전역 변수 (초기화 안됨) 저역변수 (Stack) 코드 세그먼트 데이터 세그먼트 스택 세그먼트 결국 이 말은 명령문들도 메모리에 저장되어 있기 때문에 각 명령문마다 주소를 갖는다는 뜻이다. 메모리의 주소 값을 알고 있다면 당연히 포인터를 사용할 수 있을 것이다. 포인터 개념을 사용하..

C언어 2022.02.03

1월 13일 라케시스의 연구일지

두 번째 메인 이벤트인 라케시스의 연구 일지입니다 저번에 시공간여행을 통해 얻게되는 시간의 모래와 찬란한 시간의 모래를 사용할 수 있는 이벤트입니다. 이벤트 던전을 돌 수 있도록 해주는 시공간 분광기를 비롯하여 매일 매주 존재하는 퀘스트를 달성함으로써 이벤트 보상을 획득 할 수 있으며 시간의 모래는 에픽 장비 변환을 찬란한 시간의 모래는 신화장비 변환을 가능하게 해주는 재료들입니다. 또한 연구 일지의 단계를 높임으로써 최종적으로 신화 초월의 돌을 획득할 수 있습니다. 이벤트 기간이 매우 기니, 여러 캐릭터를 에픽파밍이 가능하게 해주는 좋은 이벤트 인것 같습니다. 확실히 연구일지와 시공간여행을 통해 다음 만렙이 풀리고 시즌이 초기화되는 날이 머지 않았다는걸 느끼네요 지금 유입되는 신규유저들이 세기 말인 지..

1월 13일 시공간 여행 시스템

새해를 맞이하는 큰 이벤트가 등장했습니다. 1월 13일부터 3월 17일까지 아주 오랜 기간동안 지속되는 이벤트인데요 작년 던파 페스티벌에서 말했듯이 3월 17일에는 만렙 확장과 신규 장비 등장으로 대격변이 예고되어 있습니다. 하지만 3월 전까지는 사람들이 말하듯 산맥과 시로코 오즈마만 뺑뻉이 돌리는 이른 바 '세기말'이기 때문에 즐길거리가 마땅치 않은 상황입니다. 그렇기에 이번에 신캐릭이 등장하면서 신규유저들이 들어왔을때 최대한 유저들을 시로코와 오즈마레이드까지 빠르게 진입시키고자 이런 유사 에픽로드 이벤트를 열어준 것 같습니다. 이벤트 참여방법은 간단하게 헨돈마이어 광장에 위치한 NPC의 퀘스트를 완료한 후 들어갈 수 있으나 플레이 시마다 '시공간 분광기'라는 아이템을 필요로 하는데 이 '시공간 분광기..

16-2)바이너리 파일에 데이터 읽고 쓰기

문자열 속성과 바이너리 속성의 차이점 문자열 속성은 문자열에 포함된 NULL 문자 0을 찾아서 데이터 크기를 체크하기 때문에 문자열 길이를 추가로 적을 필요가 없다. 예를 들어 "abc" 문자열이 있으면 a, b, c 다음에 NULL 문자인 0이 있으므로 문자열을 체크하여 데이터 크기가 3이라는 것을 알 수 있다. 하지만 바이너리 속성은 데이터를 그냥 숫자로만 판단하기 때문에 표준 입출력 함수가 데이터를 분석해서 길이나 크기를 알아낼 수 없다. 따라서 바이너리 속성으로 데이터를 읽거나 쓰려면 반드시 프로그래머가 직접 크기를 적어주어야 한다. 이런 특성은 바이너르 속성을 사용하는 바이너리 파일에서도 마찬가지로 적용된다. 따라서 바이너리와 관련된 파일 입출력 함수는 대부분 데이터 크기를 적도록 되어 있다. ..

C언어 2022.01.08

16-1) 파일 열기와 닫기

파일 입출력 함수의 도우미! FILE 구조체 이제 본격적으로 표준 입출력 라이브러리를 사용하여 파일에 데이터를 저장하거나 읽는 방법에 대해 설명하겠다. 표준 입출력 라이브러리는 FILE 구조체로 포인터 변수를 선언하고 파일 입출력 함수를 호출할 때마다 이 변수를 넘겨주도록 만들어져 있다. FILE 구조체는 사용하려는 디스크상의 파일이 어떤 상태로 사용중인지에 대한 정보를 담고 있으며, 파일을 좀 더 편하게 사용할 수 있도록 도와준다. File *p_file; /* 파일 열기 생략함 */ fseek(p_file, 0, SEEK_SET); FILE 구조체의 기본형은 'FILE *변수 이름' 형태이다. 이렇게 'FILE 구조체로 선언한 포인터 변수'를 줄여서 '파일 포인터' 라고 부른다. 위와 같은 방법으로 ..

C언어 2021.12.30

16)파일 입출력

표준 입출력 라이브러리는 데이터의 형식에 따라 다른 함수를 제공한다. 프로그램이 사용하는 데이터 형식은 '텍스트(문자열)'와 '바이너리(이진)'로 나누어지는데, 자신이 다루는 데이터가 텍스트 형식이면 텍스트 관련 함수를 사용해야 하고 바이너리 형식이면 바이너리 관련함수를 사용해야 한다. 그래서 자신이 사용할 데이터가 어떤 형식의 데이터인지 구별할 줄 알아야 한다. 바이너리 속성과 문자열 속성 프로그램이 사용하는 데이터 속성은 크게 두 가지로 나눌 수 있다. 데이터에 다른 의미를 부여하지 않고 숫자 그 자체로 보는 바이너리 속성과 숫자를 아스키 값으로 변환해서 사용하는 문자열 속성이다. 예를 들어 97이라는 데이터를 단순히 숫자 97이 들어있는 1바이트 크기의 정보라고 처리하는 것이 바이너리 속성이고, 아..

C언어 2021.11.15

15-3) 구조체를 활용한 연결 리스트

사용자에게 묻지 않고 프로그램이 알아서 동적 메모리 할당하기 동적 할당을 사용하면 데이터를 저장할 크기를 프로그램이 실행되는 중에 입력받아 변경할 수 있다. 따라서 컴파일 시점에 메모리 크기를 결정하기 때문에 실행 중에 메모리 크기를 변경할 수 없는 정적 할당보다 장점이 많다고 설명했다. 하지만 동적 할당도 사용자에게 입력받아서 합산하는 '더하기 프로그램'을 만든다고 생각해보자. 이 프로그램은 시작하면서 사용자에게 숫자를 몇 개 사용할 것인지 입력 받고, 그 개수만큼 동적으로 메모리를 할당한다. 그러면 사용자 입장에서는 입력한 개수만큼만 더하기 작업을 할 수 있기 때문에 불편하다. 사용자에게 가장 편한 방법은 몇 개의 숫자를 사용할 것인지 일일이 묻지 않고 사용자가 입력하는 대로 알아서 다 저장하고 합산..

C언어 2021.10.15

15-2)구조체로 만든 자료형의 크기

구조체 멤버 정렬 기준 과거에는 컴퓨터 시스템의 메모리 용량이 적어서 프로그래머들은 메모리를 최대한 적게 사용하도록 프로그램을 개발해야 했다. 최근에는 컴퓨터 시스템의 메모리 용량이 점차 늘어나면서 메모리를 조금 더 사용하더라도 프로그램의 실행 속도가 향상되도록 프로그램을 개발하고 있다. 그런데 구조체의 경우에는 다양한 크기의 메모리를 하나의 그룹으로 묶어 사용하다 보니 구조체 요소를 사용할 때 실행 속도가 떨어지는 문제가 있다. 그래서 구조체의 요소를 일정한 크기로 정렬하여 실행 속도를 더 빠르게 하는 개념이 C언어 컴파일러에 추가되었다. 컴파일러마다 용어의 차이는 있지만 마이크로소프트에서 제공하는 C컴파일러의 경우에는 '구조체 멤버 정렬' 기능을 제공하며 1, 2, 4, 8바이트로 정렬 기준을 설정할..

C언어 2021.10.05

15-1) 배열과 구조체

구조체를 사용하는 것이 왜 좋은지 이해하려면 같은 프로그램을 배열과 구조체로 각각 만들어 비교해 보는 것이 가장 좋은 방법이다. 이렇게 하면 데이터를 어떻게 그룹으로 묶는 것이 더 좋은지 판단할 수 있는 기준이 생긴다. 친구 정보 관리 프로그램의 기능 이 프로그램은 다음처럼 각 기능을 담당할 함수를 만들어서 사용했다. 1. 작업메뉴 : main 함수에서 처리 사용자가 프로그램에서 제공하는 기능을 선택할 수 있도록 메뉴를 출력해 주는 작업을 한다. 프로그램 종료기능은 반복문을 빠져나오는 행위로 끝나기 때문에 개별 기능으로 처리하지 않는다. 2. 친구 추가하기 : AddFriend 함수에서 처리 scanf 표준 입력 함수를 사용하여 한 번에 1명씩 최대 5명까지 입력 받는다 5명을 다 받으면 더 이상 입력 ..

C언어 2021.09.27

15) 데이터를 그룹으로 묶는 구조체

비슷한 형태의 데이터를 관리하려면? 사람 5명의 나이, 키 그리고 몸무게를 관리하는 프로그램을 만든다고 생각해 보자. 다음과 같이 5명의 나이, 키, 몸무게를 별도의 변수로 선언하면 5 x 3 = 15개의 변수가 필요하다. int age1, age2, age3, age4, age5; /*5명의 나이를 저장할 변수*/ float height1, height2, height3, height4, height5; /*5명의 키를 저장할 변수*/ float weight1, weight2, weight3, weight4, weight5; /*5명의 몸무게를 저장할 변수*/ 그리고 5명의 나이, 키, 몸무게를 사용자에게 입력 받으려면 변수마다 각각 하나씩 입력 받아야 하기 때문에 다음과 같은 작업을 해야 한다. sc..

C언어 2021.09.06
반응형