for Robot Artificial Inteligence

2. Essential concept(Parameter passing, structure and function)

|

Parameter Passing Methods

int add(int& a, int& b)
{
  int c;
  c= a+b;
  return(c);
}
int main()
{
  int x,y,z;
  x= 10;
  y= 5;
  z = add(x,y);
  cout<<z;
}

  • Main에 생성된 data variable값을 그대로 Reference(즉 address에 있는 값을 공유하여 int a, int b의 어드레스를 x,y어드레스로 한다)

arrays as Parameter

void fun(int A[], int n)
{
  int i;
  for (i=0; i<n;i++)
    cout<<A[i];
}
int main()
{
  int A[5] = {2,4,6,8,10};
  fun(A,5);
}

  • Array an be passed only by address.
    • array parameter is working as a pointer which is pointing actual parameter.
    • actual parameter is address variable of array in base.
  • it can use pointer instead of int A[], like this
void fun(int* A, int n)
{
  int i;
  for (i=0; i<n;i++)
    cout<<A[i];
}
int main()
{
  int A[5] = {2,4,6,8,10};
  fun(A,5);
}
  • explain as above we can test
    void fun(int A[], int n)
    {
    A[0] = 25;
    }
    int main()
    {
    int A[5] = {2,4,6,8,10};
    fun(A,5);
    }
    

  • Value가 교체 된다.

Example

int[] fun(int n) // 리턴 값 데이터 유형이 int array형식
{
  int * p;
  p = new int[n]
  return p;
}
int main()
{
  int * A;
  A = fun(5);
  ---
  ---
}

int* fun(int n) // 리턴 값이 int 데이터 형식의 포인터 리턴
{
  int * p;
  p = new int[n]
  return p;
}
int main()
{
  int * A;
  A = fun(5);
  ---
  ---
}
  • Modern C++ 스타일로 이렇게 바꿀수 있다.
    int[] fun(int n) // 리턴 값 데이터 유형이 int array형식
    {
    std::share_ptr<int> p(new int[n]);
    return p;
    }
    int main()
    {
    std::share_ptr<int> A;
    A = fun(5);
    ---
    ---
    }
    
int* fun(int n) // 리턴 값이 int 데이터 형식의 포인터 리턴
{
  std::share_ptr<int> p(new int[n]);
  return p;
}
int main()
{
  std::share_ptr<int> A;
  A = fun(5);
  ---
  ---
}

Structure as Parameter

struct Rectangle
{
  int length;
  int height;
};
int area(struct Rectangle n)
{
  return n.length * n.height;
}
int main()
{
  struct Rectangle r = {10,5}
  area(r)
}

  • function parameter에 struct Ractangle 데이터 스타일의 n을 새롭게 스택에 생성하여 copy한다.

  • Refernce를 이용하여 새로운 데이터 variable을 생성하지 않고 address를 받아 쓰는 방법을 보자.

struct Rectangle
{
  int length;
  int height;
};
int area(struct Rectangle& n)
{
  return n.length * n.height;
}
int main()
{
  struct Rectangle r = {10,5}
  area(r)
}

Example

  • point터를 이용한 값 바꾸기
    struct Rectangle
    {
    int length;
    int height;
    };
    int changeLength(struct Rectangle* p, int x)
    {
    p->length = x;
    }
    int main()
    {
    struct Rectangle r = {10,5}
    changeLength(&r, 20)
    }
    

  • Reference를 이용한 값 바꾸기.
struct Rectangle
{
  int length;
  int height;
};
int changeLength(struct Rectangle& p, int x)
{
  p.length = x;
}
int main()
{
  struct Rectangle r = {10,5};
  changeLength(r, 20);
}

Example 2

void fun(struct Test t1)
{
  t1.A[0] = 10
  t1.n = 4;

}
struct Test
{
  int A[5];
  int n;
}
int main()
{
  struct Test t = {2,4,6,8,10}, 5;
  fun(t);
}
// 여기서도 t의 rvalue에 {}를 더 붙여야 하는데 안됨.. Jekyll..

structure and Functions

struct Rectangle
{
  int length;
  int height;
};
void initilize(struct Rectangle *r, int l, int b)
{
  r->length = l;
  r->height = b;
}
int area(struct Rectangle& r)
{
  return r.length * r.height;
}
void changeLength(struct Rectangle* r, int l)
{
  r->length=l;
}
int main()
{
  struct Rectangle r;

  initialize(&r,10,5);
  area(r);
  changeLength(&r,20);
}

Class and Constructor.

  • class는 오직 C++에만 있다.
  • Struct하고 비슷한 기능이지만 다른점은
    • Struct은 기본이 Public 이고
    • class는 기본이 Private 이다.
  • class에는 public, private, protect 3가지가 있다.
    • public은 다른 로컬 펑션이나 매인에서 class를 이용하여 사용할 수 있다.
    • private은 오직 해당 Class에서만 사용이 된다. 다른 로컬 펑션이나 메인에서 가져와 쓸 수 없다.
    • protected는 파생 클래스의 정의부에서 접근이 가능하지만 외부에서는 접근 불가하다.
  • Struct을 아래와 같이 바꿀 수 있다.
class Rectangle
{
public:
  Rectangle(int length, int height) : length_(length), height_(height) {}
  int area()
  {
      return length_ * height_;
  }
  void changeLength(int l)
  {
      length_=l;
  }
private:
  int length_;
  int height_;
};
int main()
{
  Rectangle r(10,5);
  int a = r.area();
  std::cout<<a<<" "; //50
  r.changeLength(20);
  a = r.area(); //100
  std::cout<<a<<" ";
  return 0;
}

Example

#include <iostream>
using namespace std;
class Rectangle
{
public:
  Rectangle(int length, int height) : length_(length), height_(height){}
  int area();
  int perimeter();
  int setLength(int k);
  int getLength();
  ~Rectangle();
private:
  int length_;
  int height_;
};
Rectangle::area()
{
  return length_*height_;
}
Rectangle::perimeter()
{
  return 2*(length_+height_);
}
Rectangle::setLength(int k)
{
  length_=k;
}
Rectangle::getLength()
{
  return length_;
}
Rectangle::~Rectangle()
{
}
int main()
{
  Rectangle r(10,5);
  cout<<r.area()<<" ";
  cout<<r.perimeter()<<" ";
  r.setLength(20);
  cout<<r.getLength()<<" ";
  return 0;
}

Template Class

  • Data 타입을 컴파일할떄 자동으로 맞춰준다.
    • 편하다
    • Class던 Data 타입이던 다 자동으로 할 수 있다.
  • Template 사용전
class Arithmateic
{
private:
  int a_;
  int b_;
public:
  Arithmateic(int a, int b) : a_(a), b_(b) {}
  int add();
  int sub();
}

Arithmateic::add()
{
  return a_ + b_;
}
Arithmateic::sub(){
  return a_ - B_;
}
int main()
{
  Arithmatic A(5,1);
  A.add();
  A.sub();
  return 0;
}
  • template 사용 후
#include <iostream>
using namespace std;
template <class T> // class안에 있는 data variable의 데이터 타입을 자동으로 맞춘다.
class Arithmateic
{
private:
  T a_;
  T b_;
public:
  Arithmateic(T a, T b) : a_(a), b_(b) {}
  T add();
  T sub();
};
template <class T>
T Arithmateic<T>::add()
{
  return a_ + b_;
}
template <class T>
T Arithmateic<T>::sub(){
  return a_ - b_;
}
int main()
{
  Arithmateic<int> A(5,1);
  A.add();
  A.sub();
  return 0;
}

Comments