C#中调用动态链接库,需要使用C/C++中的结构体类型变量作为函数参数,求解决??!!
//SeqSearch.aspx.cs代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using KeyType = System.Int32;
namespace SeqSearchWeb
{
public unsafe struct SSTable //define structure SSTable
{
public KeyType* elem;
public int length;
};
public partial class SeqSearch : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
int[] elem = new int[100];
SSTable ST = new SSTable();
protected void Button1_Click(object sender, EventArgs e)
{
ST.length = Convert.ToInt32(TextBox3.Text);
Random ra=new Random(unchecked((int)DateTime.Now.Ticks));
for(int i=1;i<=ST.length;i++)
{
elem[i] = ra.Next(0, 99); //调用随机函数random()初始化成员 ST.elem
this.Label3.Text += Convert.ToString(elem[i]) + " ";
}
}
protected void TextBox1_TextChanged(object sender, EventArgs e)
{
}
unsafe private int Search_Seq(SSTable ST, KeyType key)
{
ST.length = Convert.ToInt32(TextBox3.Text);
try
{
for (int i = 1; i <= ST.length; i++)
{
ST.elem[i] = elem[i];
}
}
catch(Exception ex)
{
Label2.Text = ex.Message;
}
SeqSearchLib.Class1 search = new SeqSearchLib.Class1();
int result = search.Search_Seq1(ST, key); //出错
return result;
}
protected void Button2_Click(object sender, EventArgs e)
{
KeyType key = Convert.ToInt32(TextBox2.Text);
SSTable ST = new SSTable();
int result = Search_Seq(ST,key);
this.Label2.Text = result.ToString();
}
protected void TextBox2_TextChanged(object sender, EventArgs e)
{
}
protected void TextBox3_TextChanged(object sender, EventArgs e)
{
}
}
}
////Class1.cs动态链接库代码:
[code=csharp]using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using KeyType = System.Int32;
namespace SeqSearchLib
{
public unsafe struct SSTable //define structure SSTable
{
public KeyType* elem;
public int length;
};
public class Class1
{
[DllImport("SeqSearch.dll", EntryPoint = "Search_Seq")]
private static extern int Search_Seq(SSTable ST, KeyType key);
public int Search_Seq1(SSTable ST, KeyType key)
{
int find = Search_Seq(ST, key);
return find;
}
}
}
//SeqSearch.h头文件:
#pragma once
# include <stdio.h>
# include <stdlib.h> //used for the function exit()
# include <time.h>
#define random(x) (rand()%x)
typedef int KeyType;
/*
数据结构:SSTable //定义顺序查找表的数据结构
结构成员:
KeyType *elem; //数据元素存储空间基地址,建表时按实际长度分配,0号单元留空
int length; //表长度
结构方法:
*/
structSSTable//define structure SSTable
{ KeyType *elem;
int length;
};
extern "C" _declspec(dllexport) int Search_Seq(SSTable ST,KeyType key); //Search_Seq()
extern "C" _declspec(dllexport) struct SSTable; //SSTable
class CSeqSearch
{
public:
CSeqSearch(void);
~CSeqSearch(void);
static int Search_Seq(SSTable ST,KeyType key);
};
////SeqSearch.cpp文件:
#include "SeqSearch.h"
CSeqSearch::CSeqSearch(void)
{
}
CSeqSearch::~CSeqSearch(void)
{
}
/*
Function: 顺序表查找
对一份顺序存储的数表进行查找操作
Parameters:
SSTable ST -- 已初始化的静态查找表
KeyType key -- 待查找的关键字
FILE* fp -- 指向任务日志的文件指针,用于追加写入日志
Returns:
返回所查找的关键字所在的位置值,调用函数后将操作输入一个日志文件,并在屏幕上显示出来
Example:
23 24 66 72 387 40 2 52 101 99 441 33
输入查找关键字40,调用函数,则输出位置6,并将结果写入日志文件且屏幕输出
*/
int CSeqSearch::Search_Seq(SSTable ST,KeyType key) //Search_Seq()
{ //在顺序表ST中顺序查找关键字为key的数据元素,结果记录在fp指向的日志文件中
int i;
ST.elem[0]=key; //0号单元作“哨兵”
for(i=ST.length;!(ST.elem[i]==key);--i) //从后往前找
;
return (i); //找不到时,i为0,否则返回关键字位置i
}//Search_Seq
int Search_Seq(SSTable ST,KeyType key)
{
return CSeqSearch::Search_Seq(ST, key);
}
////SeqSearch.aspx
功能:从Web端由用户产生随机数列,按顺序查找方式查找指定数字。
Textbox3输入Length值,点击Button1,Label3显示产生的数列;
TextBox2输入要查找的数字key,点击Button2,Label2显示查找结果。
结果SeqSearchWeb文件生成解决方案出错:
错误2参数 1: 无法从“SeqSearchWeb.SSTable”转换为“SeqSearchLib.SSTable”
错误1与“SeqSearchLib.Class1.Search_Seq1(SeqSearchLib.SSTable, int)”最匹配的重载方法具有一些无效参数 WebService??? ASP.NET? C#
[解决办法]
看了一下你的代码....
发现了一些错误...
1。第61行ST.elem[I]= ELEM[];
但是你自始至终都没有对ST.elem做宣告哪来的ELEM[I]给你放资料?
(2)第72行= search.Search_Seq1(ST,重点)//出错
你的程序类别SeqSearch里面根本没有Search_Seq1()这个函式(只有Search_Seq())
唯一的一个Search_Seq1是在Class1的里面...
你先弄清楚这些吧?
[解决办法]
这是你写的程式?还是抄来改的?
逻辑很奇怪@ @
尤其是Search_Seq()与Search_Seq1()
Search_Seq()里面引用Search_Seq1()的
而Search_Seq1()里面又呼叫Search_Seq()
.....
建议你先把你要做的流程分析清楚?
[解决办法]
namespace SeqSearchWeb
{
public unsafe struct SSTable //define structure SSTable
{
public KeyType* elem;
public int length;
};
public partial class SeqSearch : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
static int[] elem = new int[100];
static int length = 0;
protected void Button1_Click(object sender, EventArgs e)
{
length = Convert.ToInt32(TextBox3.Text);
Random ra=new Random(unchecked((int)DateTime.Now.Ticks));
for(int i=1;i<=length;i++)
{
elem[i] = ra.Next(0, 99); //调用随机函数random()初始化成员 ST.elem
this.Label3.Text += Convert.ToString(elem[i]) + " ";
}
}
protected void TextBox1_TextChanged(object sender, EventArgs e)
{
}
unsafe protected void Button2_Click(object sender, EventArgs e)
{
KeyType key = Convert.ToInt32(TextBox2.Text); //初始化关键字key
SeqSearchLib.SSTable ST = new SeqSearchLib.SSTable();
ST.length = length; //初始化变量ST.length
ST.elem = new int [100];
for (int i = 1; i <= ST.length; i++) //初始化数组变量ST.elem[]
{
ST.elem[i] = elem[i];
}
SeqSearchLib.Class1 search = new SeqSearchLib.Class1();
int result = search.Search_Seq1(ST,key);
this.Label2.Text = result.ToString();
}
protected void TextBox2_TextChanged(object sender, EventArgs e)
{
}
protected void TextBox3_TextChanged(object sender, EventArgs e)
{
}
}
}
增加 第43行
把第48行 上面的那行去掉