组件&C#的问题。。。小弟实在是不无法解决啊,高手看看
小弟我写了一个组件里面有一个关于磁盘寻道的FCFS算法,客户端是C#写的网页,但是在c#调用的时候出现了数组越界访问,可我怎么都看不出来,来论坛求助,请高手看看,指点迷津。。。客户端的代码:
protected void Button1_Click(object sender, EventArgs e)
{
Os_algClass testclass = new Os_algClass(); //创建组建对象
for(int a=0;a<System.Convert.ToInt16(TextBox2.Text);a++) //接受文本框中的数据并调用方法计算
{
string strText = "传出的数组是", anwFCFS = "",cv="" ;
int sum_FCFS = 0;
int[] arrNum = new int[10];
GetRam(10, 200, 1, ref arrNum); //getram该函数产生10个范围为0到200的随机数,放在arrNum中
int[] inFCFS = (int[])testclass.FCFS_P1(0, arrNum, 10, out sum_FCFS);
for (int i = 0; i < inFCFS.Length; i++)//将传出的数组元素值转换成string
{
if (i + 1 < inFCFS.Length)
{
anwFCFS = anwFCFS + inFCFS[i].ToString() + "、";
}
else if (i + 1 == inFCFS.Length)
{
anwFCFS = anwFCFS + inFCFS[i].ToString();
}
}
strText = strText + anwFCFS + "\r\n总寻道数是:" + sum_FCFS.ToString() + "\r\n";
TextBox1.Text = TextBox1.Text+ strText; //结果放在文本框中
}
}
组件端的代码:
STDMETHODIMP COs_alg::FCFS_P1(long now, VARIANT ask, long size, long *sum, VARIANT *sequen)
{
// TODO: Add your implementation code here
/* now 存取臂当前位置
ask 请求序列
size 是请求的数量
sum 经过的柱面数
sequen 访问顺序 */
//定义数组指针
long *pask;
//定义下界
long ask_LBound;
*sum=0;
//获取访问权 并得到下界
SafeArrayAccessData(ask.parray, (void HUGEP **) &pask);
SafeArrayGetLBound(ask.parray, 1, &ask_LBound);
vector<long> Vask;
vector<long> Vsequen;
Vask.push_back(now); //将now放置在向量之首
// 转换ask数组到Vask向量
long temp;
for (temp = 0; temp < size; ++temp)
{
Vask.push_back(pask[ask_LBound+temp]);
}
vector<long>::iterator it;
// 计算经过的柱面数的算法
for (it=Vask.begin(); it != Vask.end()-1; ++it)
{
*sum += abs( *(it+1)-*(it) );
}
// 访问顺序(FIFO顺序与请求顺序相同)
Vsequen = Vask;
// 转换Vsequen向量至sequen数组
//定义安全数组以及参数
SAFEARRAYBOUND saBound[1];
SAFEARRAY *pSA;
saBound[0].cElements = size+1;
saBound[0].lLbound = 0;
//创建安全数组 并将指针赋给pSA
pSA = SafeArrayCreate( VT_I4, 1, saBound );
temp = 0;
for (it=Vask.begin(); it != Vask.end(); ++it)
{
//使用API进行赋值
SafeArrayPutElement( pSA, &temp, &(*it) );
temp++;
}
//初始化变体
VariantInit( sequen );
//设定类型
sequen->vt=VT_I4|VT_ARRAY;
//数据赋值(当前为指针类型)
sequen->parray=pSA;
//释放访问权
SafeArrayUnaccessData(ask.parray);
//释放空间
SafeArrayDestroy(ask.parray);
return S_OK;
}
[[italic] 本帖最后由 nemozhang 于 2008-1-15 14:15 编辑 [/italic]]