c 函数作形参 的例子, C#调用

本文提供了一个C语言中函数作为参数传递的例子,并展示了如何在C#中调用C编译的DLL,包括设置回调函数进行通信。示例中包含C语言的函数声明、定义以及C#的委托定义、DLLImport声明和回调函数实现。


/* Type for main function. */
typedef int (*pj_main_func_ptr)(int argc, char *argv[]);


作为形参数

int pj_run_app(pj_main_func_ptr main_func, int argc, char *argv[],
      unsigned flags);


static int main_func(int argc, char *argv[])
{
    setup_socket_signal();


    do {
app_restart = PJ_FALSE;


if (app_init(argc, argv) != PJ_SUCCESS)
   return 1;


setup_signal_handler();


app_main();
app_destroy();


/* This is on purpose */
app_destroy();
    } while (app_restart);


    return 0;
}

//传实参数

int main(int argc, char *argv[])

    return pj_run_app(&main_func, argc, argv, 0);
}

 

========================================================================================================

//header files

typedef void (* itemnotify)(int itemno,int value);

itemnotify m_itemnotify;

#ifdef __cplusplus
extern "C" {
#endif

 #define _EXPORT_IMPORT_SERIALCOMM_ __declspec(dllexport)


 _EXPORT_IMPORT_SERIALCOMM_ int Add(int a ,int b );

 _EXPORT_IMPORT_SERIALCOMM_ void SetNotifyCallback( itemnotify notify );

 _EXPORT_IMPORT_SERIALCOMM_ void Start(  );

 

}

 

 

 

// 这是主 DLL 文件。

#include "stdafx.h"

#include "ExportTest.h"

#ifdef _MANAGED
#pragma managed(push, off)
#endif


BOOL APIENTRY DllMain( HMODULE hModule,
       DWORD  ul_reason_for_call,
       LPVOID lpReserved
       )
{
 return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif

int Add(int a ,int b )
{
 return a+b;
}

void Start()
{
 if (m_itemnotify==NULL)
  return ;

 int num=100;
 while (num>0)
 {
  int item_value= rand() ;
  m_itemnotify(num,item_value);
  Sleep(20);
  num--;
 }
}

void SetNotifyCallback( itemnotify lpnotify  )
{
 m_itemnotify=lpnotify;
}

 

// C# 委托函数定义

[DllImport("ExportTest.dll")]
        public static extern int Add(int a, int b);
       
        [DllImport("ExportTest.dll")]
        public static extern void SetNotifyCallback(NotifyCallback lpNotifyCallback);

        [DllImport("ExportTest.dll")]
        public static extern void Start();

       

        unsafe public delegate void NotifyCallback(int itemNo, int itemValue);

        NotifyCallback m_NotifyCallback;

      private void button2_Click(object sender, EventArgs e)
        {
            m_NotifyCallback = new NotifyCallback(Notify);
            SetNotifyCallback(m_NotifyCallback);
            Start();
        }

        private void Notify(int itemNo, int itemValue)
        {
            ListViewItem item=listView1.Items.Add(itemNo.ToString());
            item.SubItems.Add(itemValue.ToString());

        }

 

 

 

### C# 中子函数返回形参的方法 在 C# 中,函数可以通过返回值的方式将参数传递给调用者。如果需要通过子函数返回形参,通常可以使用以下几种方式实现:直接返回参数、通过引用传递参数或使用 out 参数。下面分别介绍这几种方法,并提供代码示例。 #### 1. 直接返回参数 最简单的方式是通过函数的返回值直接返回形参。这种方式适用于不需要修改原始参数值的情况。 ```csharp int ReturnParameter(int value) { return value; } // 调用示例 int result = ReturnParameter(42); Console.WriteLine(result); // 输出 42 ``` #### 2. 使用 `ref` 关键字 当需要在函数内部修改参数值并将其反映到调用者时,可以使用 `ref` 关键字。`ref` 表示传入的参数是按引用传递的,因此任何对参数的修改都会直接影响原始变量。 ```csharp void ModifyAndReturn(ref int value) { value *= 2; // 修改参数值 } // 调用示例 int number = 21; ModifyAndReturn(ref number); Console.WriteLine(number); // 输出 42 ``` #### 3. 使用 `out` 关键字 `out` 关键字用于在函数中初始化一个变量并将结果传递给调用者。与 `ref` 不同,`out` 参数不需要在调用前初始化。 ```csharp void CalculateOutValue(int input, out int output) { output = input * 3; // 初始化 out 参数 } // 调用示例 int inputValue = 14; CalculateOutValue(inputValue, out int result); Console.WriteLine(result); // 输出 42 ``` #### 4. 返回多个形参 如果需要返回多个形参,可以结合 `Tuple` 或自定义类/结构体来实现。 ##### 使用 `Tuple` ```csharp Tuple<int, int> ReturnMultipleParameters(int a, int b) { return Tuple.Create(a, b); } // 调用示例 var result = ReturnMultipleParameters(21, 21); Console.WriteLine(result.Item1 + result.Item2); // 输出 42 ``` ##### 使用自定义类 ```csharp class ParameterResult { public int Value1 { get; set; } public int Value2 { get; set; } } ParameterResult ReturnCustomObject(int a, int b) { return new ParameterResult { Value1 = a, Value2 = b }; } // 调用示例 var result = ReturnCustomObject(21, 21); Console.WriteLine(result.Value1 + result.Value2); // 输出 42 ``` 以上方法展示了如何在 C# 中通过子函数返回形参[^1]。每种方式都有其适用场景,具体选择取决于实际需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值