프로그래밍/C++2018. 3. 27. 01:53

http://itguru.tistory.com/129


c에 대한 설명이지만 어떤 언어든 적용될 만한 내용이다.

Posted by JinFluenza
프로그래밍/C++2018. 3. 14. 18:11


꼼수다.

http://blog.dasomoli.org/220/

Posted by JinFluenza
프로그래밍/C++2016. 9. 3. 18:03

STL의 컨테이너는 처음할당한 메모리 크기보다 데이터가 많아질경우.

메모리를 재할당 하는 작업을 한다.

원래 갖고있던 메모리의 데이터를 새 메모리(크기가 더  큰)에 복사하는 방식으로 재할당을 한다고 한다.

원래 메모리의 용량을 늘리는것이 아닌. 더큰 메모리를 만들어서 그곳에 복사 하고 이전 데이터를 삭제하는 식이다.

이것은  속도상 효율적이지 않다.

그래서 reserve함수를 사용하게 되는데. 이 함수를 사용하면. 메모리 초기값을 잡아놓고 하는것이기 때문에

필요없는 재할당을 최소화 시켜준다.


resize함수는. 내부용량을 딱 정해놓고 사용하는 것이다.

만약에 사이즈를 10으로 해놨을 경우. 무조건 사이즈는 10이된다.

10보다 큰 데이터가 들어오면 끝의 요소들은 버려지게 된다.

내부를 10개보다 적게 채워도 사이즈는 10으로 유지하게 된다.


Posted by JinFluenza
프로그래밍/C++2016. 9. 1. 01:25

오늘 UI에서 버튼만드는 것을 했는데. 예전에 windows api공부할때 썻던 함수포인터가 생각나서 다시 복습해봤다.

개념은 아주 간단하다. 버튼을 예로 들자면

버튼 클래스에 함수를 담을수 있는 변수를 만들어놓고, 그곳에 원하는 함수를 저장한 다음에 해당 버튼이 클릭됬을때

해당 버튼에 저장된 함수를 실행하는 방식이다.


#include <iostream>

using namespace std;

 

 //이부분은 가독성을 위해. 의미는 반환형 void,인자로 void를 받는 함수를 저장할수있는 함수포인터를 만드는것 이다.

typedef void(*CallBackFunc)(void); 

 


void SoundUp() { cout << "SoundUp" << endl; } //소리를 키워주는 함수

void SaveData() { cout << "SaveData" << endl; } //데이터를 저장해주는 함수

void ExitGame() { cout << "ExitGame" << endl; } //게임을 종료하는 함수.


struct Button                                               //버튼 구조체.

{

CallBackFunc ButtonFunc;    //아까 typedef로 선언해둔것을 사용한다. 반환형 void 인자로 void를 받는 함수를 저장할수있는 함수 포인터 변수 선언

void ClickButton()

{

ButtonFunc();

}

};


void main()

{

Button temp;

temp.ButtonFunc = SoundUp; //함수 포인터에 SoundUp함수 저장.

temp.ClickButton();


temp.ButtonFunc = SaveData; //함수 포인터에 SaveData함수 저장.

temp.ClickButton();


temp.ButtonFunc = ExitGame; //함수 포인터에 ExitGame함수 저장.

temp.ClickButton();

}


출력결과

SoundUp

SaveData

ExitGame

Posted by JinFluenza
프로그래밍/C++2016. 8. 11. 23:53

파일 입출력을 할때는 스트림 파일이라는 표준화된 형태를 만들어서 입출력을 수행하게 된다.

스트림만들어서 사용하는 이유는 1.여러 입출력 장치들이 있기때문에 표준적인 방법을 만든다는 것과.

                                           2.프로그램에서 데이터를 처리하는 속도,입출력장치에서의 속도의 차이가 있는데 이것을 조정하기 위해서 라고 한다.



우선 파일을 읽기 위해서는 스트림 파일을 만들어야 한다.

스트림 파일을 만들기 위해서는 fopen함수를 사용하면 된다. 


FILE* fp;                             //파일구조체 포인터를 하나 만듦

fopen_s(&fp, "Map.obj", "r");  //파일구조체 포인터 fp에 Map.obj(임시파일 이름)의 내용을 집어넣는다. 맨뒤에 "r"은 읽기모드를 뜻한다. (쓰기모드도 있다.)



이렇게 하면 파일구조체 fp에 텍스트 파일의 정보가 저장된다.  그리고 fopen함수 호출 후 파일을 읽지 못했을 경우에 fp에는 NULL이 들어가게 된다.

이를 통해서 파일 읽기를 성공했는지 실패했는지 판별 할 수 있다.

사용이 끝난 파일은 fclose함수를 이용해 스트림파일을 제거한다. (안정성을 위해서..)


fclose(fp);


파일 개방이 끝나면 이제 해당파일을 이용해 입출력을 하면 된다.

문자를 가져오는 함수들 :

int fgetc(FILE* ); 는 파일에서 하나의 문자를 가져온다.

예를들어 Game.txt 라는 텍스트 파일이 있고 텍스트 파일 안에는 Shooting 이라고 적혀있다. 여기서 문자를 읽으려면 다음과 같이 하면 된다.


FILE* fp;

char buff;

fopen_s(&fp, "Game.txt", "r");  //읽기모드

if(fp==NULL)   //정상적으로 파일을 읽었는지 검사

{

cout<<"파일 개방 실패"<<endl;

return ;

}


buff = fgetc(fp);

cout<<buff<<endl;


fclose(fp); 


이렇게 하면 S가 정상적으로 출력된다.

한번 fgets함수를 호출하고 그 이후에 호출되는 fgets함수는 버퍼에 데이터가 없을때까지 읽게된다. 따라서

buff = fgetc(fp);

cout<<buff<<endl; 를 한번 더 호출하면 S다음글자인 h가 호출 될 것이다.

그리고 버퍼의 끝에 도달하면 fgetc함수는 -1을 리턴한다 (EOF) 이를통해 다음과 같이 전문을 출력할 수 있다.


while(1)

{

buff = fgetc(fp);

cout << buff << endl;

if (buff == EOF)break;

}


fgetc 함수가 문자를 문자단위로 입력받는 함수라면

fgets함수는 문자를 줄 단위로 입력받는 함수이다.

FILE* fp; 

 char buff[10]; 

open_s(&fp, "Game.txt", "r"); //읽기모드

 if (fp == NULL) //정상적으로 파일을 읽었는지 검사 

 {

 cout << "파일 개방 실패" << endl; return;

 } 


 fgets(buff, sizeof(buff), fp); 

 cout << buff << endl;


이런식으로 사용하면 한줄의 내용인 Shooting이 출력된다.

마찬가지로 한번 더 호출하면 두번째 줄의 내용이 출력될 것이다.


이함수들과 더불어 문자열 자르는 함수나(strtok)

sscanf_s같은 함수를 이용하면 buff에 들어있는 원하는 방법으로 활용 할 수 있게된다.

간단한 예를 들자면

character.txt라는 파일이 있다. 내용은

HP 30

MP 50


여기서 HP값 30과 MP값 50를 int 값으로 얻어 오려면  다음과 같이 하면 될 것이다.



FILE* fp;


char buff[10];

int Hp;

int Mp;


fopen_s(&fp, "character.txt", "r");  //읽기모드


if (fp == NULL)   //정상적으로 파일을 읽었는지 검사

{

cout << "파일 개방 실패" << endl;


return;

}

while (!feof(fp)) //한줄씩 읽어내려감

{

fgets(buff, sizeof(buff), fp);

char* Data;


if(buff[0]=='H'&&buff[1]=='P')

{

Data = strtok(buff, " ");


while (Data = strtok(NULL, " "))

{

Hp = atoi(Data);

}


}


if (buff[0] == 'M'&&buff[1] == 'P')

{

Data = strtok(buff, " ");

while (Data = strtok(NULL, " "))

{

Mp = atoi(Data);

}


}



}


cout << Hp << endl;

cout << Mp << endl;





'프로그래밍 > C++' 카테고리의 다른 글

벡터에서 reserve와 resize를 하는 이유  (0) 2016.09.03
함수포인터 활용  (0) 2016.09.01
벡터 clear  (0) 2016.07.13
프로그램 진행시간 측정 하는법.  (0) 2016.04.02
벡터에서 erase사용시 주의할것.  (0) 2016.03.30
Posted by JinFluenza
프로그래밍/C++2016. 7. 13. 03:15

벡터 clear..


게임 시작부터 끝까지 사용되는 벡터의경우 내부 초기화를 위해서 clear함수를 사용해왔는데

이것이 벡터내부를 비워줄지는 몰라도 메모리를 해제해주는것은 아니라고한다.

메모리를 깔끔하게 해제해주는 방법은

비어있는 벡터를 하나 선언해주고 swap()함수를 이용하면 된다고 한다.



예시


//초기벡터

vector<int> vInt;



//메모리 해제


vector<int>().swap(vInt);



Posted by JinFluenza
프로그래밍/C++2016. 4. 2. 01:59

 

함수는 timeGetTime() 이구요, 밀리세컨드(ms)단위로 측정가능합니다.

방법은 아주 간단합니다.

DWORD dwStartTime = timeGetTime();


// 처리부분


...


// 처리부분 종료


DWORD dwEndTime = timeGetTime();


printf("%d ms", dwEndTime-dwStartTime);


 필요한 부분에 추가하시고 쓰면 됩니다.

단, 사용하기 위해서는 사용하는 파일에 Mmsystem.h 를 Include 해주고,winmm.lib 를 Project=>Setting(ALT+F7) 메뉴의 LINK 텝에서 Object/library modules: 에 추가를 해주어야 합니다..

'프로그래밍 > C++' 카테고리의 다른 글

함수포인터 활용  (0) 2016.09.01
c++ 파일 입출력 (텍스트 파일을 읽어서 원하는 정보 얻어오기)  (1) 2016.08.11
벡터 clear  (0) 2016.07.13
벡터에서 erase사용시 주의할것.  (0) 2016.03.30
첫글  (0) 2016.02.22
Posted by JinFluenza
프로그래밍/C++2016. 3. 30. 11:10

벡터에서 erase를 사용하면 해당 원소가 사라지고 뒤에것들이 앞으로 떙겨지게 된다.

그런데 만약에 이터레이터값을 이용해 반복문을 수행하고 있으면, 이터레이터++ 이것 때문에 문제가 발생할수 있다.

이를 방지하려면 코드를 이렇게 짜면 된다.

for(vi=v.begin(); vi != v.end(); )

{

if(삭제조건){  _vi=_v.erase(_vi);}   //이레이즈를 하게되면 지워진 원소의 다음번 이터레이터를 반환한다.

else{_vi++}

}

 

 

'프로그래밍 > C++' 카테고리의 다른 글

함수포인터 활용  (0) 2016.09.01
c++ 파일 입출력 (텍스트 파일을 읽어서 원하는 정보 얻어오기)  (1) 2016.08.11
벡터 clear  (0) 2016.07.13
프로그램 진행시간 측정 하는법.  (0) 2016.04.02
첫글  (0) 2016.02.22
Posted by JinFluenza
프로그래밍/C++2016. 2. 22. 01:45

시작.

저는  원래 대학교에서는 다른전공을 하다가

작년에 부전공으로 소프트웨어학과 수업을 듣던중에

프로그래밍에 관심이 생겨서 공부하게 되었습니다.

매일매일 새로 배운내용을 올릴 생각입니다.

내용도 내용이지만.

배우는 입장에서 어떤걸 느꼈는지 위주로 올릴 생각입니다~

Posted by JinFluenza