我尝试使用以下代码初始化 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/)

其他提示

所以,我不知道。但一些建议:

  1. 您可以尝试从此处复制/粘贴此代码 这个例子 只是为了确保它“按预期”工作

  2. 也许尝试定义一些宏 这里?(当我在 zOS 上进行 C 编程时,我必须包含一些奇怪的宏才能让东西正常工作。我对此没有合理的技术解释。)

  3. 您可以尝试使用“=3.14”(来自 ispf)搜索 memset()。查看是否有任何其他模块使用该函数,然后检查它们包含的标头(或它们定义的宏 - 在 C 文件或 H 文件中) )使其发挥作用。

  4. 另一个想法:在 memset() 之前,尝试放入 printf() 。如果您在同一行上遇到语法错误(仅适用于 printf,而不是 memset),那么您可以查看问题是否在第 6 行之前 - 就像放错位置的括号一样。

  5. 最后,如果我没记错的话,我必须编译我的各个模块,然后手动链接它们(除非我编写了 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编译器会引发一些奇怪/有时误导消息。我没有它尝试,但我假设金属确实也是如此。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top