Announcement

Collapse
No announcement yet.

Compilierungsproblem mit blitz++ unter gcc 3.3.3

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Compilierungsproblem mit blitz++ unter gcc 3.3.3

    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&lt;Real,2&gt; DiffParser:: operator()(const
    Real& t, const Array&lt;Real,2&gt;& Vars);
    </Pre>

    kritischer Code:
    <Pre>
    int newton(..., Array&lt;Real,2&gt;& 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&lt;Real, 2&gt;&, DiffParser&, bool,
    const int&, Real&, bool&, const
    Real*, const Real*, const bool&,
    blitz::Array&lt;Real, 2&gt;&, blitz::Array&lt;Real,
    2&gt;&, const int&, int&, const Real&, const
    Real&)':
    newton.cpp:148: error: no match for call to
    `(DiffParser) (Real&,
    blitz::_bz_ArrayExpr&lt;blitz::_bz_ArrayExprOp&lt; blitz::FastArrayIterator&lt;Real,
    2&gt;, blitz::FastArrayIterator&lt;Real, 2&gt;,
    blitz::Add&lt;Real, Real&gt; &gt; &gt'
    DiffParser.h:25: error: candidates are:
    blitz::Array&lt;Real, 2&gt;
    DiffParser:perator()(const Real&, const
    blitz::Array&lt;Real, 2&gt;&)
    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
Working...
X