首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CFD求解器Fluent中UDF (C代码)写入时出现的段冲突问题

CFD求解器Fluent中UDF (C代码)写入时出现的段冲突问题
EN

Stack Overflow用户
提问于 2012-06-29 22:14:01
回答 1查看 4.3K关注 0票数 0

用户定义函数(UDF)是可以编程的函数,可以与CFD Software Fluent Solver一起动态加载,以增强标准功能。UDF是用C语言编写的。

以下是我的UDF的一部分:

代码语言:javascript
复制
/*Memory Allocation only at first call to the subroutine*/
if(CellAroundNodeFirstCallflag==0)
{
    CellAroundNodeFirstCallflag=1;
    Avg_CellAroundNode =(cell_t**)calloc((Nnum+1),sizeof(cell_t));
    for(i=0;i<Nnum;i++)
    {
        Avg_CellAroundNode[i] =(cell_t*)calloc((NCellANode+1),sizeof(cell_t));
    }
}

if (Avg_CellAroundNode!=NULL)
        {
            Message("Check: Not Null.... \n");              
        }


Message("CHECK Enter... \n.");

Message("Check:Array size %d %d \n",Nnum,NCellANode);

/*Initializing the matrix*/
for(i=0;i<Nnum;i++)
{
    for(j=0;j<NCellANode;j++)
    {
        Message("Check:Initalizing cell: %d %d \n",i,j);
        Avg_CellAroundNode[i][j]=-1;
    }
}

Message("CHECK  Exit....");

我在Windows32位中使用VC++编译上面的代码没有问题。但在Windows64位和Linux32/ 64位(与GCC)..我得到以下错误:

代码语言:javascript
复制
   ==============================================================================
   Stack backtrace generated for process id 10801 on signal 1 :
   Please include this information with any bug report you file on this issue!
   ==============================================================================

   Data.In is read...
   Check: Not Null.... 
   CHECK Enter... 
   Check:Array size 10 20

   Check:Initalizing cell: 0 0 
   Check:Initalizing cell: 0 1 
   Check:Initalizing cell: 0 2 
   .
   .
   Check:Initalizing cell: 7 18 
   Check:Initalizing cell: 7 19 
   Check:Initalizing cell: 8 0 
   /opt/Fluent.Inc/fluent6.3.26/lnamd64/2ddp/fluent.6.3.26[0xcc0e0b]
   /opt/Fluent.Inc/fluent6.3.26/lnamd64/2ddp/fluent.6.3.26[0xcc0d61]
   /lib64/libpthread.so.0[0x355aa0de70]
   BubUDF/lnamd64/2ddp/libudf.so(NodeAvg+0x104)[0x2ba2089bc1bd]
   Error: fluent.6.3.26 received a fatal signal (SEGMENTATION VIOLATION).

你们谁能帮我解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-29 22:20:31

你的第一次分配需要分配一个指向cell_t的指针,但你分配的是一个cell_t。如果cell_t的大小是4字节,那么这就是为什么到目前为止它在32位(与指针的大小相同)上工作,而在64位上失败的原因。在64位的情况下,它将小于指针,这意味着您没有分配足够的内存,最终会超出已分配的内存的界限。您的正确代码应该是:

代码语言:javascript
复制
Avg_CellAroundNode =(cell_t**)calloc((Nnum+1),sizeof(cell_t*));

但这并不能解释为什么它在32位Linux上失败了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11263405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档