Metal C中的memset问题

Posted

技术标签:

【中文标题】Metal C中的memset问题【英文标题】:problems with memset in Metal C 【发布时间】:2009-06-03 17:42:24 【问题描述】:

我正在尝试使用以下代码初始化 Metal C 环境,但在 memset 行上出现以下错误。 ERROR CCN3275 IMIJWS0.METAL.SAMPLIB(MEM):6 遇到意外的文本')'。 错误 CCN3045 IMIJWS0.METAL.SAMPLIB(MEM):6 未声明的标识符 ___MEMSET。 ERROR CCN3277 IMIJWS0.METAL.SAMPLIB(MEM):6 语法错误:可能缺少 ')' 或 ','? CCN0793(I) 文件编译失败 //'IMIJWS0.METAL.SAMPLIB(MEM)'。未创建目标文件。 下面是我的代码

#include &lt string.h&gt #include &lt stdlib.h&gt #include &lt metal.h&gt 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;

【问题讨论】:

您遇到了一些#include 问题。尝试将 string.h 移动到 stdlib.h 之后。 打乱标准标题的顺序不会有任何用处。 实际上,我们可以了解一下 Metal C 的一些细节吗?你所做的在标准 C 中看起来不错,所以要么你搞砸了你没有显示的东西,要么我们看到的不是你实际输入的,或者 Metal C 是有缺陷的或标准前的编译器。 试过了,没有解决问题。 Metal C 包含一组非常有限的标准 c 库,专为大型机系统编程而设计。我认为这是一个非标准的编译器,因为我遇到了一些问题,例如 // 不能作为注释工作以及 [] 在声明中的位置。这是有关它的更多信息的链接。 www-03.ibm.com/systems/z/os/zos/metalc 【参考方案1】:

问题在于搜索顺序。尽管我在 JCL 中使用 with 进行了 search(/usr/metal/include),但我没有使用 nosearch 选项继续它,因此 string.h 是从标准系统库中获取的,而不是 Metal C 中包含的版本。我已将我的 optfile 数据集粘贴到下面的 CPARM 以供参考。

//选项 DD * 所以 列表 长 NOXREF CSECT 金属 LP64 鼻子搜索 搜索(/usr/include/metal/)

【讨论】:

这就是我在上面的编译器参数中包含 Wc,nosearch 的原因。我很早就了解了这个“功能”。【参考方案2】:

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

    您可以尝试从this example 复制/粘贴此代码,以确保它“按预期”工作

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

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

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

    最后,如果我没记错的话,我必须编译我的各个模块,然后手动链接它们(除非我写了一个 JCL 来为我做这件事。)所以你可能需要链接一次才能链接其他模块,然后再次链接到 C 库。不是迂腐,而是:你相当确定你正在做所有的链接传递?

我知道要尝试的方法很多,您可能已经阅读了手册,但也许有一些有用的东西可以尝试?

此外,您可能已经知道这一点,但this site(用于查找错误代码)非常有用。 (连同上面的链接,用于全文搜索手册)

编辑:this page 还谈到“内置函数” - 您可以尝试(如页面底部所述)“#undef memcpy”来使用非内置版本?

【讨论】:

Metal C 不像标准的 Z/OS C,它可以生成不依赖于 LE 的直接汇编语言。我已经得到了在没有 memset 的情况下编译运行的程序,包括 metal.h 破坏了一些东西。我认为这是我的包含搜索路径的问题,导致包含冲突的标头,当我进行一些研究并了解更多信息时,我会更新这个问题。【参考方案3】:

你能告诉我们你的编译器参数吗?您需要确保除了金属 C 头文件之外,您没有拉入标准 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

【讨论】:

您有 JCL 示例吗?看了你的例子后,我认为我的 CPARM 线是问题所在,但不知道如何解决它。 // CPARM='SO,LIS,LONG,NOXREF,CSECT,METAL,SEARCH(/usr/include/metal/),', 嗯...我不认为我曾经通过 JCL 编译过 C - 你可以启动一个 shell 并以这种方式编译吗? 这一切都来自一个shell。当我运行这个命令 xlc -c -Wc,metal,longname,nosearch,'list(./)' -I. -I /usr/include/metal -I "//'SYS1.SIEAHDRV'" -S -qlanglvl=extended foo.c 我得到 foo.s 和 foo.lst 当我尝试第二个命令为 -mrent -mgoff -a =foo.list -o foo.o foo 我得到文件 foo 不存在。当我用 foo.s 或 foo.lst 替换 foo 时,出现以下错误。 ** ASMA935U 一个或多个所需文件不可用 ** ASMA434N GOFF/XOBJECT 选项已指定,将使用选项 LIST(133) FSUM3401 组装步骤以 rc = 20 结束。在组装工作之前我无法进入链接步骤. 哎呀!那是我的一个错字。 “as”步骤中的最后一个参数应该是“foo.s”,而不是“foo”。我已经更新了上面的答案。这将生成 foo.o 对象文件,对“ld”的调用将绑定到正在运行的可执行文件中。 仍然是同样的错误,我认为这是我们网站设置方式的问题,并且我的一些环境变量设置错误或根本没有设置。【参考方案4】:

您是否缺少函数的右大括号''?任何缺少的分号行终止符怎么样?当缺少大括号/分号时,z/OS C 编译器有时会抛出一些奇怪/误导性的消息。我没有尝试过,但我假设 Metal 也可以。

【讨论】:

以上是关于Metal C中的memset问题的主要内容,如果未能解决你的问题,请参考以下文章

jQuery 中的 C++ memset() 等效项

memset()函数

结构c内的memset数组

在JAVA中有没有象C语言里的memset函数

C语言memset问题

c中的memset struct数组时出现分段错误