연구

Tcl and OTcl for ns

이글은 이동욱님의 글을 나름대로 요약한 것이다. 원문은 아래 링크에 있다.
http://netmedia.gist.ac.kr/~dulee/tclns.html


Introduction

ns는 IP 기반의 네트워크 시뮬레이터이다. ns-2는 시뮬레이션 객체를 생성하고 그들 사이에 적당한 링크와 시나리오를 만드는데 스크립트 언어를 사용한다. 그 스크립트 언어가 바로 Tcl과 OTcl이다.

여기서는 간단하게 Tcl과 OTcl의 문법에 대해 설명한다. 이건 ns-2를 다루는데 아주아주 기초적인 것이므로 ns-2를 공부하는 사람이라면 기본적으로 알고 있어야 하는 내용이다.

Basic Tcl constructs

Variables and arrays

Tcl에서 변수를 정의하는 것은 매우 간단하다.
set var1 1
set var2 "Tcl Variable 2"

변수 앞에 $을 붙이면 그 변수는 변수로 인식되지 않고 변수에 할당된 값으로 인식된다. 이를 변수치환이라고 한다.
puts "var1=$var1, var2=$var2"
var1=1, var2=Tcl Variable 2

수식을 계산하기 위해서는 expr 명령을 사용한다. 아래는 5*10의 결과를 계산한 후 var3에 정의하는 것이다.
set var3 [expr 5*10]

Tcl에서는 배열도 지원하는데 사용방법은 아래와 같다.
set n(0) [$ns node]
set n(1) [$ns node]
set opt(rp) DSDV
set opt(tr) "/tmp/temp.tr"

첫 번째 예에서 배열명은 n이고, 인덱스는 숫자형이다. 두 번째 예에서 배열명은 opt이고 인덱스는 문자형이다.

For loops
For loop는 반복 작업을 간단하게 해주는 매우 유용한 명령어이다. 아래는 100개의 노드를 생성하는 예제이다.
for {set i 0}{$i < 100}{incr i} {
    set n($i) [$ns node]
}

While loops
For loop와 같은 기능을 한다. 아래는 For loop와 같은 예제이다.
set i 0
while {$i < 10} {
    set n($i) [new Node]
    incr i
}

If statement
If문도 역시 간단하다. 예제를 보면 쉽게 이해할 수 있다.
if {$i < 10} {
    puts "i is less than 10"
}
if {$var2 == "Tcl Variable 2"} {
    puts "var2 = Tcl Variable 2"
}

Procedures
프로시저는 c/c++에서 함수나 메서드와 같다고 생각하면 된다. 프로시저는 proc라는 키워드를 통해 선언할 수 있다. 아래는 프로시저를 선언하는 방법이다.
proc proc1 {} {
    puts "in procedure proc1"
}

선언한 프로시저를 사용할 때는 단순히 프로시저명을 적어주면 된다.
proc1
in procedure proc1
 
매개변수가 있는 프로시저는 아래와 같이 선언한다.
proc proc2 {parameter1} {
    puts "the value of parameter1 is $parameter1"
}

매개변수를 사용하려면 매개변수를 프로시저명 뒤에 적어주면 된다.
proc2 10
the value of parameter1 is 10


OTcl constructs

OTcl은 Tcl에 Object Oriented 개념이 들어간 것이다.

OTcl classes and objects
OTcl은 class 키워드를 이용해서 클래스를 정의하고, superclass 키워드를 이용해서 상속을 한다. 그러나 클래스를 정의하면서 미리 멤버데이터를 정의할 순 없다. 클래스를 생성하고 객체를 생성하는 예를 보면 아래와 같다.
class MyNode -superclass Node
set mynodevar [new MyNode]

Class member functions
C++와 다르게 OTcl에서는 클래스를 만든 다음에 클래스 멤버 펑션을 정의한다.
MyNode instproc memberfn1 {} {
    puts "in member function 1"
}

MyNode 클래스에 memberfn1 이라는 프로시저를 정의하였다. 프로시저를 호출하는 예를 살펴보면 아래와 같다.
set myobj [new MyNode]
$myobj memberfn1

Class data
클래스 데이터 멤버는 instvar 키워드를 이용해 클래스 내에서 정의한다.
MyNode instproc memberfn2 {} {
    $self instvar datamember1
    set datamember1 "data member - memberfn2"
}
MyNode instproc memberfn3 {} {
    $self instvar datamember1
    puts "datamember1 = $datamember1"
}
set myobj [new MyNode]
$myobj memberfn2
$myobj memberfn3
MyNode 객체인 myobj를 생성한다. myobj 객체에서 memberfn2 프로시저를 호출하면 memberfn2 프로시저에서는 datamember1 데이터 멤버에 값을 할당한다. 다음에 myobj가 memberfn3을 호출하면 memberfn2에 할당된 값을 출력한다.

Object initialisation
C++에서는 객체를 생성할 때 생성자라는 메서드에서 멤버 데이터들을 초기화 해준다. OTcl에서는 C++과 유사한 기능을 init 키워드를 호출함으로써 할 수 있다.
MyNode instproc init {} {
    $self next
    $self instvar datamember1
    set datamember1 0
}

OTcl에서도 C++과 마찬가지로 생성자에 파라미터를 추가할 수 있다.
MyNode2 instproc init {arg1 arg2} {
    $self next
    $self instvar dm1 dm2
    set dm1 $arg1
    set dm2 $arg2
}

set mn2 [new MyNode2 1 2]

이올린에 북마크하기(0) 이올린에 추천하기(0)
top
Tag , ,


http://www.joon.pe.kr/blog/trackback/57
Commented by 빛무리 at 2008/10/16 21:18  Reply|Edit|Delete
좋은 정보 감사합니다.



<< Prev   1   ... 279   280   281   282   283   284   285   286   287   ... 336   Next >>