C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[73544] Re:파일패스 습득중 문자열변수에대한 질문입니다.
송신영 [palindrome] 4538 읽음    2016-04-12 14:03
_TCHAR buf[1024];
가 지역 변수로 선언되었기 때문인것 같습니다.
당연히 지역 변수는 함수가 종료됨과 동시에 스텍에서 사라지니
buf를 가져다 쓰는 다른 포인터 변수의 값들도 사라지는 것이겠죠.

낭천 님이 쓰신 글 :
: c++로 프로젝트의 파일패스를 추출해서 문자열에넣고 그걸 이용해서 처리를 하려는데...정말 이상한점이 있습니다.
: 문자열 변수에 넣었을때 잘 들어가나 싶은데 메소드를 빠저나가거나..try문안에서 실행했을때 try를 빠저나가면 패스를 넣었던 문자열이 비어버립니다.
:
: IniFileController::IniFileController()
: {
: 	numOfServer = "NumberOfServer";
: 	section = "AP_SERVER";
: 	fileName = "AP_SERVER_LIST.ini";
: 
: 	_TCHAR* splitBuf;
: 	_TCHAR* splitContxt;
: 	CString exeName;
: 	CString projectPath;
: 
: 	_TCHAR buf[1024];
:     GetModuleFileName(0,buf,1024);
: 
: 	projectPath = buf;
: 	splitBuf = buf;
: 	splitBuf = strtok_s(buf, "\\", &splitContxt);
: 	while(strtok_s(NULL, "\\",  &splitContxt) != NULL)
: 	{
: 		splitBuf = strtok_s(NULL, "\\",  &splitContxt);
: 	}
: 	exeName = splitBuf;
: 	projectPath.Replace(exeName, fileName);
: 
: 	iniPath = projectPath;
: }

: 컨스트럭터에서 iniPath에 습득한 문자열을 넣었습니다. iniPath는 LPCTSTR형이고 h파일에서 정의했습니다.
: 마지막줄의 iniPath = projectPath; 를 보면 iniPath에 값이 잘 들어가 있는데 그 다음 줄의 } 에 가면
: iniPath에 잘못된 문자가 들어있습니다 어쩌고 저쩌고 합니다...
:
: 그리고 위의 컨스트럭터 아래에 다음 메소드가 있습니다.
:
:
: bool IniFileController::GetNumServer()
: {
: 	//設定ファイルのNumberOfServer取得
: 	try
: 	{
: 		//iniファイルの存在を確認する
: 		if(!fileChecker.GetFileExists(iniPath))
: 		{
: 			LPCTSTR err = "設定ファイルがモジュールと同じ場所に存在しません。\n";
: 			throw err;
: 		}
: 	}
: 	catch(LPCTSTR err)
: 	{
: 		std::cout << err;
: 		return false;
: 	}
: 	return true;
: }
: 

:
: 여기서 iniPath를 사용하는데요...컨스트럭터에서 마지막에 이상한게 들어갔기때문에 역시나 여기서도 이상한게 들어가있는 그대로입니다...컨스트럭터에 하고있는 iniPath에 값 넣는 처리를 그대로 컨스트럭터가 아닌 다른 메소드에서 실행하거나 해도 같은 현상이 일어납니다.
:
: 아래와 같이 할 경우에는 원하는 처리를 얻을 수 있기는 합니다..
:
:
: bool IniFileController::GetNumServer()
: {
: 	//設定ファイルのNumberOfServer取得
: 	try
: 	{
: 	_TCHAR* splitBuf;
: 	_TCHAR* splitContxt;
: 	CString exeName;
: 	CString projectPath;
: 
: 	_TCHAR buf[1024];
:     GetModuleFileName(0,buf,1024);
: 
: 	projectPath = buf;
: 	splitBuf = buf;
: 	splitBuf = strtok_s(buf, "\\", &splitContxt);
: 	while(strtok_s(NULL, "\\",  &splitContxt) != NULL)
: 	{
: 		splitBuf = strtok_s(NULL, "\\",  &splitContxt);
: 	}
: 	exeName = splitBuf;
: 	projectPath.Replace(exeName, fileName);
: 
: 	iniPath = projectPath;
: 		//iniファイルの存在を確認する
: 		if(!fileChecker.GetFileExists(iniPath))
: 		{
: 			LPCTSTR err = "設定ファイルがモジュールと同じ場所に存在しません。\n";
: 			throw err;
: 		}
: 	}
: 	catch(LPCTSTR err)
: 	{
: 		std::cout << err;
: 		return false;
: 	}
: 	return true;
: }
: 

:
: 이렇게 할경우 iniPath를 습득해서 바로 쓰기때문에 뭐..일단 정상적으로 되긴합니다만...이 현상이 이해가 안갑니다..
: 나름 변수를 포인터로도 바꿔보고 해봤는데 해결이 안되네요...도대체 왜이러는 걸까요..ㅠ

+ -

관련 글 리스트
73539 파일패스 습득중 문자열변수에대한 질문입니다. 낭천 4453 2016/04/12
73544     Re:파일패스 습득중 문자열변수에대한 질문입니다. 송신영 4538 2016/04/12
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.