| Title: | C++ |
| Notice: | Read 1.* and use keywords (e.g. SHOW KEY/FULL KIT_CXX_VAX_VMS) |
| Moderator: | DECCXX::AMARTIN |
| Created: | Fri Nov 06 1987 |
| Last Modified: | Thu Jun 05 1997 |
| Last Successful Update: | Fri Jun 06 1997 |
| Number of topics: | 3604 |
| Total number of notes: | 18242 |
$ cxx/version nl:
DEC C++ T5.5-004 on OpenVMS VAX T7.0
I hope this question isn't too rudimentary. I tried to find an answer in other
notes and couldn't. I am trying to declare an object name "globalIa" of a class
type "IntArray" in a C++ main() module (x.cxx) and reference it in another
module (xx.cxx). The problem is that the link gets an undefined symbol being
referenced in the second (xx.cxx) module. I declared a global integer "i" using
the same technique and it *is* visible to both modules. If I comment out the
references to globalIa and rebuild the value assigned to the integer in the main
module is seen in the other module so I know it's working.
How can I properly declare "globalIa" and build the following code fragment so
the same "globalIa" object is visble to both modules?:
$ TYPE x.cxx
#include "intarray.h"
#include "xx.h"
// Want to be able to access this global integer in another module.
int i = 999;
// Want to be able to access this global object in another module.
IntArray globalIa();
main()
{
aroutine();
}
$ TYPE xx.h
void aroutine();
$ TYPE xx.cxx
#include "intarray.h"
#include <iostream.h>
extern int i;
extern IntArray globalIa;
void aroutine()
{
cout << "aroutine entered. i is " << i << endl;
cout << "globalIa.getSize() is " << globalIa.getSize() << endl;
}
$ TYPE x.opt
x
xx
intarray
$ SET VERIFY
$ LINK/DEBUG X/OPT
x
xx
intarray
%LINK-W-NUDFSYMS, 1 undefined symbol:
%LINK-I-UDFSYM, GLOBALIA
%LINK-W-USEUNDEF, undefined symbol GLOBALIA referenced
in debug or traceback record
in module XX file DKA300:[ZIELONKO.DECCPP]XX.OBJ;3
%LINK-W-USEUNDEF, undefined symbol GLOBALIA referenced
in psect $CODE offset %X000000CB
in module XX file DKA300:[ZIELONKO.DECCPP]XX.OBJ;3
I tried it as follows too with no difference:
$ link/debug x/opt
UNIVERSAL=globalIa
x
xx
intarray
%LINK-W-NUDFSYMS, 1 undefined symbol:
%LINK-I-UDFSYM, GLOBALIA
%LINK-W-USEUNDEF, undefined symbol GLOBALIA referenced
in debug or traceback record
in module XX file DKA300:[ZIELONKO.DECCPP]XX.OBJ;3
%LINK-W-USEUNDEF, undefined symbol GLOBALIA referenced
in psect $CODE offset %X000000CB
in module XX file DKA300:[ZIELONKO.DECCPP]XX.OBJ;3
$ run x/nodebug
aroutine entered. i is 999
%SYSTEM-F-ACCVIO, access violation, reason mask=00, virtual address=00000000,
PC=00000689, PSL=03C00004
%TRACE-F-TRACEBACK, symbolic stack dump follows
module name routine name line rel PC abs PC
XX IntArray::getSize 38 00000009 00000689
XX aroutine 6184 00000061 0000071D
X main 64 00000028 00000630
globalIa.getSize() is
Thanks in advance,
Karol
Here is intarray.h in case anyone needed to see it. I do not include
intarray.cxx as I am confident that it works properly and didn't want to muddle
up this note too badly. If you need to see it I can post it too.
$ ty intarray.h
// Assignment 2
//
// Header file for IntArray class
//
#ifndef _INTARRAY_H_
//
// IntArray.h
//
#define _INTARRAY_H_
const int ArraySize = 12;
const int MaxArraySize = 65535;
const char ArrayName[] = "Default";
class IntArray
{
public:
// Default Constructor
IntArray();
// Constructor
IntArray( const char *name, unsigned int sz = ArraySize );
// Destructor
~IntArray();
// Routine to print to default output
void print();
// Overloaded operator[]
int &operator[]( int );
int *operator[]( long );
// "normal" inlined member function
int getSize() { return m_size; }
private:
// member data
unsigned int m_size;
int *m_ia;
// The following data member should be declared const
// but we are not ready to initialize const data members
// yet (there's special syntax needed that we have not
// covered yet). So far now, drop the const
//const char *m_name;
char *m_name;
};
#endif
| T.R | Title | User | Personal Name | Date | Lines |
|---|---|---|---|---|---|
| 3412.1 | I think your declaration of globalIa is wrong... | DECC::J_WARD | Mon Jan 27 1997 10:01 | 12 | |
// Want to be able to access this global object in another module. IntArray globalIa(); This declares a function called globalIa which takes no arguments and returns a IntArray. I think you meant: IntArray globalIa; // notice no parens Judy | |||||
| 3412.2 | (notes collision)But in x.cxx you declared globalIa to be a Function! | WIDTH::MDAVIS | Mark Davis - compiler maniac | Mon Jan 27 1997 10:20 | 41 |
> // Want to be able to access this global object in another module.
> IntArray globalIa();
--------------------^^
This is a function prototype, promising a function that returns an object
of type IntArray; this is NOT the definition of a global object!
If you remove the "()", the linker will be very happy, and your program
will work fine.
[Notice your xx.h, which contains the function prototype for "aroutine":
>$ TYPE xx.h
> void aroutine();
this has the same syntactic form as "IntArray globalIa();"]
OR, if you have an IntArray constructor that takes an argument, eg.,
IntArray(int);
and your definition of globalIa contains an argument:
IntArray globalIa(10);
then this will Also cause globalIa to be a global object.
Unfortunately in C++, there is syntactic ambiguity between declaring an
object initialized with a NO argument
IntArray globalIa(/* object, call constructor with no argument*/);
and a funtion prototype:
IntArray globalIa();
and since the latter is left over from C, the "ambiguity" is "defined" to be
a function prototype.
Mark Davis
c/c++ team
| |||||
| 3412.3 | That did it. Thanks | UCXAXP::ZIELONKO | Mon Jan 27 1997 13:03 | 18 | |
>> // Want to be able to access this global object in another module. >> IntArray globalIa(); > > >This declares a function called globalIa which takes no arguments >and returns a IntArray. > >I think you meant: > >IntArray globalIa; // notice no parens Oops, duh. That fixed it. I thought I was doing something silly. I was trying to force the default constructor for the IntArray class to be used and somehow thought that was the syntax. Oh well. Thanks, Karol | |||||