Hallo!
Ich habe ein Numerik-Programm unter SUSE LINUX 7.1
unter der Verwendung des gcc-Compilers 2.95... und
der Matrix-Bibliothek Blitz++ Version 6 geschrieben,
was auch ohne Probleme compilert wurde.
Nun verwende ich Blitz++ 7 und gcc 3.3.3, wo der
Quell-Code nicht mehr fehlerfrei übersetzt wird.
Leider weiss ich nicht warum und hoffe, das Ihr mir
vielleicht helfen könnt.
Operatordefintion:
<Pre>
Array<Real,2> DiffParser:: operator()(const
Real& t, const Array<Real,2>& Vars);
</Pre>
kritischer Code:
<Pre>
int newton(..., Array<Real,2>& Z,...)
{
.
.
Z = 0;
.
.
//kritische Zeile:
Z(Range::all(),Range(j,j)) =
f(t_c[j],x+Z(Range::all(),Range(j,j)));
.
.
}
</Pre>
Fehlermeldung:
<Pre>
g++ -c newton.cpp
newton.cpp: In function `int newton(const Real&,
const int&, const
blitz::Array<Real, 2>&, DiffParser&, bool,
const int&, Real&, bool&, const
Real*, const Real*, const bool&,
blitz::Array<Real, 2>&, blitz::Array<Real,
2>&, const int&, int&, const Real&, const
Real&)':
newton.cpp:148: error: no match for call to
`(DiffParser) (Real&,
blitz::_bz_ArrayExpr<blitz::_bz_ArrayExprOp< blitz::FastArrayIterator<Real,
2>, blitz::FastArrayIterator<Real, 2>,
blitz::Add<Real, Real> > >'
DiffParser.h:25: error: candidates are:
blitz::Array<Real, 2>
DiffParser:perator()(const Real&, const
blitz::Array<Real, 2>&)
make: *** [newton.o] Fehler 1
</Pre>
bisheriger work around:
Einführen einer temporären Variablen zur Addition zur
Vermeidung der Auswertung im Funktionsargument
<Pre>
XTEMP = x+Z(Range::all(),Range(j,j)); //work around
Z(Range::all(),Range(j,j)) = f(t_c[j],XTEMP);
<\Pre>
Mit dieser Abänderung wird der Code wieder
compiliert. Die Einführung einer temporären
Variablen ist aber ineffizient und scheint mir
(hoffentlich) nicht nötig.
Habt Ihr irgendeine Idee?
Viele Grüße
Andre
Ich habe ein Numerik-Programm unter SUSE LINUX 7.1
unter der Verwendung des gcc-Compilers 2.95... und
der Matrix-Bibliothek Blitz++ Version 6 geschrieben,
was auch ohne Probleme compilert wurde.
Nun verwende ich Blitz++ 7 und gcc 3.3.3, wo der
Quell-Code nicht mehr fehlerfrei übersetzt wird.
Leider weiss ich nicht warum und hoffe, das Ihr mir
vielleicht helfen könnt.
Operatordefintion:
<Pre>
Array<Real,2> DiffParser:: operator()(const
Real& t, const Array<Real,2>& Vars);
</Pre>
kritischer Code:
<Pre>
int newton(..., Array<Real,2>& Z,...)
{
.
.
Z = 0;
.
.
//kritische Zeile:
Z(Range::all(),Range(j,j)) =
f(t_c[j],x+Z(Range::all(),Range(j,j)));
.
.
}
</Pre>
Fehlermeldung:
<Pre>
g++ -c newton.cpp
newton.cpp: In function `int newton(const Real&,
const int&, const
blitz::Array<Real, 2>&, DiffParser&, bool,
const int&, Real&, bool&, const
Real*, const Real*, const bool&,
blitz::Array<Real, 2>&, blitz::Array<Real,
2>&, const int&, int&, const Real&, const
Real&)':
newton.cpp:148: error: no match for call to
`(DiffParser) (Real&,
blitz::_bz_ArrayExpr<blitz::_bz_ArrayExprOp< blitz::FastArrayIterator<Real,
2>, blitz::FastArrayIterator<Real, 2>,
blitz::Add<Real, Real> > >'
DiffParser.h:25: error: candidates are:
blitz::Array<Real, 2>
DiffParser:perator()(const Real&, const
blitz::Array<Real, 2>&)
make: *** [newton.o] Fehler 1
</Pre>
bisheriger work around:
Einführen einer temporären Variablen zur Addition zur
Vermeidung der Auswertung im Funktionsargument
<Pre>
XTEMP = x+Z(Range::all(),Range(j,j)); //work around
Z(Range::all(),Range(j,j)) = f(t_c[j],XTEMP);
<\Pre>
Mit dieser Abänderung wird der Code wieder
compiliert. Die Einführung einer temporären
Variablen ist aber ineffizient und scheint mir
(hoffentlich) nicht nötig.
Habt Ihr irgendeine Idee?
Viele Grüße
Andre