for Robot Artificial Inteligence

포인터, 더블포인터 쉽게 이해하기

|

포인터와 reference와 관계를 이해하려면 아래와 같이 이해하면 된다

int x // 0차원
int *p // 포인터 1차원

p = x // 1차원인 포인터가 0차원을 가리키는것은 address이다.
p = &x // ref 1 차원이 맞으며 Address가 아닌 element를 가르킨다

즉,

포인터는 기본적으로 요소의 address를 가르키게 된다.

int *p;
int x = 5;
*p = x;

포인터가 일반적인 변수의 요소를 가르키고 싶으면 이때 Reference를 붙여줘서 address에서 element로 up시켜주면 된다.

높은 차원을 가지고 있는 element를 가르키고 싶은 경우 포인터 수를 늘려서 요소를 가르키면 된다.(행렬은 기본적으로 요소를 포인팅 한다)

행렬의 element는 pointer로만 접근 하거나 “[]”로 얻을 수 있다.

이에 포인터로 행렬의 element를 접근을 하려면 차원의 수에 디펜던시로 포인터를 추가한다.

즉 2D array이면 더블포인터로 차원수를 맞춰주고 3D면 트리플포인터로 접근을 해야된다.

#include <iostream>
using namespace std;
void prn(int *pa, int size);
int main()
{
  int a[5] = {10,20,30,40,50};
  prn(a,5);
}
void prn(int * pa, int size) // POINTING ARRAY
{
  for(int i = 0; i<size; i++)
  {
    cout <<"\t" <<(*pa+i); // pa[i]로도 표현 가능
  }  
}
#include <iostream>
using namespace std;
void main()
{
  int a[5] = {10,20,30,40,50};
  int b[5] = {60,70,80,90,100};

  int *p[2] = {a,b}; // p pointing a, b array

  cout<<p[0][0]; // 10
  cout << p[1][0]; //60
}
#include <iostream>
using namespace std;
#define ROW 3;
#define COL 4;
void main()
{
  int a[ROW][COL] = { {90, 85, 95,100},
                      {75, 95, 80, 90},
                      {90, 80, 70, 60}};
  int r,c;
  for(r=0;r<ROW;r++)
  {
    for(c=0;c<COL;c++)
    {
      cout<<* ( *(a+r)+c); // a is init addres and + + // all the elements is 4 byte neighbors following previous one.
    }
  }
}

함수 포인터를 사용해서 함수 호출하기

#include <iostream>
using namespace std;
/* 함수를 가리키는 포인터 변수 선언 */
void(*pf)(void);
void one()
{
  cout<<"one";
}
void two()
{
  cout<<"two";
}
void three()
{
  cout<<"three";
}
void main()
{
  pf = one;
  pf();

  pf = two;
  pf();

  pf = tree;
  pf();
}

Comment  Read more

선행처리자의 이해 수정필요

|

c++프로그램을 컴파일하는 과정은 작성한 소스파일이 컴파일러에서 오브젝트파일이 생성이 되고, 다시 링커에 의해 실행파일 된다. 이 중 컴파일을 하기 앞서 소스파일에 대한 처리를 가장 먼저 하는 것이 선행처리다.

소스파일 -> 헤더파일 - 선행처리기 -> 전처리 마친 소스 파일 -> 컴파일러 - 라이브러리 -> 오브젝트 파일 -> 링커 -> 실행 파일

Comment  Read more

Noetic Macro problem.

|

Melodic 패키지를 Noetic에다 사용하다 보면 Xacro에 정의된 marco 함수에 에러가 생길 떄가 있다.

Macro로 편리하게 방정식을 세워서 쉽게 식을 구할 수 있어 잘 활용하면, 반복적인 방법을 피할 수 있지만

Noetic에서 Macro함수를 이해못하는 경우가 있기 때문에 사용을 피하는 것이 좋다.

또한 Noetic은 Python3버전을 지원하기 떄문에 python파일 맨 위에 python3경로를 선언해 줘야 한다.

#! /usr/bin/python3.

Comment  Read more

undefined reference[C++, ROS]

|

오늘은 undefined reference to 에러에 대해 알아보겠습니다. 결론적으로 이 에러는 컴파일 시, 헤더 파일에 선언은 되어있으나, 소스 파일에 정의가 안되어 있다는 의미입니다. 함수는 보통 헤더 파일에 선언이 되고, 소스 파일에 정의를 하여서 많이 사용합니다

즉, 오타가 많더라구요. 그 외의 경우는 헤더파일이 빠져있는 경우도 많았습니다.

한 달동안 C 코드를 안하다 보니, 코딩을하는데 많은 부분을 까먹었다.

특히, 코딩중 undefined reference가 많이 나왔는데 주로 일어나는 이유가

  1. header 파일을 cpp에 지정 하지 않았다.
  2. CMAKE에 find package, target library, execute, add library
  3. package.xml
  4. 불러오는 class에 Constructor(Initialization)만 하고 destructor를 안해주면, 위와 같은 undefined reference문제가 나온다.
  5. call 하는 실제 함수가 없다
  6. cpp파일에서 c파일에서 구현하는 함수를 call 할때 발생(해결 방법 https://simmmmmk.tistory.com/19)
  7. target_link_libraries 항목을 찾아서 해당 라이브러리 이름을 추가해주면 되겠습니다

즉 확인

  • 메소드를 구현했는가? .h에 선언만 해 놓고 .cpp에 구현은 아직 안 한게 아닌가?

  • .cpp에 scope를 잘 지정했는가? void ClassName::method(){}이렇게 namespace를 잘 지정해줬는가?

    1. 생성자 구현을 헤더 파일안에서 inline으로 해주거나, 2. g++로 컴파일할때 링크를 건드리거나.
  • 이에 Cmake에서는 add_library를 target_link_libraries에다 연걸 마지막 add_executable, 실행 파일에다가 링크 지정을 해줘야 한다. 그래야 undefined error를 피할 수 있다.

Comment  Read more

~ is private within this context"[C++, ROS]

|

/home/chan/catkin_ws/src/height_map/src/Height_Mapping.cpp:13:32: error: ‘virtual height_map::HeightMAP::~HeightMAP()’ is private within this context

13 | HeightMAP hello(nodeHandle_);

모듈에 nodehandle을 여러 class에 사용할때 contructor와 destructor를 class Publich에 구조화 하지 않았다면, 특정 클래스에서 constructor와 destructor이 publich으로 선언이 되지않았는데, 다른 클래스에서 call이 된다면, 접근에 대한 에러로 이런 문제가 뜬다.

class A{
public:
  A();
  ~A();
}

Comment  Read more