帝国CMS调用最新DIGG顶的最多的文章

用灵动标签调用调用最新DIGG顶的最多的文章:

前言

我们都知道这三种方法都用于绑定this,但没有区分好,很容易踩坑。继多次踩坑之后我又踩坑了,所以决定再次学习这种三种方法,并写下这篇文章,希望大家看了有所帮助,不再踩坑!

由于项目需求,需要使用红外热成像,最终选用了韩国
i3system的红外机芯TE-EQ1,在价格和性能上刚好合适。但由于笔者使用的是 NI
Real Time Linux
系统,i3原生并不支持,故在厂家协助下,编译了可在RTlinux下使用的i3
system库。然而在使用过程中,却并不顺利,大部分由于笔者对c/c++的理解不透彻导致,现将踩坑过程记录如下,以避免重复踩坑。

[e:loop={'select * from [!db.pre!]ecms_news where checked=1 order by diggtop desc,id desc limit 8',10,24,0}]lia href=?=$bqsr[titleurl]??=sub($bqr[title],0,30,false)?]/aspansmall点击:/small?=$bqr[onclick]?/span spansmall顶:/small?=$bqr[diggtop]?/span/li[/e:loop]

一.用法

我们先来简单看看三种方法的用法

  • call:

    function a(arg){
        console.log(arg)
    }
    a.call('this',1) //输出1
    

用法说明:fn.call(this,任何类型的参数),参数可为任何类型,数组非数组均可
ps:你是否知道如果我直接调用函数:a(参数),其实就等于a.call(window对象,参数),就是说所有函数调用我们平时写成:
fn(参数)
但其实是:
fn.call(this,参数),而this往往就是fn的调用对象,即a.fn()的this就是对象a,直接fn()默认就是window全局对象

  • apply:

    function a(arg){
      console.log(arg)
    }
    
    a.apply('this',[1,2])  //输出结果为1
    

用法说明:fn.apply(this,数组or类数组对象)

  • bind:

      function a(arg){
        console.log(arg)
    }
      var returnFn=a.bind('this',1);
      returnFn()  //输出1
    

用法说明:fn.bind(this,任何类型的参数),不立即调用函数fn,返回一个已经绑定this(传入参数)的函数fn

一、驱动库

TE-EQ1需要的驱动库包括【libi3system_澳门新葡萄京官网注册 ,te.so】和【libi3system_usb.so】

其中文件依赖关系:

libi3system_te.so

———libi3system_usb.so

—————libusb-1.0.so【系统包含】

—————libudev.so【系统包含】

驱动库地址 https://github.com/lingqing/i3system_te_nirtlinux_libdriver

说明:如果您增加了 踩的功能 只需要更改成您踩的字段便可。

三者区别,踩坑时刻!

重头戏来了!!!三者区别我们可以用call作为一个桥梁,依次与其它两者比较,至于为什么待会儿你就明白了;

二、使用及踩坑

机芯使用过程为:打开机芯→采集图像/采集温度→关闭机芯

踩坑时刻一:

  • call与apply区别:从上述已说明的用法两者的直接区别就是:前者传入任何形式参数,后者传入数组或者类数组对象

你知道apply参数传入数组或类数组对象,那你知道它是怎么处理这些参数的吗,请看例子:

  var b=[1,2]
  function a(a,c){
    console.log(a,c)
  }
  a.apply('this',b) //输出1  2  ,数组依次对应参数

  var b=[1,2]
  function a(a){
    console.log(a)
  }
  a.apply('this',b)  //输出1  数组被展开了,传入第一个值

  function a(a){
    console.log(a)
  }
  a.call('this',b) //输出[1,2]
  • 说明:apply调用的时候会把数组or类数组展开,实参依次传入函数的形参,如果数目不一致,后面的实参就没有了!!!不过可以用函数的arguments对象来获得其余实参

1. 环境配置参考

Eclipse入门 – 用于基于NI Linux Real-Time的NI
CompactRIO设备

踩坑时刻二:

  • call与bind区别:bind与call的参数是一样的,都可以是任何类型的参数,bind与call的直接区别就是bind绑定this之后不会立即调用函数,而是返回一个绑定了this的函数等待被调用,注意!此刻你需要一个变量去接受这个函数,否则就是下面的坑,这个坑就是我今天踩的!!!

      var _this='bindthis'
      function a(a){
          console.log(this)
          console.log(a)
      }
    var c=a.bind(_this,1)   //定义变量c来接受这个返回的函数,并且等待被调用
    c()  //输出bindthis,1
    
    //踩坑,错误范例
    var _this='bindthis'
    function a(a){
        console.log(this)
        console.log(a)
    }
     a.bind(_this,1)
     a()  //window,undefined  调用的依然是全局变量中的函数a,而不是bind绑定this后返回的新函数
    
  • 说明:怎么样,看完我踩的这个坑你是恍然大悟,哦~原来如此,还是觉得我很2很天真,233333。不管怎么样,这样的坑我们以后不要再踩了,call与bind的直接区别就是是立即执行还是返回一个函数等待执行?如果是后者记得用个变量接受一下

2. 踩坑主要错误:段错误Segmentation fault

神奇的地方在于,只有在调用函数 RecvImage
时,才提示段错误,在调用其它函数时,大部分正常,让我一度怀疑是编译库的问题。

然而,当我将有段错误的自定义库使用RT
Labview调用时,神奇的事情发生了,竟然可以正常运行,而且数据都还正确,让我极度怀疑人生。

2.1 尽管 RecvImage 函数可以在Labview 正常执行,然而却得不到正确的结果。

最终的最终,发现是函数参数的类型定义错误,定义时使用的是 unsigned char
*, 调用时使用的是 unsigned short *

2.2 终于正常了,但是使用c调用C++时总是出现 Segmentation
fault,这又是什么鬼

又是最终的最终,结果发现,在c中声明的数组变量,竟然不能当指针传入的c++
库中调用。

例如:我使用

unsigned char temp[NUM];

get_temp(temp);

这就不可以,最终改成如下可以了

unsigned char *temp = malloc(sizeof(unsigned char)*NUM);

get_temp(temp);

神不神奇,惊喜。哎,究其原因,还是对c/c++不懂啊

总结

1.函数这样调用a.fn(参数),其实是fn.call(a,参数),a就是this

2.call与apply:绑定this后都是立即执行,就是参数的区别,前者是任何形式的参数,后者是数组或类数组对象,你要注意apply对参数的处理,这个往往不太引起注意;

3.call与bind:参数都是一样的,区别就是是立即执行还是返回一个函数等待执行?如果是后者你要注意记得用个变量接受一下,不然一不小心容易从错

4.bind与apply:通过上面的比较,我们可以看出前者返回一个函数等待执行,后者立即执行;前者参数可以是任何形式,后者只能是数组或类数组对象

发表评论

电子邮件地址不会被公开。 必填项已用*标注