找不到空間可以放程式,先把主體放上來,等找到空間再改
以下是程式碼
//從大二上之後就在也沒有碰過 C語言,寫這程式真的有點吃力,尤其是我也沒有學過物件導向的 C++,為了這個程式,還去念了一點書,但是還是無法寫出一個可以運作的結果,感謝實驗室學長的幫忙,我才知道要怎麼著手,但是還是模仿居多,為樂自己的專題著想,大肆還是多去研究點程式的寫法,不然會很淒慘吧。
//寫這程式,首先把老師的程式碼片段都給下載下來,然後好好的看了一下,之後亂拼湊一通,當然BUG一堆,慢慢修改過後,還是搞不定,舊只能丟個屍體出來。
//include的方法,請參閱各CPP的參考書
#include //這個表頭檔包含了所有的輸入輸出的function
using namespace std;
#include "PoissonArrival.h" //老師所給的.h檔案
#include "DynamicQueue.h" //老師所給的.h檔案
//程式本體內,有些變數沒有被宣告到,剛開始就給她ㄧ個值吧
//宣告一些常數
#define departure 2 這個值很重要,剛開始忘了宣告,會出現很多BUG
#define queued 3
#define DATA 2048
Dynamic_Link_Queue Schedular;
Dynamic_Link_Queue DataBuffer;
Queue Q;
//從下面開始,是老師寫的程式本體,複製下來就給它放進去吧
int main()
{
int Simulation_Status; //加入一些缺的宣告值
int new_packet_arrival=1; //加入ㄧ些缺的宣告值
double PacketGeneratingRate=0.0;
double PacketArrivalTime = 0.0;
double MeanPacketLength = 0.0; //integer in bytes,
int BufferSize = 0;
double LineSpeed = 0.0;
double SimulationTime = 0.0;
//try{ // 應該要有程式防止錯誤的輸入,這裡省略
cout<<"Packet Generating rate(Packets/sec):";
cin>>PacketGeneratingRate;
PacketArrivalTime = 1.0 / PacketGeneratingRate;
cout<<"Mean Packet Length(Bytes):";
cin>>MeanPacketLength;
cout<<"Buffer size:";
cin>>BufferSize;
cout<<"Line Speed(Bit/sec):";
cin>>LineSpeed;
cout<<"Simulation Time(sec):";
cin>>SimulationTime;
//}
double TimeStamp = 0.0;
PoissonArrival TrafficModel;
int channel_state = 0; //.....
// 系統初始化,手動加入第一個事件,這裡是封包產生事件
// 初始化效能統計參數
long total_data_packets = 0;
long total_departed_pakcets = 0;
double total_packet_system_time = 0.0;
double total_packet_queueing_time = 0.0;
long number_of_packet_queued = 0;
long number_of_blocked_data = 0;
double channel_time = 0.0; // 統計輸出線路忙線的時間
while(Schedular.get_event(Q) != Empty){} // 清空 Queue,這裡拿來示範,這兩行在這個程式沒作用
while(DataBuffer.get_event(Q) != Empty){}
Q.Scheduled_Time = TrafficModel.next_arrival(PacketArrivalTime);
Q.Create_Time = Q.Scheduled_Time;
Q.length = TrafficModel.frame_length(MeanPacketLength); // double, however it should be integer in bytes in realistic
Q.event = new_packet_arrival;
Q.data_type = DATA;
Q.seq_no = Schedular.seq_no++;
Schedular.join_from_head(Q);
//OutputFile1 = File_name->Text; // 輸出結果資料檔位置
cout<<"Running..."<
Simulation_Status = 1;
// 開始模擬
// transient state
while (TimeStamp<1000)>
{
Schedular.get_event(Q);
if (Schedular.seq_no > 200000000)
Schedular.seq_no = 0;
//Memo->Lines->Add(IntToStr(Schedular.count));
//Memo->Lines->Add(IntToStr(Q.event));
switch(Q.event)
{
case new_packet_arrival:
if (TimeStamp > Q.Scheduled_Time)
cout<<<">
else
{
TimeStamp = Q.Scheduled_Time;
if (channel_state == 0)
{
// 若有可用通道
Q.event = departure; //一剛開始就宣告它為一個常數
Q.Scheduled_Time = ((floor(Q.length) * 8) / LineSpeed) + TimeStamp;
++channel_state;
Schedular.join_from_end(Q);
cout<
}
else if (DataBuffer.count <>
{
// 若無可用通道但有可用buffer
Q.event = queued;
DataBuffer.join_from_end(Q);
cout<
}
else
{
// 若無可用通道也無可用buffer
// block this call
// not count in transient state
cout<
}
// schedule creating new data packet
Q.data_type = DATA;
Q.event = new_packet_arrival;
Q.Scheduled_Time = TrafficModel.next_arrival(PacketArrivalTime) + TimeStamp;
Q.Create_Time = Q.Scheduled_Time;
Q.length = TrafficModel.frame_length(MeanPacketLength);
Q.seq_no = Schedular.seq_no++;
Schedular.join_from_end(Q);
}
break;
case departure:
if (TimeStamp > Q.Scheduled_Time)
cout<<<"error447"<
else
{
TimeStamp = Q.Scheduled_Time;
// Recording
//if (used_channels <>
// Memo->Lines->Add("error248");
--channel_state; // 這樣寫是有風險的,但是也容易發覺蟲子
if (Q.data_type == DATA)
{
// 一定是
}
cout<
if (DataBuffer.count != 0)
{
DataBuffer.get_event(Q);
Q.event = departure;
Q.Scheduled_Time = ((floor(Q.length) * 8) / LineSpeed) + TimeStamp;
// 上式因為Q.length的結構是 double,不過一般封包長度是用byte做單位,所以做一些長度的修正
++channel_state;
Schedular.join_from_end(Q);
cout<
}
}
break;
}
}
// 開始模擬
// steady state
while (TimeStamp <>
{
// 加油,和上面的程式碼一樣,但要加上統計值的記錄
//TimeStamp += SimulationTime; // 只是讓迴圈結束
// 忍不住寫一下
Schedular.get_event(Q);
if (Schedular.seq_no > 200000000)
Schedular.seq_no = 0;
switch(Q.event)
{
case new_packet_arrival:
if (TimeStamp > Q.Scheduled_Time)
cout<<<"error503"<
else
{
TimeStamp = Q.Scheduled_Time;
++total_data_packets; // 產生的封包數+1
if (channel_state == 0)
{
// 若有可用通道
Q.event = departure;
Q.Scheduled_Time = ((floor(Q.length) * 8) / LineSpeed) + TimeStamp;
++channel_state;
Schedular.join_from_end(Q);
}
else if (DataBuffer.count <>
{
// 若無可用通道但有可用buffer
Q.event = queued;
DataBuffer.join_from_end(Q);
++number_of_packet_queued;
cout<
}
else
{
// 若無可用通道也無可用buffer
// block this call
++number_of_blocked_data;
}
// schedule creating new data packet
Q.data_type = DATA;
Q.event = new_packet_arrival;
Q.Scheduled_Time = TrafficModel.next_arrival(PacketArrivalTime) + TimeStamp;
Q.Create_Time = Q.Scheduled_Time;
Q.length = TrafficModel.frame_length(MeanPacketLength);
Q.seq_no = Schedular.seq_no++;
Schedular.join_from_end(Q);
}
break;
case departure:
if (TimeStamp > Q.Scheduled_Time)
cout<<<"error447"<
else
{
TimeStamp = Q.Scheduled_Time;
// Recording
++total_departed_pakcets;
total_packet_system_time += (TimeStamp - Q.Create_Time);
//if (used_channels <>
// Memo->Lines->Add("error248");
--channel_state; // 這樣寫是有風險的,但是也容易發覺蟲子
if (Q.data_type == DATA)
{
// 一定是
}
if (DataBuffer.count != 0)
{
DataBuffer.get_event(Q);
Q.event = departure;
Q.Scheduled_Time = ((floor(Q.length) * 8) / LineSpeed) + TimeStamp;
++channel_state;
Schedular.join_from_end(Q);
total_packet_queueing_time += (TimeStamp - Q.Create_Time);
}
}
break;
}
}
cout<<"Finished"<
Simulation_Status = 0;
// 效能計算
// 封包遺失率 = lost packet / generated packet; 這裡有一點誤差,因為沒有計算還在queue裡面的封包,不過因為數量太少影響不大。
double packet_loss_rate = double(number_of_blocked_data) / double(total_data_packets);
// 平均延遲時間
double average_delay = total_packet_system_time / double(total_departed_pakcets);
// 平均排程時間
double average_queueing_delay = total_packet_queueing_time / double(total_departed_pakcets);
// 平均排程時間 | if queued
double average_queueing_delay2 = total_packet_queueing_time / double(number_of_packet_queued);
cout<<"封包遺失率 = " <<>
cout<<"平均延遲時間 = " <<>
cout<<"平均排程時間 = " <<>
cout<<"平均排程時間 | if queued = " <<>
cin.get();
cin.get();
}
沒有留言:
張貼留言