用长参数调用C函数的cobol

用长参数调用C函数的cobol,c,function,cobol,C,Function,Cobol,我有一个用C定义的函数 bool moveTable(char * , long); 它是从cobol调用的,当它从cobol调用时,我可以看到它将一个正确的long值传递到moveTable函数中,但是当控件传递到C并且我在moveTable中执行printf时,出于某种原因,我得到了一个垃圾负值,比如-178634436。我相信这不会是存储问题,因为在cobol上,传递给long的数字是5264011,可以保存在long中 有什么建议吗 编辑:这是在cobol中定义字段的方式,它被传递

我有一个用C定义的函数

bool moveTable(char * ,  long); 
它是从cobol调用的,当它从cobol调用时,我可以看到它将一个正确的long值传递到moveTable函数中,但是当控件传递到C并且我在moveTable中执行printf时,出于某种原因,我得到了一个垃圾负值,比如-178634436。我相信这不会是存储问题,因为在cobol上,传递给long的数字是5264011,可以保存在long中

有什么建议吗

编辑:这是在cobol中定义字段的方式,它被传递给moveTable函数long参数

   10  ATPRM-TRT-ACCT-ID           PIC S9(08) COMP-5. 

尝试使用int。如果这不起作用,那么删除另一个char*,只需将值传递为int或long,看看是否有区别。在处理跨系统或字符串时,我会坚持使用整数,然后将数字转换为长整数。这在我的研究中没有依据。我只是简单地记住了long-long,而不是int和long。在AIX中,int和long很可能大小相同

因此,如果什么都不起作用,请尝试将数字作为字符串char*或char数组传递,无论哪种方式有效

看到这个了吗

此外,如果您可以更改S99类型。。看到这个了吗

不是吗

长度为4字节的整数可以是4或8字节的整数???这取决于执行情况

难道不是吗

 10  ATPRM-TRT-ACCT-ID           PIC S9(17) COMP-5. 

这可能不是答案,但这是一个问题。C是否需要任何单词对齐?

任何建议?。。。是的。。。显示你的代码!否则我们都只是在黑暗中射击。搜索cobol中的整数大小,特别是cobol长大小,然后选择适当的标准大小整数类型stdint.h int8_t,int16_t,int32_t,等等,您使用的是哪种COBOL编译器和操作系统?操作系统是AIX Unix和COBOL编译器,我不确定。COBOL编译器是microfocus COBOL。奇怪的是,当我使用int16\u t或int8\u t时,它给了我一个正的可信值,但仍然不正确。但一旦我把它设为int,int或long,我就会得到一个巨大的负垃圾值。long是多长?也许奇怪的是,尽管IBM有一个针对AIX的COBOL编译器,COBOL编译器仍然是微焦点。字段定义为4字节32位,带符号,允许完整的二进制值。不能改变这一点,那么在C语言中会是怎样的呢?我假设AIX支持64位。没有谷歌搜索,我没有任何东西可供参考。Long的大小通常是int的两倍,因此在现代体系结构中int通常是4字节,在AIX中可能是8字节。当然,这是基于阅读的推测,其中涉及COBOL和AIX。我们需要编译器和操作系统的正确版本字符串以及C和Cobol代码。如果我不是他,我建议尝试几种不同的故障排除技术。如果没有太多的信息,就不可能回答这个问题。看起来我错了,我查了64位,int与long相同,现在我花了一些时间来思考,我错了,因为64位int支持扩展到20以外的日期。。已经有一段时间没有使用Unix和C了。当我说两倍大的时候,我想是长的而不是长的…天哪,八个字节将是一个巨大的:-你是对的,我们没有信息。如果只是大小不匹配,C程序的结果会更大,而不是负值。我猜是char*。我不确定你能不能用这种方式在c上声明,即使你传递了一个字符串。它必须是一个精确的大小,以便在调用发生时可以正确读取堆栈。我不确定cobol是否会在字符串的末尾设置null,比如C:如果您看到另一个答案上的注释,我怀疑long是否为8字节。如果是的话,什么才是长久?如果对齐是一个问题,它不会崩溃,而不是给出一个结果吗?它不能说我会用那个地址,但会稍微改变一下,对吗?示例值是如何变为负值的?如果C中的long至少是32位,如果后面4个字节的结尾是8字节,则确定符号。当然,如果存在长度不匹配,使得C更长,并且是little Endian,则字段外的数据确定符号。如果准确地向我们描述,它是在PowerPC或其前身上运行的AIX,并且是Big-Endian,因此即使存在长度不匹配,如果存在,实际数据也会确定符号的最高有效位。COMP-5字段是四个字节,这一切都让我想到,我肯定会错,在这个程序中,long是四个字节。
 10  ATPRM-TRT-ACCT-ID           PIC S9(17) COMP-5.