gpt4 book ai didi

c# - 将值从struct分配给变量失败

转载 作者:太空宇宙 更新时间:2023-11-03 23:52:39 25 4
gpt4 key购买 nike

编辑3描述了调试后缩小范围的问题
Edit 4包含了解决方案-这都是关于C和C之间的类型差异#
今天我遇到一个奇怪的问题在C中,我有以下结构:

typedef struct s_z88i2
{
long Node;
long DOF;
long TypeFlag;
double CValue;

}s_z88i2;

此外,我还有一个函数(这是一个简化版本):
DLLIMPORT int pass_i2(s_z88i2 inp, int total)
{
long nkn=0,ifg=0,iflag1=0;
double wert=0;
int val;

// Testplace 1
nkn=inp.Node;
ifg=inp.DOF;
iflag1=inp.TypeFlag;
wert=inp.CValue;
// Testplace 2

return 0;
}

指定的值在任何地方都没有使用-我知道这一点。
当我到达 // Testplace 1时,将执行以下语句:
char tmpstr[256];
sprintf(tmpstr,"RB, Node#: %li, DOF#: %li, Type#: %li, Value: %f", inp.Node, inp.DOF, inp.TypeFlag, inp.CValue);

tmpstr然后被传递到消息框它显示了-正如人们所期望的-在我的结构中给出的值,我以一种友好而有序的方式传递给了函数继续通过函数,结构中的值被分配给一些变量到达 Testplace 2时,执行以下操作:
sprintf(tmpstr,"RB, Node#: %li, DOF#: %li, Type#: %li, Value: %f",nkn, ifg, iflag1, wert);

再次, tmpstr被传递到一个消息框然而,这并不能说明人们会期待什么 NodeType的值仍然正确对于 DOFValue显示的值是 0,这使我得出结论,在分配值时出现了严重错误我有时设法找到了一种方法来计算长数值,因为它和 0一样不正确但在我上次的测试中,我没能重现那个错误。
inp的可能值是例如 {2,1,1,-451.387},因此忘记了第一个 1-451.387
有人知道我做错了什么吗?或者怎么解决?
多谢提前!
编辑:
%i改为 %li,但结果没有改变谢谢你放松!
很遗憾,我正在使用MinGW使用Dev Cpp开发这个dll,因为我无法说服Visual Studio 2012 Pro正确编译它尽管原始源代码的文档说它是纯ANSI-C的,但这让我有点恼火,因为我无法用Dev Cpp正确调试这个dll因此出现了消息框。
编辑2:
正如尼尔·汤森德建议的那样,我改为传递一个推荐信但这也没有解决问题当我直接访问结构中的值时,一切都很好当我把它们赋给变量时,有些会丢失。
关于如何调用函数的简短通知这个dll是从C#访问的,所以我用P/Invoke(当我得到它的时候)进行处理。
[DllImport("z88rDLL", CallingConvention = CallingConvention.Cdecl)]
public static extern int pass_i2(ref s_z88i2 inp, int total);

我的定义是C我有很多其他的功能导入,它们都工作得很好这是我第一次遇到这些问题的函数我通过以下方式调用函数:
s_z88i2 tmpi2 = FilesZ88.z88i2F.ConstraintsList[i];
int res = SimulationsCom.pass_i2(ref tmpi2, FilesZ88.z88i2F.ConstraintsList.Count);

首先设置结构,然后调用函数。
为什么在编译ANSI-C时,VS必须很挑剔这肯定会让事情变得更容易。
编辑3:
我想我可以把问题缩小到 sprintf在说服VS构建我的dll之后,我就可以单步执行了这些值似乎被很好地分配给了它们所属的变量但是,如果我想通过 sprintf打印这些变量,它们会变得相当空( 0)奇怪的是,这个值总是 0而不是其他值我仍然对 sprintf的行为方式感兴趣,但我认为我最初的问题解决了/恐慌失败了所以谢谢大家!
编辑4:
正如supercat在下面指出的,我重新思考了C和C之间的类型兼容性我知道C中的 int在C中被评估为 long。但是在仔细检查之后,我发现在C中我的变量确实是 FR_INT4(为了清楚起见,我把它排除在最初的问题之外,这是个坏主意)内部 FR_INT4定义为: #define FR_INT4 long long,因此是超长快速测试表明,通过long from C可以获得最佳的兼容性因此 sprintf-问题可以简化为这样一个问题:“long long的格式标识符是什么?”.
实际上,这是非常简单的所以我可以宣布我的问题真的解决了!
sprintf(tmpstr,"RB, Node#: %lli, DOF#: %lli, Typ#: %lli, Wert: %f\n", inp.Node, inp.DOF, inp.TypeFlag, inp.CValue);

返回我想要的所有值非常感谢大家!

最佳答案

使用格式说明符long格式化%i类型的值无效您应该使用%li

关于c# - 将值从struct分配给变量失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15617451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com