проблемы с 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;


person Jared    schedule 03.06.2009    source источник
comment
У вас есть проблема #include. Попробуйте переместить string.h после stdlib.h.   -  person i_am_jorf    schedule 03.06.2009
comment
Перетасовка стандартных заголовков не даст ничего полезного.   -  person David Thornley    schedule 03.06.2009
comment
На самом деле, не могли бы мы получить некоторые подробности о Metal C? То, что вы сделали, выглядит нормально в стандартном C, так что либо вы ошибаетесь в том, что не показываете, либо то, что мы видим, не то, что вы на самом деле напечатали, либо Metal C является дефектным или предстандартным компилятором.   -  person David Thornley    schedule 03.06.2009
comment
пробовал так, не решил проблему.   -  person Jared    schedule 03.06.2009
comment
Metal C содержит очень ограниченный набор стандартной библиотеки C и предназначен для системного программирования мейнфреймов. Я думаю, что это нестандартный компилятор, так как у меня были проблемы с такими вещами, как // не работающий как комментарий и размещение [] в объявлениях. Вот ссылка на дополнительную информацию о нем. www-03.ibm.com/systems/z/os/zos /металл   -  person Jared    schedule 03.06.2009
comment
Компилятор z/OS XL C — это стандартный компилятор. Если вы хотите, чтобы // комментарии работали, укажите параметр SSCOM в параметре exec.   -  person Robert Groves    schedule 09.06.2009


Ответы (4)


Проблема была с порядком обыска. Хотя я выполнял поиск (/usr/metal/include) с помощью в моем JCL, я не продолжил его с параметром Nosearch, поэтому string.h выбирался из стандартных системных библиотек вместо версии, включенной в Metal C. Я вставил свой набор данных optfile, который я передал в CPARM ниже для справки.

//OPTIONS DD *
 SO
 LIST
 LONG
 NOXREF
 CSECT
 METAL
 LP64
 NOSEARCH
 search(/usr/include/metal/)
person Jared    schedule 09.06.2009
comment
Вот почему я включил Wc,nosearch в свои параметры компилятора выше. Я узнал об этой функции на собственном горьком опыте в самом начале. - person Anthony Giorgio; 10.06.2009

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

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

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

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

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

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

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

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

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

person poundifdef    schedule 03.06.2009
comment
Metal C не похож на стандартный Z/OS C, он генерирует чистый ассемблер без каких-либо зависимостей от LE. У меня есть программы для компиляции без memset, в том числе и Metal.h ломает вещи. Я думаю, что это проблема с моим включенным путем поиска, вызывающим включение конфликтующих заголовков, я обновлю вопрос, когда проведу некоторое исследование и узнаю больше. - person Jared; 04.06.2009

Можете ли вы показать нам свои аргументы компилятора? Вы должны убедиться, что вы не загружаете стандартные файлы заголовков 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
person Anthony Giorgio    schedule 04.06.2009
comment
У вас есть пример JCL? Посмотрев на ваш пример, я подумал, что проблема в моей линии CPARM, но не знаю, как ее исправить. // CPARM='SO,LIS,LONG,NOXREF,CSECT,METAL,SEARCH(/usr/include/metal/),', - person Jared; 04.06.2009
comment
Хм... Я не думаю, что когда-либо компилировал C через JCL - могли бы вы запустить оболочку и скомпилировать ее таким образом? - person Anthony Giorgio; 04.06.2009
comment
Все это из скорлупы. Когда я запускаю эту команду, 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 на foo.s или foo.lst, я получаю следующие ошибки. ** ASMA935U Один или несколько необходимых файлов недоступны ** Указана опция ASMA434N GOFF/XOBJECT, будет использоваться опция LIST(133) FSUM3401 Шаг сборки завершился с rc = 20. Я не могу перейти к шагу связывания, пока сборка не заработает . - person Jared; 04.06.2009
comment
Упс! Это была опечатка с моей стороны. Последним аргументом шага as должен быть foo.s, а не foo. Я обновил свой ответ выше. Это сгенерирует объектный файл foo.o, который вызов ld привяжет к работающему исполняемому файлу. - person Anthony Giorgio; 05.06.2009
comment
Все та же ошибка, я думаю, что это проблема с тем, как настроен наш сайт, и что у меня неправильно установлены некоторые переменные среды или они вообще не установлены. - person Jared; 05.06.2009
comment
Так вы говорите, что -mrent -mgoff -a=foo.list -o foo.o foo.s не работает? Вы сказали, что у вас есть foo.s из предыдущего шага, верно? Почему бы вам не вставить сессию сюда, чтобы мы могли ее посмотреть? - person Anthony Giorgio; 05.06.2009

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

person Robert Groves    schedule 09.06.2009