2008年3月30日 星期日
NS2---Scanning procedure
Step 1. SS會監測incoming packet其singal level,若是singal level超過某一threshold,MS則會傳送MOB_SCN_REQ給serving BS.
Step 2. BS收到後會回傳MOB_SCN_RSP給SS,告知SS是否可進行scanning,若是可以則SS會開始進行scanning
Continue......
2008年3月29日 星期六
C的內建function與macro
1. int strcmp(string s, string t)---
功用: 字串之間的比較.此function主要是判斷s與t之間的大小,若是s = t則傳回整數0;若s大於t則傳回任一正數;若s小於t則傳回任意負數.
2. assert(condition)---
功用: 防止程式因某些condition而出現嚴重錯誤. assert()主要是判斷condition是否滿足開發者所設定的要求,若是滿足則可繼續執行後續的程式,反之,終止整個程序.另外ASSERT()與assert()兩者主要差別是前者只在Debug模式中才有效,後者則是在Debug與Release兩種模式中都有效.
3. atof(const char *sc)---
功用: 字元轉型. atof()主要會先scan參數sc,將其面空白符號先跳過,直到遇上數字或是正負號才開始進行轉換.遇到非數字或是參數sc結束時才會停止轉換,並將結果傳回.除此之外,類似的function還有: atoi(), atol(), strtod(), strtol(), strtoul().
4. memset(void *s, char ch, unsigned n)---
功用: 將s中的字元取代成ch,取代長度為n. memset()可應用於字元陣列的清空...等等,目的在於將A,依自己所需取代成B.以下為一範例: #include
#include
void main( void )
{
char buffer[] = "This is a test of the memset function";
printf( "Before: %s\n", buffer );
memset( buffer, '*', 4 );
printf( "After: %s\n", buffer );
}
結果:
Before: This is a test of the memset function
After: **** is a test of the memset function
5.malloc/free ---
功用:動態配置/釋放記憶體. malloc與new的用法類似,不一樣的地方在於使用malloc時不能同時給予初值.以下為malloc格式與範例:
格式:
變數型態* point = (變數型態*) malloc (記憶體空間大小);
範例:
int* p = (int*) malloc (sizeof(int));
free主要是將一配置的記憶體空間,經由所輸入的記憶體空間之起始指標來加以釋放.以下為其格式與範例
格式:
free(point);
範例:
free(*p);
6. sqrt()---
功用: 將傳入之參數開根號.
7. int abs()---
功用: 將傳入的參數取絕對值. 另外還有應付回傳各種型態的abs, 如: double cabs(), double fabs(), long labs()等.
若是還有遇到其他的function或macro我會繼續更新此篇文章~
Continue......
2008年3月27日 星期四
.Net農民曆改版V2.0
using System;
using System.Collections.Generic;
using System.Text;using System.Globalization;
namespace TimeTran{
class Program {
static int Main(string[] args) {
string s = "91 / 2 / 9";
int L_ly,ly,lm,y,ny,nm=0,iToken1,iToken2;
string strny,tT,S;
string[] dateFormats = { "yyyy/MM/dd", "yyy/MM/dd", "yy/MM/dd", "y/MM/dd", "yyyy-MM-dd", "yyy-MM-dd", "yy-MM-dd", "y-MM-dd", "yyyy/M/dd","yyy/M/dd","yy/M/dd","y/M/dd", "yyyy-M-dd","yyy-M-dd","yy-M-dd","y-M-dd", "yyyy/MM/d","yyy/MM/d","yy/MM/d","y/MM/d", "yyyy-MM-d","yyy-MM-d","yy-MM-d","y-MM-d", "yyyy/M/d","yyy/M/d","yy/M/d","y/M/d", "yyyy-M-d","yyy-M-d","yy-M-d","y-M-d"};
ChineseLunisolarCalendar tl = new ChineseLunisolarCalendar();
S = s.Replace(" ", "");
iToken1 = S.IndexOf("/", 0);
iToken2 = S.IndexOf("/", iToken1 + 1);
string iYear = S.Substring(0, iToken1).Trim();
string iMonth = S.Substring(iToken1+1, iToken2-iToken1-1).Trim();
string iDay = S.Substring(iToken2+1).Trim();
ny = int.Parse(iYear) + 1911;
strny = ny.ToString();
tT = strny + "/" + iMonth + "/" + iDay;
DateTime dy = DateTime.ParseExact(tT, dateFormats, null, DateTimeStyles.AllowWhiteSpaces);
ly = tl.GetYear(dy);
lm = tl.GetMonth(dy);
if (tl.IsLeapYear(ly)) //判斷此農曆年是否為閏年
{
L_ly = tl.GetLeapMonth(ly); //抓出此閏年閏何月
switch(L_ly)
{
case 1:
if (lm >= 1)
lm--;
break;
case 2:
if (lm >= 2)
lm--;
break;
case 3:
if (lm >= 3)
lm--;
break;
case 4:
if (lm >= 4)
lm--;
break;
case 5:
if (lm >= 5)
lm--;
break;
case 6:
if (lm >= 6)
lm--;
break;
case 7:
if (lm >= 7)
lm--;
break;
case 8:
if (lm >= 8)
lm--;
break;
case 9:
if (lm >= 9)
lm--;
break;
case 10:
if (lm >= 10)
lm--;
break;
case 11:
if (lm >= 11)
lm--;
break;
case 12:
if (lm >= 12)
lm--;
break;
default:
if (lm >= 13)
lm--;
break;
}
}
else
lm = tl.GetMonth(dy);
Console.WriteLine(DateTime.Now);
Console.WriteLine("國曆:" + tT);
Console.WriteLine("陰曆:" + tl.GetYear(dy) + "/" + lm + "/" + tl.GetDayOfMonth(dy));
return 0;
}
}
}
2008年3月22日 星期六
.Net之農民曆轉換
由於在仁耀的系統中需要做到陽曆轉陰曆的功能,所以嘗試用.Net所開發的System.Globalizatoin (namespace) -- http://msdn2.microsoft.com/zh-tw/library/system.globalization(VS.80).aspx 來達到此目的.
因為需要用到台灣陽曆轉陰曆的功能,因此我使用了TaiwanLunisolarCalendar 類別 -- http://msdn2.microsoft.com/zh-tw/library/system.globalization.taiwanlunisolarcalendar(VS.80).aspx ,此類別是專門針對台灣的曆法所發展出來的類別,透過其已開發好的method便可將所輸入的陰曆轉換成農曆!!以下為我所寫的C#範例:
using System;using System.Collections.Generic;
using System.Text;
using System.Globalization;
namespace TimeTran
{
class Program
{
static int Main(string[] args)
{
string s = "58 / 12 / 23";
int y,ny,sToken1,sToken2;
string ly,strny,tT,S;
string[] dateFormats = { "yyyy/MM/dd", "yyy/MM/dd", "yy/MM/dd", "y/MM/dd", "yyyy-MM-dd", "yyy-MM-dd", "yy-MM-dd", "y-MM-dd", "yyyy/M/dd","yyy/M/dd","yy/M/dd","y/M/dd", "yyyy-M-dd","yyy-M-dd","yy-M-dd","y-M-dd", "yyyy/MM/d","yyy/MM/d","yy/MM/d","y/MM/d", "yyyy-MM-d","yyy-MM-d","yy-MM-d","y-MM-d", "yyyy/M/d","yyy/M/d","yy/M/d","y/M/d", "yyyy-M-d","yyy-M-d","yy-M-d","y-M-d"};
TaiwanLunisolarCalendar tl = new TaiwanLunisolarCalendar();
S = s.Replace(" ", ""); //將字串內的空白消去
sToken1 = S.IndexOf("/", 0); //抓出字串內第一個/的位置
sToken2 = S.IndexOf("/", iToken1 + 1);
string nYear = S.Substring(0, iToken1).Trim(); //抓出字串中的新曆年
string nMonth = S.Substring(iToken1+1, iToken2-iToken1-1).Trim();
string nDay = S.Substring(iToken2+1).Trim();
ny = int.Parse(iYear) + 1911; //將民國轉成西元
strny = ny.ToString();
tT = strny +"/"+ iMonth +"/"+ iDay;
DateTime dy = DateTime.ParseExact(tT, dateFormats, null, DateTimeStyles.AllowWhiteSpaces); //須先將字串轉成DataTime的型態,以供TaiwanLunisolarCalendar的物件tl使用
Console.WriteLine(DateTime.Now);
Console.WriteLine("國曆:" + tT);
Console.WriteLine("陰曆:" + tl.GetYear(dy) + "/" + tl.GetMonth(dy) + "/" + tl.GetDayOfMonth(dy)); //將欲轉換的日期傳進.Net以寫好的方法內,接著再傳回轉換好的農曆
return 0;
}
}
}
End~
2008年3月13日 星期四
[C++]的argc & argv
Ex.
若是你寫好一隻程式叫Hell.cc並且已經將其編譯成Hello.exe,當你在Terminal要執行Hello.exe的時候,你則又可能執行以下的command:
$Hello.exe hello all
那這時你的argc則為3,argv[0]=Hello.exe,argv[1]=hello,argv[2]=all.
由此看來,argc則為你在command line所下的參數個數,argv[]則分別存放你所下的每個參數.
End~~
2008年3月10日 星期一
設定BS的覆蓋範圍
# Initialize the SharedMedia interface with parameters to make
# it work like the 914MHz Lucent WaveLAN DSSS radio interface
Phy/WirelessPhy set CPThresh_ 10.0
Phy/WirelessPhy set CSThresh_ 1.559e-11
Phy/WirelessPhy set RXThresh_ 3.652e-10
Phy/WirelessPhy set bandwidth_ 2e6
Phy/WirelessPhy set Pt_ 0.28183815
Phy/WirelessPhy set freq_ 914e+6
Phy/WirelessPhy set L_ 1.0
Phy/WiredPhy set bandwidth_ 10e6
在ns-2.29/indep-utils/propagation/threshold.cc內可以得知,FreeSpace與TwoRayGround兩種model計算Pr的方式:
double TwoRay(double Pt, double Gt, double Gr, double ht, double hr, double L, double d, double lambda)
{
/*
* if d <>= crossover_dist, use two ray model
*
* Two-ray ground reflection model.
*
* Pt * Gt * Gr * (ht^2 * hr^2)
* Pr = ----------------------------
* d^4 * L
*
* The original equation in Rappaport's book assumes L = 1.
* To be consistant with the free space equation, L is added here.
*/
double Pr; // received power
double crossover_dist = (4 * M_PI * ht * hr) / lambda;
if (d < pr =" Friis(Pt," pr =" Pt">
Pr:在程式中即為RXThresh_也就是要在tcl所設定的數值
Pt = transmit power
Gt = transmit antenna gain
Gr = receive antenna gain
ht = transmit antenna height
hr = receive antenna height
d = distance (例如250m)
根據網路上鎖參考的資料,我們可以透過編譯threshold.cc來產生一個執行檔,再經由輸入相對應的參數至所產生的執行檔,即可得到RXThresh_,以下敘述如何產生出RXThresh_:
Step1.
在ns-2.29/indep-utils/propagation/ 執行以下的編譯指令:
$g++ threshold.cc -o calculate
Step2.
若要執行計算某distance其相對應的RXThresh_,則執行以下指令:
$./calculate -m TwoRayGround -fr 3.5e+9 250
(計算model為TwoRayGround,且frequency為3.5MHz,距離250M)
如此即可計算出RXThresh_ .
reference:
http://hi.baidu.com/vvfang/blog/item/bf834c0fc3b4ab296159f344.html
http://blog.pixnet.net/NS2lab/post/10050300
2008年3月9日 星期日
Grey Prediction!!
假設有Array A[2,2]
Step1.
計算det(A) = (A[0,0]*A[1,1]) - (A[0,1]*A[1,0])
Step2.
A反矩陣之[0,0]= 1/(-det(A)) * A[1,1]
A反矩陣之[0,1]= 1/(-det(A)) * -A[0,1]
A反矩陣之[1,0]= 1/(-det(A)) * -A[1,0]
A反矩陣之[1,1]= 1/(-det(A)) * A[0,0]
End~