* Greg Shaw:
>
> Hi there! This is my first post, so hello everybody. I've been banging
> my head against the wall writing my first C++ program which calls a
> Guardian Procedure, on a HP NonStop (Tandem) machine. I have RTFM good
> and hard with no success, tried various syntax blags, and asked around
> at my place of work, and no-one can help, so I thought I'd ask you
> lot. And yes, I have tried running it in debug using INSPECT, but when
> trying to STEP IN to the call to the Guardian procedure, the source is
> not available so I can't follow what's going on.
I'm not familiar with any of the tools or APIs you're using.
They don't matter though.
> The task I set myself was the most basic one - wrap up in C++ a nice
> safe Guardian procedure which can't do any damage. I chose
> PROCESS_GETINFO_ . I ended up putting loads of cout statements at the
> end of the program just so I can see everything - a more useful
> version would be supplying So, can anyone tell me why the program
> below results in this response (return code 2 is Parameter error) from
> the NonStop, please?
>
> returnCode is 2
> processHandle is 8003de8
> *processHandle is 0
> errorDetail is 8003e08
> *errorDetail is 1
No. That's to do with the internals of PROCESS_GETINFO_, and nothing to do with
C++. I.e., it's off-topic.
> ============================================
> // process_getinfo_.cpp
> //
> // A first attempt to write C++ which calls a Guardian procedure.
>
> // inclusion guard:
> #ifndef MY_PROCESS_GETINFO
> #define MY_PROCESS_GETINFO
You don't need include guards for a main program or other implementation file.
Include guarads are used for header files.
> // Begin
> #include < cextdecs(PROCESS_GETINFO_)>
Are you sure that 'cextdecs' is a macro that expands to a header file name?
Anyway I'm not sure of the syntax here.
Macros as header names is a very seldom used feature.
> #include <iostream>
> using std::cout;
> using std::endl;
>
> int main()
> {
> short returnCode=0;
> short *processHandle = new short[10];
Here you should just use std::vector, i.e.,
std::vector<short> processHandle( 10 );
You then need to
#include <vector>
among the other includes.
> for (int i = 0; i<10 ; i++ )
> {
> processHandle[i] = '\0';
Presumably process handles are not characters.
Anyway this zeroing loop is unnecessary when using std::vector.
> }
> short *errorDetail = new short[1];
Here you can just use
short errorDetail;
and that's that.
> errorDetail[0] = '\0';
> cout << "\nHello. This is designed to use C++ to call the" << endl;
> cout << "Guardian procedure PROCESS_GETINFO_ with no processhandle"
> << endl;
> cout << "argument - so designed to return the processhandle of the"
> << endl;
> cout << "caller, plus any error information. Good luck...." << endl;
>
> returnCode = PROCESS_GETINFO_ (processHandle // [ short *processhandle ] /*i,o 1 */
> ,// [ char *proc-fname ] /* o 2 */
> ,// [ short maxlen ] / * o 2 */
> ,// [ short *proc-fname-len ] /* o 3 */
> ,// [ short *priority ] /* i 4 */
> ,// [ short *mom’s-processhandle ] /*i 5 */
> ,// [ char *hometerm ] /* i 6 */
> ,// [ short maxlen ] / * i 6 */
> ,// [ short *hometerm-len ] /* i 7 */
> ,// [ long long *process-time ]/* i 8 */
> ,// [ short *creator- access-id ]/*i 9 */
> ,// [ short *process- access-id ]/*i 10 */
> ,// [ short *gmom’s- processhandle ]/* i11 */
> ,// [ short *jobid ] / * i 12 */
> ,// [ char *program- file ] /* i 13 */
> ,// [ short maxlen ] / * i 13 */
> ,// [ short *program- len ] /* i 14 */
> ,// [ char *swap- file ] /* i 15 */
> ,// [ short maxlen ] / * i 15 */
> ,// [ short *swap- len ] /* i 16 */
> , errorDetail // [ short *error- detail ] /* i 17 */
> ,// [ short *proc- type ] /* i 18 */
> ,// [ __int32_t *oss- pid ] /* i 19*/;
> );
C++ does not have default arguments.
I can't think of any definition of PROCESS_GETINFO_ where the above would compile.
Cheers & hth.,
- Alf
--
Due to hosting requirements I need visits to <url: http://alfps.izfree.com/>.
No ads, and there is some C++ stuff!

Just going there is good. Linking
to it is even better! Thanks in advance!