Press "Enter" to skip to content

Space4u

C/C++에서 구조체(structure) 를 파일로 저장할때… 왜 쓰레기가 껴들어가지?

다 그런건 아닌데요.

스트럭처(구조체, structure)를 파일로 저장할때 신경질이 날때가 있습니다.

typedef struct tagMyStructure
{
    int nIdx;
    int nNo;
    short shAge;
    int nIncome;
} MYSTRUCTURE;

MYSTRUCTURE data;
data. nIdx = 0;
data.nNo = 10;
data.shAge = 40;
data.nIncome = 100000;

FILE    *hFile;
errno_t eNo = _tfopen_s( &hFile, _T( \temp\test.bin ), _T( “wb” ) );
fwrite( &data, sizeof( data ), 1, hFile );
fclose( hFile );

라고  구조체를 정의하고 필요한 값을 넣은다음에 파일에 써 넣으면 예상과 다른 결과를 마주하게 됩니다.

위에서 저장한 test.bin 파일을 헥사 뷰어 등으로 열어보면

원하는 거… (예상)는 다음과 같을겁니다.
(int : 4바이트, short는 2바이트 이니깐요…)

00 00 00 00 0A 00 00 00 28 00 A0 86 01 00

근데 실제로 헥사 뷰어로 열어보면

00 00 00 00 0A 00 00 00 28 00 CC CC A0 86 01 00

short 뒤에 두바이트가 끼어 들어가요!!!!
뭐뭐임!!!! 내가 원하는건 이게 아냐!!!
컴터야 왜 오동작하니….라고 생각할 수 있어요.

일단 급한건 해결방법
위에 스트럭쳐를 선언할때 위 아래로 다음과 같이 선언해 주세요

pragma pack(push, 2)

typedef struct tagMyStructure
{
    int nIdx;
    int nNo;
    short shAge;
    int nIncome;
} MYSTRUCTURE;

pragma pack(pop)

다시 컴파일해서 실행해보면 예상하는데로 결과가 잘 나옵니다.

이제 원인을 알아볼까요?

원인은 우리 컴터가 데이터를 32비트(즉 4바이트)단위로 처리를 하기 때문입니다.
뭐 … 성능때문에 메모리를 4바이트 단위로 읽어서 처리를 한다는게 기본 사상인데요.
한바이트씩 읽으면 4번할꺼 4바이트 한방에 읽으면 속도가 빨라지는 건 당연하겠죠. 그러나 그게… 인간이 느낄 수 있는 시간인지는 모른다에 한표… 

하여간… 그런 이유로 파일로 저장할때 구조체의 요소를 다 4바이트로 봐 버립니다. 젠장..
그래서 중간에 껴 있는 short 뒤에 2바이트가 껴들어가는거죠.
실제로 sizeof( data ) 로 구조체의 사이즈를 재면 16이 나옵니다.나는 12바이트짜리 구조체를 선언했는데 말이죠.. 
그래서 파일 저장도 16바이트가 되버리는데 short에는 2바이트만 정상적인 데이터가 있으니깐 쓰레기 2바이트가 껴 들어가게 됩니다.

이걸 정상화(?) 하기 위해서 #pragma pack(push, 2), #pragma pack(pop) 로 구조체를 싸 줬습니다.
요넘이 무슨 이야기냐…  2바이트 단위로 메모리 억세스해! 라는 소립니다.
긍게 short도 정상적으로 저장이 되고 sizeof( data ) 도 12바이트로 나오고… 잘 되요…

그렇습니다.

C# 버전 자동증가, 빌드 날짜 자동으로 넣기

AssemblyInfo.cs 파일 수정
원래

[assembly: AssemblyVersion( “1.0.0.0” )] 

[assembly: AssemblyVersion( "1.0.0.0" )] 

으로 되어 있는 것을

[assembly: AssemblyVersion( "1.0.0.*" )]  

맨 마지막 0을 *로 변경하면 자동으로 빌드번호 및 수정번호가 들어감.

빌드전 이벤트 명령줄에 다음 추가
———————————————————————————————————————-
FOR /f %%a IN (‘WMIC OS GET LocalDateTime ^| FIND “+”‘) DO SET DTS=%%a  SET COMPILEDATETIME=%DTS:~0,8%-%DTS:~8,10%  echo %COMPILEDATETIME% > “$(ProjectDir)\Resources\BuildDate.txt”
———————————————————————————————————————-
컴파일할때마다
연월일-시분초.밀리초 포맷으로 컴파일 일시를 BuildDate.txt 파일 생성 시킴

리소스에 다음 파일 추가
$(ProjectDir)\Resources\BuildDate.txt
*주의 : 한번이라도 컴파일을 시도해서 BuildDate.txt 파일이 생성되게 해야 리소스에 추가할 파일을 선택할 수 있음… 아님 수동으로 파일을 만들어 넣덩가…

출력하고 싶은 곳에 다음 코드의 strVer을 출력하면 됨
string strVer = “Ver. ” + System.Reflection.Assembly.GetExecutingAssembly( ).GetName( ).Version + ” Build. ” + Properties.Resources.BuildDate;

대략 이렇게 출력됨
Ver. 1.0.0.517 Build. 20171213-111032.488

끝.

안드로이드에서 내가 Debug 모듈인지 체크하는 방법

ADT 17 이상에서

BuildConfig.DEBUG 상수값을 체크함으로 알 수 있다.

이 클래스는 컴파일시 generated 된다.

프로그래밍할때 다음과 같이 사용하면 편하다.

if ( BuildConfig.DEBUG )   
{  
  // Debug 일때 사용할 코드  
}  
else  
{  
  // Release 일때 사용할 코드  
}  

참고로 안드로이드 스튜디오에서 Run으로 실행시키나 Debug로 실행시키나 동일하게 BuildConfig.DEBUG 는 true 이다.

릴리즈 apk를 실행할때만 false이다.

일본어 가능형/수동형/사역형 정리

 가능형수동형사역형
1류(5단)동사어미 → え단 + る어미 → あ단 + れる어미 → あ단 + せる
2류(1단)동사어간 + られる
(る → られる)
어간 + られる
(る → られる)
어간 + させる
(る → させる
3류(변격) 동사する → できる
くる → こられる
する → される
くる → こられる
する → させる
くる → こさせる

(1)1그룹동사 : 어미 え단+る  
 
 예) 会(あ)う ⇒ 会(あ)える  行(い)く ⇒ 行(い)ける  急(いそ)ぐ ⇒ 急(いそ)げる

話(はな)す ⇒ 話(はな)せる  飲(の)む ⇒ 飲(の)める 遊(あそ)ぶ ⇒ 遊(あそ)べる

       死(し)ぬ ⇒ 死(し)ねる  待(ま)つ ⇒ 待(ま)てる  乗(の)る ⇒ 乗(の)れる   

 (2)2그룹동사 : る+られる

 예) 見(み)る ⇒ 見(み)られる  寝(ね)る ⇒ 寝(ね)られる 食(た)べる ⇒ 食(た)べられ   

(3)3그룹동사 : 来(く)る⇒来(こ)られる、する⇒できる 

 漢(かん)字(じ)が書(か)けます。(한자를 쓸 수 있습니다)
日(に)本(ほん)語(ご)でメールが送(おく)れます。 (일본어로 메일을 보낼 수 있습니다)

タバコはやめられません。 (담배는 못 끊습니다)     
 tip !
* “능력”을 나타내는 가능형 앞에 “–을/를”이 올 때 “を”대신 “が”를 쓴다. 
   
*가능형은 두 가지로 표현할 수 있다.
日(に)本(ほん)語(ご)を話(はな)すことができます。  (일본어를 말 할 수 있습니다)
明日(あした)、早(はや)く来(く)ることができますか。(내일 일찍 올 수 있습니까?)

[単(たん)語(ご)]
日(に)本(ほん)語(ご):일본어     話(はな)す:말하다      明日(あした):내일      早(はや)く:일찍
来(く)る:오다          漢(かん)字(じ):한자       書(か)く:쓰다        -で:-으로  
メール:메일        送(おく)る:보내다    タバコ:담배     やめる:그만두다,끊다
韓(かん)国(こく):한국        料(りょう)理(り):요리  作(つく)る:만들다    今(こん)度(ど):다음 번
教(おし)える:가르치다   中(ちゅう)国(ごく)語(ご):중국어  どうして:왜     実(じつ)は:실은     
お客(きゃく)さん:손님     本(ほん)当(とう):정말      紹(しょう)介(かい)する:소개하다 
ありがとうございます:감사합니다 
 
[練(れん)習(しゅう)1]
キム:鈴木(すずき)さんは韓(かん)国(こく)料(りょう)理(り)を作(つく)ることができますか。
(스즈끼시는 한국요리를 만들 줄아세요?)  

鈴木(すずき):いいえ、作(つく)ることができません。今(こん)度(ど)教(おし)えてください。
(아니오, 못 만들어요. 다음 번에 가르쳐주세요)  

キム:ええ、いいですよ。 (네, 좋아요)  
 

[練(れん)習(しゅう)2]
鈴木(すずき):キムさんは中(ちゅう)国(ごく)語(ご)が話(はな)せますか。
(김씨는 중국어를 말 할 수 있어요?)  

キム:え、中(ちゅう)国(ごく)語(ご)はちょっと...。どうしてですか。
(에, 중국어는 좀.. 왜요?)  

鈴木(すずき):実(じつ)は明日(あした)中(ちゅう)国(ごく)からお客(きゃく)さんが来(く)るんです。
(실은 중국에서 손님이 와서요)  

キム:そうですか。じゃ、中(ちゅう)国(ごく)語(ご)ができる人(ひと)を紹(しょう)介(かい)しますよ。
(그래요.그럼 중국어를 할 줄 아는 사람을 소개 할께요)  

鈴木(すずき):本(ほん)当(とう)ですか。ありがとうございます。
(정말요? 감사합니다)

일본어 명령형, ~라고 하는 의미, ~을 위하여.

1. 동사의 명령형

1그룹 : e단으로 변경

行く -> 行け 가라

2그룹 : る를 ろ로 변경

食べる(たべる) -> たべろ 먹어라

3그룹 : 걍 외우기

来る(くる) – > こい 와라

2. 丁寧な(ていねいな)

1, 2, 3 그룹 : ます形 + なさい。

行きなさい 가세요

見なさい 보세요

来なさい 오세요

禁止の命令形

1, 2, 3 그룹 : 사전형 + な

行くな 가지마

見るな 보지마

来るな 오지마

2.~という○○(名詞)/~という意味

・名詞がどんなものかをせつめいする(これは、みかんという くだものです)

명사가 어떤것인지 설명(이것은 귤이라고 하는 과일입니다.)

3.~ために : ~을 위하여

참고

1그룹 : る로 끝나지 않거나, る로 끝나더라도 る앞글자가 e단, i단이 아니거나, 3그룹이 아닌 동사

2그룹 : る로 끝나고 る앞글자가 e단이거나 i단인 동사

3그룹 : 来る(くる)、する

댓글줌 달아주세요~