Вопрос

Я пытаюсь инициализировать среду 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/metal/include) в своем JCL, я не использовал опцию поиска по носу, поэтому string.h подбирался из стандартных системных библиотек вместо версии, включенной в Metal C.Я вставил свой набор данных optfile, который передал в CPARM ниже для справки.

//OPTIONS DD *
 SO
 LIST
 LONG
 NOXREF
 CSECT
 METAL
 LP64
 NOSEARCH
 search(/usr/include/metal/)

Другие советы

Итак, я понятия не имею.Но несколько предложений:

  1. Вы можете попробовать скопировать/вставить этот код сюда из этот пример просто чтобы убедиться, что все работает «как ожидалось»

  2. Возможно, попробуйте определить некоторые макросы здесь?(когда я программировал на C в zOS, мне пришлось включить несколько странных макросов, чтобы все заработало.У меня нет разумного технического объяснения этому.)

  3. Вы можете попробовать выполнить поиск memset(), используя "=3.14" (из ispf). Посмотрите, используют ли какие-либо другие модули эту функцию, а затем проверьте заголовки, которые они включают (или макросы, которые они определяют - либо в файлах C, либо в файлах H). ), чтобы это работало.

  4. Еще одна мысль:перед memset() попробуйте добавить printf().Если вы получите синтаксическую ошибку в той же строке (только для printf, а не для memset), вы сможете увидеть, находится ли проблема перед строкой 6 — например, в неправильно расставленной скобке.

  5. Наконец, если я правильно помню, мне пришлось скомпилировать отдельные модули, а затем связать их вручную (если только я не написал JCL, чтобы сделать это за меня). Поэтому вам, возможно, придется связать один раз с другими вашими модулями, а затем связать их снова против библиотеки C.Не буду педантичным, но:вы абсолютно уверены, что выполняете все переходы по ссылкам?

Я понимаю, что нужно попробовать много всего, и вы, вероятно, уже прочитали руководства, но, может быть, есть что-то полезное, что можно попробовать?

Кроме того, и вы, вероятно, уже это знаете, но этот сайт (для поиска кодов ошибок) бесконечно полезен.(вместе с указанными выше ссылками для полнотекстового поиска руководства)

Редактировать: эта страница также говорится о «встроенных функциях» - вы могли бы попробовать (как указано внизу страницы) «#undef memcpy», чтобы использовать невстроенную версию?

Можете ли вы показать нам свои аргументы компилятора?Вам необходимо убедиться, что вы не подключаете стандартные заголовочные файлы 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

Вам не хватает закрывающей скобки «}» для функции?Как насчет отсутствующих терминаторов строки с точкой с запятой?При отсутствии фигурных скобок/точек с запятой компилятор z/OS C иногда выдает странные/вводящие в заблуждение сообщения.У меня нет его, чтобы попробовать, но я предполагаю, что у Metal он тоже есть.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top