NI LabVIEW,CVI,数据采集等产品讨论区

取消
显示结果 
搜索替代 
您的意思是: 

为簇数组分配内存的问题

我要调用研华的CAN驱动dll,将CAN卡收到的数据存放在一个全局变量buffer中,buffer为簇数组,簇为CAN帧结构。附图1是我写的程序,图2是调用dll函数时参数的设置。程序运行时能分配内存,但是关闭vi和labview时经常出现错误,甚至死机,错误日志如下:

source\mgcore\MemoryManager.cpp(437) : DAbort:
$Id: //labview/branches/Saturn/dev/source/mgcore/MemoryManager.cpp#16 $
0x012BAC58 - LabVIEW <unknown> + 0
0x012CD0A4 - LabVIEW <unknown> + 0
0x012BAC39 - LabVIEW <unknown> + 0

。。。。

 

c:\builds\penguin\labview\branches\Saturn\dev\source\typedesc\TD80ReadWrite.cpp(1857) : DWarn: UnFlattenListOfTypes : Loading an insane type descriptor.
$Id: //labview/branches/Saturn/dev/source/typedesc/TD80ReadWrite.cpp#1 $
0x012B00E8 - LabVIEW <unknown> + 0
0x01355B8C - LabVIEW <unknown> + 0
0x01355D4F - LabVIEW <unknown> + 0
0x00F8AC25 - LabVIEW <unknown> + 0
0x00F8BDC1 - LabVIEW <unknown> + 0

 

我怀疑是内存管理的问题,但一直也没找出问题。

 


函数原型为:

LRESULT CANSetBufferPtr(
    WORD Port,
    PVOID FAR pOutputBuffer,
    ULONG PackNum,
    BOOL FAR *Ready
)

其中 ,pOutputBuffer——Input PVOID FAR default this pointer is set by caller, it points to the buffer that can receive transmit data


研华的例程如下:

CAN_MSG_T * g_pData;
g_pData = ( PCAN_MSG_T )GlobalAlloc( GPTR, 100*sizeof(CAN_MSG_T) );  //CAN_MSG_T为帧结构
    if( g_pData == NULL )
    {
        printf("Out of memory!\n");
        CANPortClose(m_nPort);
        return 0;
    }
    // lock the memory
    GlobalLock( g_pData );
    bReady = FALSE;
    CANSetBufferPtr( m_nPort, g_pData, 100, &bReady );// set the receive buffer

 

各位高人,能不能帮我找找错误?或者告诉我在labview里怎么实现研华的例程?

 

万分感谢!!!!!!!

下载全部
0 项奖励
1 条消息(共 7 条)
5,698 次查看

找到了一个问题:簇里面不能嵌套数组。必须把数组中的元素全拉出来作为簇的元素。

 

解决这个问题之后,运行时没有出错。但是会经常自动关闭,而且下次打开vi时会提示修复vi!!

 

应该还是内存管理问题。

 

可是问题在哪呢??郁闷呐

0 项奖励
2 条消息(共 7 条)
5,660 次查看

别想了,是没办法的,据我所知,lv只支持数字型数组,连单一的字符串型数组都有困难!更别说结构体了,我也刚在这上面研究了很长时间,单一的按址传值,传结构体解决了,但结构体数组没想法了。没有解决,而我换方法了。建议你用c++再包一下,包成labview支持的数据类型。

 

给你一点我的程序,但愿对你有点用处。

0 项奖励
3 条消息(共 7 条)
5,638 次查看
可以用CIN节点解决问题!
0 项奖励
4 条消息(共 7 条)
5,623 次查看

如果我的dll接受一个参数为结构体数组,其格式为:

long uploadResultDataAndRecipe(long sessionId, char* stationNr, long resultDataExtArraySize, struct ResultDataExtendedStruct* resultDataExtArray);

 

struct ResultDataExtendedStruct
{
  long nr;
  char* name;
  char* value;
  char* min;
  char* max;
  char* nom;
  char* toleranz;
  char* unit;
  long failCode;
  char* messtyp;
};

 

我要怎么处理?请指教!我只知道红色标出来的参数是一个结构数组。怎么用cin结点处理这个数组参数?我想无论怎么处理,这个参数的格式是不能变的,dll要接受的参数是个结构体数组。

0 项奖励
5 条消息(共 7 条)
5,619 次查看

粗数组分配内存,搞定没有?给点提示

0 项奖励
6 条消息(共 7 条)
4,601 次查看

粗数组分配内存,搞定没有?给点提示

0 项奖励
7 条消息(共 7 条)
4,600 次查看