A
andrullo
Jungspund

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 compiliert 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.
Hier ein Auszug aus dem Quell-Code und die Fehlermeldung:
Operatordefintion:
Array<Real,2> DiffParser:: operator()(const Real& t, const Array<Real,2>& Vars);
kritischer Code:
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)));
.
.
}
(Fehler)meldung:
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::operator()(const Real&, const blitz::Array<Real, 2>&)
make: *** [newton.o] Fehler 1
Irgendwarum beschwert sich der Compiler, dass ich
ein Auswertung innerhalb der Funktionsargumente vollziehen
möchte.
bisheriges work around:
Einführen einer temporären Variablen zur Addition zur
Vermeidung der Auswertung im Funktionsargument
XTEMP = x+Z(Range::all(),Range(j,j));
Z(Range::all(),Range(j,j)) = f(t_c[j],XTEMP);
Mit dieser Abänderung wird der Code wieder
compiliert. Die Einführung einer temporären
Variable finde ich aber ineffizient und scheint mir
(hoffentlich) nicht nötig. Wie schon gesagt, unter den älteren Versionen lief das Programm problemlos.
Habt Ihr irgendwelche Ideen?
Gruß
Andre