求助一个简单的分段函数C语言编程,拜托各位看看我的程序哪里出问题了?

whut_tl 2014-06-14 10:23:30
程序想实现以下目的:随温度变化的锡熔体的黏度,不同温度区间对应不同的黏度表达式。公式见图所示。我的程序如下:

compiled之后提示如下错误:
warning C4715: 'tin_viscosity_1' : not all control paths return a value
warning C4700: uninitialized local variable 'mu' used
udf_names.c(8) : warning C4113: 'void (*)()' differs in parameter lists from 'void (*)(void)'

尤其是最后一个提示,我改了好几次都出现这个错误,似乎是空类型与后面的参数不匹配。求大神伸出援手!!
#include <stdio.h>
#include <math.h>
#include "udf.h"
#define M_E 2.71828

DEFINE_PROPERTY(tin_viscosity_1, c, t)
{
real mu;
real ln_mu;
real temp = C_T(c,t);
if (505. < temp <= 663.)
{ln_mu=-0.374816+627.11/ temp;
mu=pow(M_E,ln_mu)/1000;}
else if (663. < temp <= 1083.)
{ln_mu=-0.0529+449.69/ temp;
mu=pow(M_E,ln_mu)/1000;}
else if (1083. < temp <= 1323.)
{ln_mu=0.28533+79.07/ temp;
mu=pow(M_E,ln_mu)/1000;}
else
return mu;
}
...全文
1472 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
sinat_19561603 2014-08-15
  • 打赏
  • 举报
回复
udf_names.c(8) : warning C4113: 'void (*)()' differs in parameter lists from 'void (*)(void)' 这个错误不是在你编的DEFINE_PROPERTY(tin_viscosity, c, t)中的错误,你看这个错误最开头的文件名,是udf_names.c。这是你在编译的时候生成的libudf中的一个.c文件,你得去那里边改。他在生成的libudf文件夹里,你可以找找看。
whut_tl 2014-06-19
  • 打赏
  • 举报
回复
引用 16 楼 zhao4zhong1 的回复:
[quote=引用 15 楼 whut_tl 的回复:] [quote=引用 13 楼 ForestDB 的回复:] 编译器给出的是warning,不是error。 没有发现void (*)()或者void (*)(void),也许LZ的代码并不完整。
是完整的程序。我重复编译两次后,发现就没有了。但是第一次编译还是会有这个waring,很是奇怪。[/quote] 将 #pragma warning(disable:4113) 放在你源代码的第一行,即所有行(包括#include ...)的前面。 再试试。[/quote] 加上去试了一下子,发现第一次还是会出现:udf_names.c(8) : warning C4113: 'void (*)()' differs in parameter lists from 'void (*)(void)',我想不是程序的问题了。
ForestDB 2014-06-19
  • 打赏
  • 举报
回复
我不明白什么是fluent,但我知道 如果gcc -E source.c或者cl.exe /E source.c可以看到宏展开后的代码。
whut_tl 2014-06-19
  • 打赏
  • 举报
回复
引用 17 楼 ForestDB 的回复:
udf.h的内容呢?
它是fluent的一个子程序,udf是fluent中的宏,我也不是很清楚,只知道它是用C语言编写。
whut_tl 2014-06-19
  • 打赏
  • 举报
回复
引用 16 楼 zhao4zhong1 的回复:
[quote=引用 15 楼 whut_tl 的回复:] [quote=引用 13 楼 ForestDB 的回复:] 编译器给出的是warning,不是error。 没有发现void (*)()或者void (*)(void),也许LZ的代码并不完整。
是完整的程序。我重复编译两次后,发现就没有了。但是第一次编译还是会有这个waring,很是奇怪。[/quote] 将 #pragma warning(disable:4113) 放在你源代码的第一行,即所有行(包括#include ...)的前面。 再试试。[/quote] 谢谢老师指导!
whut_tl 2014-06-19
  • 打赏
  • 举报
回复
引用 17 楼 ForestDB 的回复:
udf.h的内容呢?
是udf的程序。
ForestDB 2014-06-18
  • 打赏
  • 举报
回复
udf.h的内容呢?
赵4老师 2014-06-18
  • 打赏
  • 举报
回复
引用 15 楼 whut_tl 的回复:
[quote=引用 13 楼 ForestDB 的回复:] 编译器给出的是warning,不是error。 没有发现void (*)()或者void (*)(void),也许LZ的代码并不完整。
是完整的程序。我重复编译两次后,发现就没有了。但是第一次编译还是会有这个waring,很是奇怪。[/quote] 将 #pragma warning(disable:4113) 放在你源代码的第一行,即所有行(包括#include ...)的前面。 再试试。
whut_tl 2014-06-18
  • 打赏
  • 举报
回复
引用 13 楼 ForestDB 的回复:
编译器给出的是warning,不是error。 没有发现void (*)()或者void (*)(void),也许LZ的代码并不完整。
是完整的程序。我重复编译两次后,发现就没有了。但是第一次编译还是会有这个waring,很是奇怪。
whut_tl 2014-06-18
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
实在不行直接
#pragma warning(disable:4113)
眼不见为净!
十分感谢。我重复编译两次后,发现就没有了。但是第一次编译还是会有这个waring,很是奇怪。
ForestDB 2014-06-17
  • 打赏
  • 举报
回复
编译器给出的是warning,不是error。 没有发现void (*)()或者void (*)(void),也许LZ的代码并不完整。
赵4老师 2014-06-16
  • 打赏
  • 举报
回复
       if ( 505.<=temp && temp< 663.) {
    ln_mu=-0.374816+627.11/temp;
       mu=pow(M_E,ln_mu)/1000.;
} else if ( 663.<=temp && temp<1083.) {
    ln_mu=-0.0529  +449.69/temp;
       mu=pow(M_E,ln_mu)/1000.;
} else if (1083.<=temp && temp<1323.) {
    ln_mu=0.28533  + 79.07/temp;
       mu=pow(M_E,ln_mu)/1000.;
} else if (1323.<temp               ) {
       mu=0.001;
} else {//temp<505.
       mu=1.;
}
http://bbs.csdn.net/topics/380157851
赵4老师 2014-06-16
  • 打赏
  • 举报
回复
实在不行直接
#pragma warning(disable:4113)
眼不见为净!
赵4老师 2014-06-16
  • 打赏
  • 举报
回复
编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。gcc加-E //是注释
whut_tl 2014-06-16
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
       if ( 505.<=temp && temp< 663.) {
    ln_mu=-0.374816+627.11/temp;
       mu=pow(M_E,ln_mu)/1000.;
} else if ( 663.<=temp && temp<1083.) {
    ln_mu=-0.0529  +449.69/temp;
       mu=pow(M_E,ln_mu)/1000.;
} else if (1083.<=temp && temp<1323.) {
    ln_mu=0.28533  + 79.07/temp;
       mu=pow(M_E,ln_mu)/1000.;
} else if (1323.<temp               ) {
       mu=0.001;
} else {//temp<505.
       mu=1.;
}
http://bbs.csdn.net/topics/380157851
膜拜老师!但还是会出现udf_names.c(8) : warning C4113: 'void (*)()' differs in parameter lists from 'void (*)(void)'这个waring。我怀疑不是程序的问题,是在看不出这么简单的程序会有什么错误。而是我的编译器可能有问题。另外,请问 else {//temp<505. mu=1,前面的//是什么意思呢?
whut_tl 2014-06-15
  • 打赏
  • 举报
回复
引用 2 楼 truelance 的回复:
1 mu定义时初始化为0 2 最后一个else删除 3 函数返回值类型没有定义
请问这个第三个:函数返回值类型没有定义;这个应该如何修改??我怀疑warning C4113: 'void (*)()' differs in parameter lists from 'void (*)(void)'.就是这个问题造成的。
whut_tl 2014-06-15
  • 打赏
  • 举报
回复
后来我改成了如下格式: #include <stdio.h> #include <math.h> #include "udf.h" #define M_E 2.71828 DEFINE_PROPERTY(tin_viscosity, c, t) { real mu; real ln_mu; real temp = C_T(c,t); if (temp>1323.) {mu=1.0e-3;} else if (temp>=505&&temp<663.) {ln_mu=-0.374816+627.11/temp; mu=pow(M_E,ln_mu)/1000;} else if (temp>=663&&temp<1083.) {ln_mu=-0.0529+449.69/temp; mu=pow(M_E,ln_mu)/1000;} else if (temp>=1083&&temp<1323.) {ln_mu=0.28533+79.07/temp; mu=pow(M_E,ln_mu)/1000;} else mu=1; return mu;} 已经没有if不匹配的问题或者初始化之类的问题,这个mu是计算时迭代由温度求解的,没有初始值。但是又出现了一个udf_names.c(8) : warning C4113: 'void (*)()' differs in parameter lists from 'void (*)(void)'.似乎是空类型与后面的参数不匹配。 这个一直没有解决。
熊熊大叔 2014-06-15
  • 打赏
  • 举报
回复
1 mu定义时初始化为0 2 最后一个else删除 3 函数返回值类型没有定义
罗博士 2014-06-15
  • 打赏
  • 举报
回复
你应该好好学学关系表达式和if-else if-else语句。 你这C语言完全没入门。
Adol1111 2014-06-15
  • 打赏
  • 举报
回复
我就说一点 其他的自己改: if (505. < temp <= 663.) if (505 < temp && temp<= 663) 你这505、663后面的.是什么东西
加载更多回复(3)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧