Compilerfehlermeldung



  • Hallo,

    ich habe ein Programm von einem Bekannten bekommen, bei dem mir versischert wurde das es einwandfrei läuft. Wenn ich es nun compilieren will so geht es natürlich nicht 😡

    Hier die Fehlermeldung:
    richardsdd.cc:519: error: could not convert ‘surfaceWaterDirichletNodes[i].Dune::BitSetVector<block_size, Alloc>::operator[] [with int block_size = 1, Allocator = std::allocator<bool>](j)’ to ‘bool’

    bitsetvector ist ein dynamisches Array aus blöcken, diese blöcken bestehen aus bool Werten.

    http://www.dune-project.org/doc-1.2/doxygen/html/classDune_1_1BitSetVector.html

    hier der entsprechende Code:

    BitSetVector<1> surfaceWaterDirichletNodes[numGrids];
    .
    .// nicht relevanter Code
    .
      for (int j=0; j<u[i].size(); j++)
        if (surfaceWaterDirichletNodes[i][j]) // von dieser zeile kommt die meldung
                    u[i][j] = parameters[i].physicalToGeneralizedPressure(surfaceWaterPressure[i][j]);
    

    Ich bin ratlos, da m.M. die Syntax korrekt ist, die if-abfrage verlangt einen bool-wert und dieser leigt mit "surfaceWaterDirichletNodes[i][j]" vor.

    Ich habe kde-linux und verwende dessen Standartcompiler.

    Vielen Dank

    Rellich



  • Rellich schrieb:

    Ich bin ratlos, da m.M. die Syntax korrekt ist, die if-abfrage verlangt einen bool-wert und dieser leigt mit "surfaceWaterDirichletNodes[i][j]" vor.

    Nein, surfaceWaterDirichletNodes[i][j] ist immer noch ein Bitset, auch wenn nur ein einziges Bit drin ist. Du musst also angeben, welches Bit dieses Set du testen willst.



  • MFK schrieb:

    Rellich schrieb:

    Ich bin ratlos, da m.M. die Syntax korrekt ist, die if-abfrage verlangt einen bool-wert und dieser leigt mit "surfaceWaterDirichletNodes[i][j]" vor.

    Nein, surfaceWaterDirichletNodes[i][j] ist immer noch ein Bitset, auch wenn nur ein einziges Bit drin ist. Du musst also angeben, welches Bit dieses Set du testen willst.

    Bist du dir da sicher? So wie ich das sehe greift er mit dem zweiten Index doch bereits auf die Klasse zu.
    Siehe:

    surfaceWaterDirichletNodes[i] : BitSetVector<1>
    BitSetVector<1>[j] : bool
    

    Deine Aussage wäre richtig, sofern surfaceWaterDirichletNodes ein zweidimensionales Array wäre.
    Oder übersehe ich hier jetzt was?
    Gruß Gate



  • Gate schrieb:

    Bist du dir da sicher? So wie ich das sehe greift er mit dem zweiten Index doch bereits auf die Klasse zu.

    Ja, aber die Klasse ist ein Vector von Bitsets, bringt also schon mal zwei Dimensionen mit.



  • Warum hier eigentlich keinen vector<bool>?



  • ich habe das Problem nun "gelöst"

    indem ich in die if-Bedingung umgeschrieben habe:

    BitSetVector<1> surfaceWaterDirichletNodes[numGrids];
    .
    .// nicht relevanter Code
    .
      for (int j=0; j<u[i].size(); j++)
        if (surfaceWaterDirichletNodes[i][j]==1) // von dieser zeile kommt die meldung
                    u[i][j] = parameters[i].physicalToGeneralizedPressure(surfaceWaterPressure[i][j]);
    

    Kann das vielleicht an dem Compiler liegen ? ich bin da echt ratlos wieso das eine geht, das andere aber nicht 😕

    Grüße,

    Rellich


  • Mod

    Rellich schrieb:

    Kann das vielleicht an dem Compiler liegen ?

    Nein. Merke dir diese Faustregel: Du findest keine Compilerfehler. Nie.

    Dein Fehler wurde dir schon erklärt. Der Unterschied bei der zweiten Variante ist, dass du hier explizit den Operator == von bitset aufrufst, welcher dann implizit die 1 zu einem bitset wandelt, da ein entsprechender Konstruktor existiert.



  • ich habe mich da etwas ungenau ausgedrückt. ich meinte könnte es am Compiler liegen. Ich denke mir nämlich mein bekannter benutzt compiler xy bei sich, da klappt es. ich benutze nun compiler a da klappt es nicht.


  • Mod

    Rellich schrieb:

    ich habe mich da etwas ungenau ausgedrückt. ich meinte könnte es am Compiler liegen. Ich denke mir nämlich mein bekannter benutzt compiler xy bei sich, da klappt es. ich benutze nun compiler a da klappt es nicht.

    Es ist den Implementierungen überlassen, zusätzliche Features in die Standardbibliothek einzubauen, daher kann es möglich sein, dass deine erste (nicht standardkonforme) Variante trotzdem übersetzt wird. Ich fände es jedoch sehr ungewöhnlich, dass sich jemand die Mühe macht ein ziemlich nutzloses Feature in eine wenig benutzte Klasse einzubauen und würde daher eher von einem Irrtum deinerseits ausgehen.


Anmelden zum Antworten