Displaying current density of particulate matter(PM10) in seoul using AngularJS, Express.js
앵귤러 보름만하면 나도 프론트엔드 웹개발자? ^^
서울시 대기환경 정보 사이트에서 주기적으로 데이터를 긁어와서 표와 챠트로 보여주게 하는 간단한 Web App을 만들어 보았다. 개발 하면서도 매우 재미 있었다.^^
#define MAX_DATA_SIZE 2048 typedef struct __FileBlock { char strData1 [2]; int nNumber1 ; //4byte int nNumber2 ; //4byte int nNumber3 ; //4byte char strData2 [50]; char strData3 [MAX_DATA_SIZE]; } ItemFileBlock;
bool SaveDataToFile(ItemFileBlock* pstFileBlock) { //m_clsFile 는 파일 I/O 를 담당하는 객체 //구조체를 sizeof(ItemFileBlock) 크기만큼 파일에 저장. if( !m_clsFile.WriteRecord((char*)pstFileBlock, sizeof(ItemFileBlock))) { return false; } return true; }
ItemFileBlock stFileBlock; //이제 stFileBlock 의 항목을 채운다. //..... //pData3 는 이미 사용자의 정보를 가르키고 있는 포인터 이다. memcpy(&stFileBlock.strData3, pData3, MAX_DATA_SIZE); //흠 복사 할 게 좀 많네 //함수 호출 if(!SaveDataToFile(&stFileBlock)){ .... }
//이젠 strData3에 저장될 데이터를 포인터로 받는다. bool SaveDataToFile(ItemFileBlock* pstFileBlock, char* pData3) { //2번에 나눠 파일에 저장. 한번은 strData3 이전 데이터 // !!! sizeof(ItemFileBlock)-MAX_DATA_SIZE 이것은 ?! if( !m_clsFile.WriteRecord((char*)pstFileBlock, sizeof(ItemFileBlock)-MAX_DATA_SIZE) ) { return false; } //strrData3은 여기서 저장된다 if( !m_clsFile.WriteRecord((char*)pData3, MAX_DATA_SIZE)) { return false; } return true; } //그리고 실제 호출시에는 다음처럼 strData3에 불필요한(?) 복사를 생략하여,
//값을 채우지 않는다. ItemFileBlock stFileBlock; //stFileBlock 의 항목을 채운다. ..... ..... //memcpy(&stFileBlock.strData3, 사용자의정보, MAX_DATA_SIZE); //생략! //함수 호출 if(!SaveDataToFile(&stFileBlock, pData3)){ .... }
#define MAX_DATA_SIZE 2048 typedef struct __FileBlock { char strData1 [2]; int nNumber1 ; //4byte int nNumber2 ; //4byte int nNumber3 ; //4byte char strData2 [50]; char strData3 [MAX_DATA_SIZE]; } ItemFileBlock; void testFunc() { printf("sizeof(ItemFileBlock)[%d]\n",sizeof(ItemFileBlock)); printf( "offsetof(strData1) =%d\n",offsetof(struct __FileBlock, strData1 )); printf( "offsetof(nNumber1) =%d\n",offsetof(struct __FileBlock, nNumber1 )); printf( "offsetof(nNumber2) =%d\n",offsetof(struct __FileBlock, nNumber2 )); printf( "offsetof(nNumber3) =%d\n",offsetof(struct __FileBlock, nNumber3 )); printf( "offsetof(strData2) =%d\n",offsetof(struct __FileBlock, strData2 )); printf( "offsetof(strData3) =%d\n",offsetof(struct __FileBlock, strData3 )); } //실행 결과 sizeof(ItemFileBlock)[2116] offsetof(__FileBlock,strData1) =0 offsetof(__FileBlock,nNumber1) =4 offsetof(__FileBlock,nNumber2) =8 offsetof(__FileBlock,nNumber3) =12 offsetof(__FileBlock,strData2) =16 offsetof(__FileBlock,strData3) =66
typedef struct __FileBlock { char strData1 [2]; //offset 0 char padding [2]; //offset 2 int nNumber1 ; //offset 4 int nNumber2 ; //offset 8 int nNumber3 ; //offset 12 char strData2 [50];//offset 16 char strData3 [MAX_DATA_SIZE]; //offset 66 char padding [2]; //offset 2114 } ItemFileBlock;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | //std_thread_test.cpp #include <thread> #include <iostream> void thread_func() { std::cout<<"hello, I am a thread!"<<std::endl; } int main() { std::thread t(thread_func); t.join(); } |