본문 바로가기
아두이노

아두이노를 이용한 데이터 저장 -#11

by 오징어땅콩2 2020. 9. 27.
반응형

이전에 구조체를 이해 했기를 바라면서, 

알아도 되고 몰라도 되는 부분이지만, 알면 얼청난 위력을 발휘하는게 구조체와 포인터 이다.

오늘은 간단하게 함수 두개만 공부하고 넘어가자.

구지 설명이 필요 없을수도 있지만, 설명을 하는것으로 하자.

 

온도센서에서 온도를 읽기 위한 함수 void read_temp(Info& _info);

초보들이 보면 많은 의문이 있겠지만, 왜 전역변수를 구지 인자로 넘겨서 처리 했을까?

이것은 함수의 재활용성에 있다. 이 함수를 여기에서만 사용한다면 ? 그렇수도 있다.

만약 전역변수가 아니라면 ? 여러가지 이유로 습관적으로 인자로 넘긴다.

그리고 디버깅의 관점에서도 용의 할수도 있다. 

많은 이유를 설명으로 하기는 어렵지만 전역변수는 필요악으로 보는게 좋다.

최대한 사용하지 않는 습관으로 가는게 좋을것 이다.

그리고 for 문장을 사용해서 우노보드의 아날로그포트에서 5개를 읽었다.

여기서 하고 싶은말은, 코딩 할떄 소설을 쓰지 말기 바라는것이다. 

이말은 한줄로 길게 작성하는것을 이야기 한다. 

A4 두장정도의 코딩을 단두줄로 줄인적도 있다. 

돈을 많이 받기 위해서 코딩을 늘리는 사람도 있겠지만, 

본인이 이해하고 모르는 사람들이 이해하기 좋게 하기 위햐서는 적은양의 코딩이 최고 이다.

 

다음은 void print_temp(Info& _info, char* p);를 설명하자.

사실 여기는 const를 넣어서 더 깔끔하게 코딩하는게 좋다. 

값을 수정하는게 아니라 읽기 위해서 구조체를 넘기기 떄문에 아무래도 좋을것 같다. 

그것보다 여기의 핵심은 char*p에 있다. 

버프의 시작주소를 넘겼다. 그리고 sprintf를 통해서 문장을 기록한다. 

그런데 P의 주소는 계속 이동한다. 기록한 문장의 크기만큼 이동하게 되어 있따. 

이유는 sprintf가 문장을 기록하고 기록한 크기를 p에 더하기 떄문이다.

여기서 약간 헷갈리수도 있는 부분은 p의 주소가 계속이동하는것이지, buf의 시작주소가 이동하는것은 아니다.

왜냐 하면 콜바이 밻류이기 떄문에 주소값이 복사 되어 있기 떄문에 buf와 P는 서로 다른공간에 존재한다.

단지 같은 값을 초기에 가지고 있을뿐이다.

 

간단한 함수같지만 나름 공부할게 있을것 같다.

 

void read_temp(Info& _info)
{
 
    for(int i =0; i<5;i++)
    {
      _info.Temp[i]  = analogRead (A0+i); 
      _info.Temp[i] *= 5.0 / 10.24
    }
    return  ;
}
 
 
void print_temp(Info& _info, char* p)
{
  
    p+= sprintf(p, "Temperature: ");
    for(int i =0; i<5;i++)
    {
        p+= sprintf(p, "%s", String(_info.Temp[i],2).c_str());
        p+= sprintf(p,  "C,  ");
    } 
    p+= sprintf(p,  "\n");
    
    return ; 
}
 

 

댓글