题
我尝试使用以下代码初始化 Metal C 环境,但在 memset 行上出现以下错误。错误 CCN3275 IMIJWS0.METAL.SAMPLIB(MEM):6 遇到意外文本“)”。错误 CCN3045 IMIJWS0.METAL.SAMPLIB(MEM):6 未声明的标识符 ___MEMSET。错误 CCN3277 IMIJWS0.METAL.SAMPLIB(MEM):6 语法错误:可能缺少 ')' 或 ','?CCN0793(I) 文件 //'IMIJWS0.METAL.SAMPLIB(MEM)' 编译失败。未创建目标文件。下面是我的代码
#include < string.h>
#include < stdlib.h>
#include < metal.h>
void mymtlfcn(void) {
struct __csysenv_s mysysenv;
memset ( &mysysenv, 0, sizeof ( mysysenv ) );
mysysenv.__cseversion = __CSE_VERSION_1;
mysysenv.__csesubpool = 129;
mysysenv.__cseheap31initsize = 131072;
mysysenv.__cseheap31incrsize = 8192;
mysysenv.__cseheap64initsize = 20;
mysysenv.__cseheap64incrsize = 1;
解决方案
的问题是与搜索顺序。虽然我从没有搜索(在/ usr /金属/包括)在我的JCL我没有用nosearch选项进行,所以string.h中渐渐从标准体系图书馆的,而不是包含金属C.版本回升我贴我的optfile数据集我通过下面的CPARM为REFFERENCE。
//OPTIONS DD * SO LIST LONG NOXREF CSECT METAL LP64 NOSEARCH search(/usr/include/metal/)
其他提示
所以,我不知道。但一些建议:
您可以尝试从此处复制/粘贴此代码 这个例子 只是为了确保它“按预期”工作
也许尝试定义一些宏 这里?(当我在 zOS 上进行 C 编程时,我必须包含一些奇怪的宏才能让东西正常工作。我对此没有合理的技术解释。)
您可以尝试使用“=3.14”(来自 ispf)搜索 memset()。查看是否有任何其他模块使用该函数,然后检查它们包含的标头(或它们定义的宏 - 在 C 文件或 H 文件中) )使其发挥作用。
另一个想法:在 memset() 之前,尝试放入 printf() 。如果您在同一行上遇到语法错误(仅适用于 printf,而不是 memset),那么您可以查看问题是否在第 6 行之前 - 就像放错位置的括号一样。
最后,如果我没记错的话,我必须编译我的各个模块,然后手动链接它们(除非我编写了 JCL 来为我执行此操作。)因此,您可能必须链接一次才能链接到其他模块,然后链接再次针对C库。不是迂腐,而是:您相当确定您正在执行所有链接传递?
我意识到需要尝试很多圈子,并且您可能已经阅读了手册,但也许有一些有用的东西可以尝试?
另外,你可能已经知道这一点,但是 这个网站 (用于查找错误代码)非常有用。(以及上面用于全文搜索手册的链接)
编辑: 这一页 还讨论了“内置函数” - 您可以尝试(如页面底部所述)“#undef memcpy”来使用非内置版本?
你能告诉我们你的编译器参数?你需要确保你没有在标准C头文件拉动除了金属Ç的。下面是一个例子:
xlc -c -Wc,metal,longname,nosearch,'list(./)' -I. -I /usr/include/metal -I "//'SYS1.SIEAHDRV'" -S -qlanglvl=extended foo.c
as -mrent -mgoff -a=foo.list -o foo.o foo.s
ld -bac=1 -brent -S "//'SYS1.CSSLIB'" -o foo foo.o
您缺少该功能的右大括号“}”?怎么样任何缺少分号行终止?当缺少的括号/分号在z / OS C编译器会引发一些奇怪/有时误导消息。我没有它尝试,但我假设金属确实也是如此。