problemi con memset in metallo C
Domanda
Sto cercando di inizializzare l'ambiente di metallo C con il seguente codice, ma ottenere i seguenti errori sulla linea memset. ERRORE CCN3275 IMIJWS0.METAL.SAMPLIB (MEM): 6 testo imprevisto ')' incontrato. ERRORE CCN3045 IMIJWS0.METAL.SAMPLIB (MEM): 6 non dichiarato identificatore ___MEMSET. ERRORE CCN3277 IMIJWS0.METAL.SAMPLIB (MEM): 6 Errore di sintassi: possibile manca ')' o ''? CCN0793 (I) Compilazione riuscita per il file //'IMIJWS0.METAL.SAMPLIB(MEM)'. il file oggetto non creato. Qui di seguito è il mio codice
#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;
Soluzione
Il problema è stato con l'ordine di ricerca. Anche se ho fatto di ricerca (/ usr / metal / include) da con il mio JCL non ho procedo con un'opzione di nosearch, così string.h è stato sempre preso dalle librarys di sistema standard invece della versione inclusa con Metal C. ho incollato il mio optfile dataset passai al CPARM sotto per refference.
//OPTIONS DD * SO LIST LONG NOXREF CSECT METAL LP64 NOSEARCH search(/usr/include/metal/)
Altri suggerimenti
Quindi, non ho idea. Ma alcuni suggerimenti:
-
Si potrebbe provare a copiare / incollare questo codice qui da questo esempio solo per assicurarsi che funziona 'come previsto'
-
Forse provare definire alcune delle macro qui ? (Quando ho fatto la programmazione C su zOS, ho dovuto fare includere alcune macro strani al fine di ottenere cose al lavoro. Non ho una spiegazione tecnica ragionevole per questo.)
-
Si potrebbe provare a cercare memset () utilizzando "= 3.14" (da ISPF.) Vedi se tutti gli altri moduli utilizzano tale funzione, e quindi controllare le intestazioni che includono (o macro che essi definiscono - sia in i file C oi file H) per farlo funzionare.
-
Un altro pensiero:. Prima della memset (), prova a fare mettere un printf () in Se si ottiene un errore di sintassi sulla stessa linea (solo per printf, piuttosto che memset) allora si può vedere se il problema è prima linea 6 -. come una parentesi fuori luogo
-
Infine, se non ricordo male, ho dovuto compilare i miei moduli individuali, e quindi collegare manualmente (a meno che non ho scritto un JCL per fare questo per me.) Così si potrebbe essere necessario collegare una volta a collegare con la vostra altri moduli, e quindi collegare di nuovo contro la libreria C. Non per essere pedanti, ma: sei abbastanza certo che si sta facendo tutto il collegamento passa
Mi rendo conto che è un sacco di cerchi per cercare di probabilmente avete già letto i manuali, ma forse c'è qualcosa di utile provare?
Inoltre, e probabilmente già sapete questo, ma questo sito (per la ricerca di codici di errore) è infinitamente utile. (Insieme con i link qui sopra per full-text-ricerca manuale)
Modifica: questa pagina parla anche di "funzioni built-in" - si potrebbe provare (come indicato in fondo alla pagina) "#undef memcpy" per usare la non-built-in versione
?Ci puoi mostrare i tuoi argomenti compilatore? È necessario assicurarsi che non stai tirando nei file di intestazione C standard, in aggiunta a quelli in metallo C. Ecco un esempio:
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
Vi manca la parentesi di chiusura '}' per la funzione? Che ne dite di eventuali terminazioni di linea e virgola mancanti? Quando manca bretelle / punti e virgola il compilatore C z / OS getta un po 'strano / fuorvianti messaggi a volte. Io non ce l'ho da provare, ma sto assumendo metallo fa pure.