首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#中调用动态链接库,需使用C/C++中的结构体类型变量作为函数参数,求解决?

2013-11-23 
C#中调用动态链接库,需要使用C/C++中的结构体类型变量作为函数参数,求解决??!!//SeqSearch.aspx.cs代码:us

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行 上面的那行去掉

热点排行