Language
한국어
Cpp
2010.07.15 11:14

Object Serialization Example

조회 수 36944 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    TestClass obj; // TestClass 클래스 객체 생성
    obj.init("delay_time", "ms", "UINT32", 4); // TestClass에는 init() 맴버 함수가 있다고 가정함.
    obj.set("012345"); // TestClass에는 set() 맴버 함수가 있다고 가정함.
    cout << "obj => " << obj << endl; // TestClass는 연산자 << 를 오버로딩함.

    fstream fs("mibentry.bin", ios::binary);
    // 객체 직렬화 - 쓰기
    fs.write((char*)&obj, sizeof(obj));

    MibEntry copied_obj;
    fs.seekg(0);
    // 객체 직렬화 - 읽기
    fs.read((char*)&copied_obj, sizeof(copied_obj));

    cout << "copied_obj => " << copied_obj << endl;
    return 0;
}
TAG •

조회 수 60223 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form

#include <stdio.h>
#include <math.h>

#define PI M_PI

unsigned char IsLeapYear(int year);
unsigned char GetLastDay(unsigned int uiYear, unsigned char ucMonth);
int CalcJulianDay(unsigned int uiYear, unsigned char ucMonth, unsigned char ucDay);
double CalcGamma(int iJulDay);
double CalcGamma2(int iJulDay, int hour);
double CalcEqofTime(double gamma);
double CalcSolarDec(double gamma);
double DegreeToRadian(double angleDeg);
double RadianToDegree(double angleRad);
double CalcHourAngle(double lat, double solarDec, int time);
double CalcSunriseGMT(int iJulDay, double latitude, double longitude);
double CalcSunsetGMT(int iJulDay, double latitude, double longitude);
void GetTimeString(double minutes, char *pszTimeString);
double GetSunriseTime(int year, int month, int day, double latitude, double longitude, int zone, int daySavings);
double GetSunsetTime(int year, int month, int day, double latitude, double longitude, int zone, int daySavings);

unsigned char IsLeapYear(int year)
{
    return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);
}

unsigned char GetLastDay(unsigned int uiYear, unsigned char ucMonth)
{
    switch(ucMonth) {
        case 2: // 2월
            if( (uiYear % 4) == 0 ) {        // 4로 나누어 떨어지는 해는 윤년임.
                if(uiYear % 100 == 0) {    // 그중에서 100으로 나누어 떨어지는 해는 평년임 
                    if(uiYear % 400 == 0) return 29; // 그중에서 400으로 나누어 떨어지는 해는 윤년임.
                    return 28; // 평년
                }
                return 29;    // 윤년
            }
            return 28;    // else 평년
        case 4: case 6: case 9: case 11: // 4, 6, 9, 11월
            return 30; // 30일
    }

    return 31; // 그외 31일
}


int CalcJulianDay(unsigned int uiYear, unsigned char ucMonth, unsigned char ucDay)
{
    int i;
    int iJulDay;
    iJulDay = 0;
    for(i=1; i<ucMonth; i++) {
        iJulDay += GetLastDay(uiYear, i);
    }
    iJulDay += ucDay;

    return iJulDay;
}

double CalcGamma(int iJulDay)
{
    return (2.0 * PI / 365.0) * (iJulDay - 1);
}
double CalcGamma2(int iJulDay, int hour)
{
    return (2.0 * PI / 365.0) * (iJulDay - 1 + (hour/24.0));
}

// Return the equation of time value for the given date.
double CalcEqofTime(double gamma)
{
    return (229.18 * (0.000075 + 0.001868 * cos(gamma) - 0.032077 * sin(gamma) - 0.014615 * cos(2 * gamma) - 0.040849 * sin(2 * gamma)));

}

// Return the solar declination angle (in radians) for the given date.
double CalcSolarDec(double gamma)
{
    return (0.006918 - 0.399912 * cos(gamma) + 0.070257 * sin(gamma) - 0.006758 * cos(2 * gamma) + 0.000907 * sin(2 * gamma));
}

double DegreeToRadian(double angleDeg)
{
    return (PI * angleDeg / 180.0);
}

double RadianToDegree(double angleRad)
{
    return (180*angleRad / PI);
}

double CalcHourAngle(double latitude, double solarDec, int time)
{
    double latRad = DegreeToRadian(latitude);
    double hour_angle = acos(cos(DegreeToRadian(90.833)) / (cos(latRad)*cos(solarDec)) - tan(latRad) * tan(solarDec));
    if(time) {
        return hour_angle;
    }
    else return -hour_angle;
}

double CalcSunriseGMT(int iJulDay, double latitude, double longitude)
{
    double gamma = CalcGamma(iJulDay);
    double eqTime = CalcEqofTime(gamma);
    double solarDec = CalcSolarDec(gamma);
    double hourAngle = CalcHourAngle(latitude, solarDec, 1);
    double delta = longitude - RadianToDegree(hourAngle);
    double timeDiff = 4.0 * delta;
    double timeGMT = 720.0 + timeDiff - eqTime;
    double gamma_sunrise = CalcGamma2(iJulDay, timeGMT/60.0);
    eqTime = CalcEqofTime(gamma_sunrise);
    solarDec = CalcSolarDec(gamma_sunrise);
    hourAngle = CalcHourAngle(latitude, solarDec, 1);
    delta = longitude - RadianToDegree(hourAngle);
    timeDiff = 4.0 * delta;
    timeGMT = 720.0 + timeDiff - eqTime;

    return timeGMT;
}

double CalcSunsetGMT(int iJulDay, double latitude, double longitude)
{
    // First calculates sunrise and approx length of day
    double gamma = CalcGamma(iJulDay + 1);
    double eqTime = CalcEqofTime(gamma);
    double solarDec = CalcSolarDec(gamma);
    double hourAngle = CalcHourAngle(latitude, solarDec, 0);
    double delta = longitude - RadianToDegree(hourAngle);
    double timeDiff = 4.0 * delta;
    double setTimeGMT = 720.0 + timeDiff - eqTime;
    // first pass used to include fractional day in gamma calc
    double gamma_sunset = CalcGamma2(iJulDay, setTimeGMT/60.0);
    eqTime = CalcEqofTime(gamma_sunset);
    //alert("eqTime = " + eqTime);
    solarDec = CalcSolarDec(gamma_sunset);
    //alert("solarDec = " + radToDeg(solarDec));
    hourAngle = CalcHourAngle(latitude, solarDec, 0);
    delta = longitude - RadianToDegree(hourAngle);
    timeDiff = 4.0 * delta;
    setTimeGMT = 720.0 + timeDiff - eqTime; // in minutes
    return setTimeGMT;
}


void GetTimeString(double minutes, char *pszTimeString)
    // timeString returns a zero-padded string given time in minutes
{
    double floatHour = minutes / 60.0;
    double hour = floor(floatHour);
    double floatMinute = 60.0 * (floatHour - floor(floatHour));
    double minute = floor(floatMinute);
    double floatSec = 60.0 * (floatMinute - floor(floatMinute));
    double second = floor(floatSec);

    sprintf(pszTimeString, "%02d:%02d:%02d", (int)hour, (int)minute, (int)second);
}

double GetSunriseTime(int year, int month, int day, double latitude, double longitude, int zone, int daySavings)
{
    int julday = CalcJulianDay(year, month, day);
    double timeLST = CalcSunriseGMT(julday, latitude, longitude) - (60.0*zone) + daySavings; // minutes
    return timeLST;
}

double GetSunsetTime(int year, int month, int day, double latitude, double longitude, int zone, int daySavings)
{
    int julday = CalcJulianDay(year, month, day);
    double timeLST = CalcSunsetGMT(julday, latitude, longitude) - (60.0*zone) + daySavings;
    return timeLST;
}


int main()
{
    char szTmp[64];
    double latitude, longitude, lst;
    latitude = 35.53; // 대구
    longitude = -128.37;
    latitude = 35.829147; 
    longitude = -128.50015;
    latitude = 37.34; // 서울
    longitude = -126.589999;
    printf("latitude:  %f\n", latitude);
    printf("longitude: %f\n", longitude);
    lst = GetSunriseTime(9, 2, 19, latitude, longitude, -9, 0);
    GetTimeString(lst, szTmp);
    printf("sunrise: %s (%lf)\n", szTmp, lst);
    lst = GetSunsetTime(9, 2, 19, latitude, longitude, -9, 0);
    GetTimeString(lst, szTmp);
    printf("sunset:  %s (%lf)\n", szTmp, lst);
    return 0;
}



TAG •

Cpp
2008.09.19 16:42

Putty 영문폰트, 한글입력

조회 수 33469 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
Extra Form
음. 한글 인코딩은 cp949(euckr)로 설정된 상태에서 영문 폰트 (ex. Courier New)를 설정한 후,
Putty 상에서 한글을 입력하면 ... 이라고 나와서 짜증났었다.
웹페이지 검색하다가 세션마다 레지스트리 만져서 수정하면된다고 나오던데, 구찮았고, 잘안되는 것 같았다.
소스 받아서 수정하면 된다고 검색에서 나왔다.
따라서 해보겠다고 1시간 넘게 소스를 VC6 툴로 열어서 컴파일하니 에롸 좍~
머 FLASH 관련해서 함수 쓰는 부분도 에롸나고, 정의 안된 부분이 있어서 에롸나고, 암튼 우찌 우찌 해서 에러를 고쳤다.

windows\window.c 파일에서 아래 부분을 찾아서
GetCPInfo(ucsdata.font_codepage, &cpinfo);
ucsdata.dbcs_screenfont = (cpinfo.MaxCharSize > 1);

아래와 같이 수정했다.
ucsdata.font_codepage = 949;
GetCPInfo(ucsdata.font_codepage, &cpinfo);
ucsdata.dbcs_screenfont = (cpinfo.MaxCharSize > 1);

ucsdata.font_codepage = 949;  요 한라인만 추가했음.
디버깅 해보니 한글 폰트가 아닌 영문 폰트를 지정했을 때 font_codepage 값이 949가 아닌 값이 되어 (얼마더라 12xx 인듯)
터미널 상에서 한글을 입력하면 ... 이라고 표시된 듯 싶다.
한글 사용한다고 FixedSys 체만 썼었는데, 다른 영문 폰트도 사용하여 눈이라도 즐겁게 해본다. emoticon


참고로
putty 버전은 0.60이며,
putty 바이너리 파일과 수정된 window.c 파일을 첨부하였음.
TAG •

Cpp
2008.09.12 11:37

C / printf format parameter

조회 수 53145 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form
0 2 false false false EN-US KO X-NONE MicrosoftInternetExplorer4

format

String that contains the text to be written to stdout.
It can optionally contain embedded format tags that are substituted by the values specified in subsequent argument(s) and formatted as requested.
The number of arguments following the format parameters should at least be as much as the number of format tags.
The format tags follow this prototype:

%[flags][width][.precision][length]specifier
Where specifier is the most significant one and defines the type and the interpretation of the value of the coresponding argument:

specifier

Output

Example

c

Character

a

d or i

Signed decimal integer

392

e

Scientific notation (mantise/exponent) using e character

3.9265e+2

E

Scientific notation (mantise/exponent) using E character

3.9265E+2

f

Decimal floating point

392.65

g

Use the shorter of %e or %f

392.65

G

Use the shorter of %E or %f

392.65

o

Signed octal

610

s

String of characters

sample

u

Unsigned decimal integer

7235

x

Unsigned hexadecimal integer

7fa

X

Unsigned hexadecimal integer (capital letters)

7FA

p

Pointer address

B800:0000

n

Nothing printed. The argument must be a pointer to a signed int, where the number of characters written so far is stored.


%

A % followed by another % character will write % to stdout.


The tag can also contain flags, width, .precision and modifiers sub-specifiers, which are optional and follow these specifications:

flags

description

-

Left-justify within the given field width; Right justification is the default (see width sub-specifier).

+

Forces to preceed the result with a plus or minus sign (+ or -) even for positive numbers. By default, only negative numbers are preceded with a - sign.

(space)

If no sign is going to be written, a blank space is inserted before the value.

#

Used with o, x or X specifiers the value is preceeded with 0, 0x or 0X respectively for values different than zero.
Used with e, E and f, it forces the written output to contain a decimal point even if no digits would follow. By default, if no digits follow, no decimal point is written.
Used with g or G the result is the same as with e or E but trailing zeros are not removed.

0

Left-pads the number with zeroes (0) instead of spaces, where padding is specified (see width sub-specifier).

 

width

description

(number)

Minimum number of characters to be printed. If the value to be printed is shorter than this number, the result is padded with blank spaces. The value is not truncated even if the result is larger.

*

The width is not specified in the format string, but as an additional integer value argument preceding the argument that has to be formatted.

 

.precision

description

.number

For integer specifiers (d, i, o, u, x, X): precision specifies the minimum number of digits to be written. If the value to be written is shorter than this number, the result is padded with leading zeros. The value is not truncated even if the result is longer. A precision of 0 means that no character is written for the value 0.
For e, E and f specifiers: this is the number of digits to be printed after the decimal point.
For g and G specifiers: This is the maximum number of significant digits to be printed.
For s: this is the maximum number of characters to be printed. By default all characters are printed until the ending null character is encountered.
For c type: it has no effect.
When no precision is specified, the default is 1. If the period is specified without an explicit value for precision, 0 is assumed.

.*

The precision is not specified in the format string, but as an additional integer value argument preceding the argument that has to be formatted.

 

length

description

h

The argument is interpreted as a short int or unsigned short int (only applies to integer specifiers: i, d, o, u, x and X).

l

The argument is interpreted as a long int or unsigned long int for integer specifiers (i, d, o, u, x and X), and as a wide character or wide character string for specifiers c and s.

L

The argument is interpreted as a long double (only applies to floating point specifiers: e, E, f, g and G).




referenced by http://www.cplusplus.com/reference/clibrary/cstdio/printf.html


TAG •

조회 수 28602 추천 수 0 댓글 4
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form
문자열의 끝이 suffix로 끝나는지 확인하는 함수를 구현해 보았다.
내 머리로는 이 방법밖에 떠오르지 않는다. 더 좋은 방법이 없을까?

/**
* @author wittgens
* @see
*    str 문자열의 끝이 suffix 문자열로 끝나는가 확인하기 위한 함수.
* @args
*    str : 확인할 문자열
*    suffix : 끝이 지정 문자열인가.
* @returns
*    str 문자열의 끝부분이 suffix 문자열이면 1, 그렇지 않으면 0을 반환함.
* @note
*    str과 suffix는 반드시 null terminated 이어야 한다.
*/
char endsWith(const char *str, const char *suffix)
{
   char *p;
   int suffix_len, str_len;
   suffix_len = strlen(suffix); // suffix의 길이
   str_len = strlen(str); // str의 길이
   if(str_len < suffix_len) return 0;  // return false

   p = (char*)str + str_len - 1; // p는 마지막 문자를 가리키도록 함

   p -= suffix_len - 1; // p를 suffix의 길이 만큼 전으로 이동시킴.
   if(strcmp(p, suffix) == 0) return 1;

   return 0;
}


TAG •
  • ?
    GG 2008.01.08 15:59
    #!/usr/bin/python
    print "1234".endswith("34")

    True

    ----
    #!/usr/bin/ruby
    puts "1234" =~ /34$/

    2
  • ?
    비트겐스 2008.01.10 10:46
    C 언어에서 있냐는 얘기지.
    저거 자바에서도 되거덩
    "1234".endsWith("34")
  • ?
    GG 2008.01.17 20:02
    내가 누군줄 알고 댓글을 다는거샤? 나 동수야.
  • ?
    비트겐스 2008.01.17 22:46
    동수 안녕?

Board Pagination Prev 1 Next
/ 1