C语言编写IDL动态可加载模块(DLM)入门

3 篇文章 0 订阅

由于之前有些工作确实是可以直接从底层对数据进行读写的,如果采用动态链接库的话应该可以提高效率。
参考资料:

HARRIS对于DLM的官方说明
一个第三方的DLM,用于参考学习
另一个讲DLM的CSDN博客,但个人觉得太复杂了
安装路径下该文件夹中所有文件:/idl/external/dlm/*
安装路径下该依赖项头文件:/idl/external/include/idl_export.h

准备文件

  • 模块名.c:假如你的模块名叫mymodule,则mymodule.c即是用于编译的C源码文件。具体见下方讲解。
  • 模块名.dlm:该文件为/idl/external/dlm/中复件,用于注册DLM,前五行的参数自己看着格式随便改点就可以,重要的是第六行及之后的文本,具体见下方讲解。
  • {build_win.bat | Makefile}:(win平台是bat文件,unix平台是Makefile文件。)该文件为/idl/external/dlm/中复件,用于制作动态链接文件(mymodule.dll/mymodule.so),但这个文件并非通用,需要自己改参数,一是里面的IDL_DIR为安装路径,二是把里面的testmodule替换为你的模块名。这个文件并非必需,只是编译动态链接库会更快捷,当然也可以自己制作Makefile文件。

C源码讲解

其实不管是示例的testmodule还是另一篇博客里面都有好些不需要的,我做了很大的精简。
首先要把idl_export.h加进去。

#include <stdio.h>
#include "idl_export.h"

然后是定义自己在IDL中调用的过程或者函数,我定义的是passfn的过程,将字符串参数打印在屏幕上。

static void passfn(int argc, IDL_VPTR argv[]){
	printf("argc: %i\n", argc);
	const char *fn = IDL_VarGetString(argv[0]);
	printf("argv: %s\n", fn);
}

定义过程的格式是(假如你的过程名为pro1)

static void pro1(int argc, IDL_VPTR *argv){
	/*你的功能*/
}

定义函数的格式是(加入你的函数名为func1)

static IDL_VPTR func1(int argc, IDL_VPTR *argv){
	/*你的功能*/
  return wanted;
}

主要说明的是参数传递,argv是从0开始为第一个参数的,即argv[0]并非存储程序的名称。
此外还需要做类型转换:一是传入参数的类型转换,因为传入的参数是头文件idl_export.h中定义的IDL_VPTR类型,所以需要在头文件中大概2000-3000行的位置找到类型转换的函数,比如IDL_VarGetString用于将IDL的string转换为C的char,IDL_DoubleScalar用于将IDL的double转换为C的double。二则是类似的对于返回值的类型转换。
定义完你的函数/过程之后,加上最后一段让IDL载入函数就大功告成了。

int IDL_Load(void){
	static IDL_SYSFUN_DEF2 procedure_addr[] = {
		{ (IDL_FUN_RET) passfn, "PASSFN", 0, IDL_MAX_ARRAY_DIM, 0, 0},
	};
	return IDL_SysRtnAdd(procedure_addr, FALSE, IDL_CARRAY_ELTS(procedure_addr));
}

格式:

//加载函数
static IDL_SYSFUN_DEF2 function_addr[] = {
	{ 函数名, "大写函数名", 最少的参数个数, 最多的参数个数, 应该是最少的关键字个数, 应该是最多的关键字个数},
};
//加载过程
static IDL_SYSFUN_DEF2 procedure_addr[] = {
	{ (IDL_FUN_RET) 过程名, "大写过程名", 最少的参数个数, 最多的参数个数, 应该是最少的关键字个数, 应该是最多的关键字个数},
};

dlm文件讲解

第六行开始的格式是

FUNCTION 函数名 最少的参数个数 最多的参数个数 {0 | OBSOLETE | KEYWORDS}
PROCEDURE 过程名 最少的参数个数 最多的参数个数 {0 | OBSOLETE | KEYWORDS}

制作动态链接文件

如果不想用IDL提供的makefile,可以自己尝试制作,其实主要分两步(强迫症可以是3步),当然也可以把步骤写入自己的makefile,方便一次性完成:

  1. 编译为汇编文件。编译器一般为gcc或者cc(windows应该是clang.exe,命令为cl),-I后面是额外头文件的路径,也就是idl_export.h的位置,或者其他非系统库函数的位置。此过程在目录下生成模块.o文件。
gcc -I/usr/local/exelis/idl/external/include -c  -fPIC 模块.c
  1. 链接文件。ld命令用于链接。此过程生成可用的模块.so文件。
ld -shared -Bsymbolic --warn-once -noinhibit-exec  -o 模块.so 模块.o
  1. 删除不必要的.o文件
rm 模块.o

开始使用

  1. 生成动态链接库(图中由于已经制作好,所以未显示任何命令)
  2. 打开IDL
  3. DLM_REGISTER, “dlm后缀的完整路径”(必须先注册DLM)
  4. DLM_LOAD, “不带路径的模块名”(可以不用加载模块,调用函数时会自动加载)
  5. 使用函数/过程
    在这里插入图片描述在生成so文件(Windows下为dll文件,macOS为dylib文件)前,会先生成机器代码的.o文件,可以删除。如果不想每次调用自己的函数都需要先REGISTER一下,可以把dlm文件和动态链接文件拷贝到IDL的!DLM_PATH路径下。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IDL 6S大气校正模块是一种基于图像处理和机器学习的方法,用于对卫星或无人机遥感图像进行大气校正,从而获取地物表面反射率或辐射亮度真实值。该模块IDL(图像数据生命周期管理)软件公司开发,适用于各种卫星遥感数据的气候变化研究、环境监测等领域。 该模块主要包括以下几个步骤: 1. 图像预处理:包括对遥感图像的裁剪、配准、去噪等操作,为后续大气校正提供高质量的原始数据。 2. 大气参数估算:利用光学厚度、温度、湿度等参数对大气进行建模,从而确定大气中影响地物反射率或辐射亮度的因素。 3. 反射率校正:通过机器学习方法,将估算的大气参数与地物表面反射率之间的关系进行拟合,从而得到真实反射率值。 4. 输出结果:将校正后的反射率值输出,可用于后续的气候变化研究、环境监测等应用。 相较于其他大气校正方法,IDL 6S模块具有以下优势: 1. 算法成熟:IDL公司长期从事遥感图像处理领域,积累了丰富的经验和技术,使得该模块在大气校正方面具有较高的准确性和稳定性。 2. 支持多种卫星数据:该模块可对多种卫星遥感数据进行处理,如MODIS、Sentinel-2、Landsat等,具有广泛的适用性。 3. 易于集成:IDL软件公司提供了丰富的API和工具包,方便用户在科研项目中集成该模块,提高数据处理效率。 总之,IDL 6S大气校正模块是一种高效、稳定、易于集成的遥感图像处理工具,适用于气候变化研究、环境监测等领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值