|
编写UDF时,
总是出现一些莫名其妙的错误。
总结一些注意事项:
1. 块注释符 /* ..... */ 在UDF中,好像不能用。 如果需要注释,就在notepad++中使用列模式,在每行的行首使用注释符 //, DEFINE_ADJUST(my_adjust,d) { #if RP_HOST Message("xx=%f \n",xx); #endif } //DEFINE_EXECUTE_ON_LOADING(on_loading, libname2) //{ // //Message("\nLoading %s version %d.%d\n",libname,version,release); // #if RP_HOST // Message("\n The fist xx= %d.",xx); // xx=1; // Message("The second xx= %d\n",xx); // #endif //} |
2. 在UDF中调试,往往想输出某些数据到屏幕。使用Message命令 #if RP_HOST Message("Host: xx=%f; yy=%f; zz=%f; AA=%f; BB=%f; \n",xx,yy,zz,AA,BB); #endif 上面的 #if RP_HOST ... #endif 是在并行计算时,只在Host节点执行, 否则并行节点都输出。 |
3. 在UDF中读取文本文件中的数据,并在其它宏中使用。 在DEFINE_EXECUTE_ON_LOADING中读取文本数据 在DEFINE_ADJUST宏中输出 用到fscanf命令。它不能直接对预定义的全局变量赋值。 需要先对局部变量赋值,然后用局部变量对全局变量赋值 #include "udf.h" double xx=1; double yy=2; DEFINE_EXECUTE_ON_LOADING(report_version, libname1) { FILE *fpin= NULL; double a[9]; //Message("\nLoading %s version %d.%d\n",libname,version,release); #if RP_HOST Message("Host: xx=%f; yy=%f; \n",xx,yy); #endif fpin=fopen("UDFInput.dat","r"); fscanf(fpin,"%lf",&a[0]); fscanf(fpin,"%lf",&a[1]); fclose(fpin); #if RP_HOST Message("Host: a0=%f; a1=%f;; \n",a[0],a[1]); #endif xx=a[0]; yy=a[1]; //https://www.cnblogs.com/liusuanyatong/p/11259603.html #if RP_HOST Message("Host: xx=%f; yy=%f;\n",xx,yy); #endif } DEFINE_ADJUST(my_adjust,d) { #if RP_HOST Message("xx=%f \n",xx); #endif } 其中, UDFInput.dat中的数据是这样的, 上面的UDF只读取了前2行 0.5 0.2 0.0 0.1 0.1 0.1 0.0 5e9 上面定义的全局变量和局部变量都是双精度double 在fscanf中使用了 %lf 格式,意即 long float |
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-15 00:48
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社