проблемы с memset в Metal C
Вопрос
Я пытаюсь инициализировать среду 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/)
Другие советы
Итак, я понятия не имею.Но несколько предложений:
Вы можете попробовать скопировать/вставить этот код сюда из этот пример просто чтобы убедиться, что все работает «как ожидалось»
Возможно, попробуйте определить некоторые макросы здесь?(когда я программировал на C в zOS, мне пришлось включить несколько странных макросов, чтобы все заработало.У меня нет разумного технического объяснения этому.)
Вы можете попробовать выполнить поиск memset(), используя "=3.14" (из ispf). Посмотрите, используют ли какие-либо другие модули эту функцию, а затем проверьте заголовки, которые они включают (или макросы, которые они определяют - либо в файлах C, либо в файлах H). ), чтобы это работало.
Еще одна мысль:перед memset() попробуйте добавить printf().Если вы получите синтаксическую ошибку в той же строке (только для printf, а не для memset), вы сможете увидеть, находится ли проблема перед строкой 6 — например, в неправильно расставленной скобке.
Наконец, если я правильно помню, мне пришлось скомпилировать отдельные модули, а затем связать их вручную (если только я не написал 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 он тоже есть.