gordon%stats.ucl.ac.uk@NSFNET-RELAY.AC.UK (Gordon Joly) (06/12/89)
I have had some problems with a class generated by ``genclass double ref AVec''; I have been able to use the files double.AVec.h etc, but my small test program below gives worse results! For example I have seen line 23 work correctly. I am sure that I am slightly off the track, but also feel that the generated classes are a little bit off as well. Gordon Joly. libg++ 1.35.0 on SUN-3/160; g++ 1.35.1- with gcc 1.35 using gas 1.34, karl:/stats/staff/karl/gordon/BAIES/ws[34] cat -n marginal.cc 1 // 2 // marginal.cc 3 // 4 5 #include "double.AVec.h" 6 7 doubleAVec data(4,0.0); 8 9 class jtnode 10 { 11 doubleAVec marginals(); 12 // doubleAVec marginals(4,1.0); gives an error 13 doubleAVec cpt(); 14 public: 15 jtnode(int size); 16 void jtfunction(); 17 void insert(doubleAVec ); 18 }; 19 20 void 21 jtnode::jtfunction() 22 { 23 marginals = cpt + cpt + cpt ; 24 marginals = cpt * 3; 25 marginals = cpt + 10; 26 } 27 28 void 29 jtnode::insert(doubleAVec d) 30 { 31 cpt = d ; 32 } 33 34 main() 35 { 36 jtnode a(4); 37 a.insert(data); 38 } 39 40 // end of marginal.cc 41 42 43 44 karl:/stats/staff/karl/gordon/BAIES/ws[35] !g g++ -v -c marginal.cc g++ version 1.35.1- /stats/staff/karl/lib/gcc-cpp -+ -v -undef -D__GNU__ -D__GNUG__ -D__cplusplus -Dmc68000 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -D__HAVE_68881__ -Dmc68020 marginal.cc /tmp/cca04916.cpp GNU CPP version 1.35 /stats/staff/karl/lib/gcc-cc1plus /tmp/cca04916.cpp -quiet -dumpbase marginal.cc -noreg -version -o /tmp/cca04916.s GNU C++ version 1.35.1- (68k, MIT syntax) compiled by GNU C version 1.35. double.Vec.h:169: parse error before `doubleVec_error_handler' double.Vec.h:169: warning: data definition lacks type or storage class double.Vec.h:172: parse error before `set_doubleVec_error_handler' double.Vec.h:172: `one_arg_error_handler_t' undeclared, outside of functions double.Vec.h:172: parse error before `f' double.Vec.h:172: warning: data definition lacks type or storage class In method void jtnode::jtfunction (): marginal.cc:23: invalid operands to binary + marginal.cc:24: invalid operands to binary * marginal.cc:25: invalid lvalue in assignment In method void jtnode::insert (struct doubleAVec): marginal.cc:31: invalid lvalue in assignment karl:/stats/staff/karl/gordon/BAIES/ws[36] karl:/stats/staff/karl/gordon/BAIES/ws[37] cat double.AVec.h // This may look like C code, but it is really -*- C++ -*- /* Copyright (C) 1988 Free Software Foundation written by Doug Lea (dl@rocky.oswego.edu) This file is part of GNU CC. GNU CC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY. No author or distributor accepts responsibility to anyone for the consequences of using it or for whether it serves any particular purpose or works at all, unless he says so in writing. Refer to the GNU CC General Public License for full details. Everyone is granted permission to copy, modify and redistribute GNU CC, but only under the conditions described in the GNU CC General Public License. A copy of this license is supposed to have been given to you along with GNU CC so you can know your rights and responsibilities. It should be in a file named COPYING. Among other things, the copyright notice and this notice must be preserved on all copies. */ #ifndef _doubleAVec_h #pragma once #define _doubleAVec_h 1 #include "double.Vec.h" class doubleAVec : public doubleVec { protected: void check_len(int l); double* vec(); doubleAVec(int l, double* d); public: doubleAVec (); doubleAVec (int l); doubleAVec (int l, double& fill_value); doubleAVec (doubleAVec&); ~doubleAVec (); doubleAVec& operator = (doubleAVec& a); doubleAVec& operator = (double& fill_value); // vector by scalar -> vector operations friend doubleAVec operator + (doubleAVec& a, double& b); friend doubleAVec operator - (doubleAVec& a, double& b); friend doubleAVec operator * (doubleAVec& a, double& b); friend doubleAVec operator / (doubleAVec& a, double& b); doubleAVec& operator += (double& b); doubleAVec& operator -= (double& b); doubleAVec& operator *= (double& b); doubleAVec& operator /= (double& b); // vector by vector -> vector operations friend doubleAVec operator + (doubleAVec& a, doubleAVec& b); friend doubleAVec operator - (doubleAVec& a, doubleAVec& b); doubleAVec& operator += (doubleAVec& b); doubleAVec& operator -= (doubleAVec& b); doubleAVec operator - (); friend doubleAVec product(doubleAVec& a, doubleAVec& b); doubleAVec& product(doubleAVec& b); friend doubleAVec quotient(doubleAVec& a, doubleAVec& b); doubleAVec& quotient(doubleAVec& b); // vector -> scalar operations friend double operator * (doubleAVec& a, doubleAVec& b); double sum(); double min(); double max(); double sumsq(); // indexing int min_index(); int max_index(); // redundant but necesssary friend doubleAVec concat(doubleAVec& a, doubleAVec& b); friend doubleAVec map(doubleMapper f, doubleAVec& a); friend doubleAVec merge(doubleAVec& a, doubleAVec& b, doubleComparator f); friend doubleAVec combine(doubleCombiner f, doubleAVec& a, doubleAVec& b); friend doubleAVec reverse(doubleAVec& a); doubleAVec at(int from = 0, int n = -1); }; inline doubleAVec::doubleAVec() {} inline doubleAVec::doubleAVec(int l) :(l) {} inline doubleAVec::doubleAVec(int l, double& fill_value) : (l, fill_value) {} inline doubleAVec::doubleAVec(doubleAVec& v) :(v) {} inline doubleAVec::~doubleAVec() {} inline double* doubleAVec::vec() { return s; } inline doubleAVec::doubleAVec(int l, double* d) { len = l; s = d; } inline void doubleAVec::check_len(int l) { if (l != len) error("nonconformant vectors."); } #endif karl:/stats/staff/karl/gordon/BAIES/ws[38]