C++ Quizfrage



  • An all die C++-Profis und Verfechter: Sagt mir, weshalb dieser Code manchmal Mist liefert und manchmal ein richtiges Ergebnis! Kann auch gut sein, dass der Fehler bei bestimmten Compilern auftaucht und bei manchen nicht. Bin gespannt. 🙂

    QString qStr = someQString.count() <= someInt ? "" : someQString[someInt];
    


  • Wenn count < size() dann Leerstring.
    Ansonsten Index im Vektor.
    Sicher?



  • Ich weiß nicht so recht, was du meinst. Also entweder Leerstring oder es wird ein bestimmtes Zeichen an der Postion someInt in someQString zurückgegeben.



  • ςWas ist QString? Welchen Typ hat someQString [someInt]?

    Das ist kein Standard C++

    Ich vermute mal, Dein Problem sind die unterschiedlichen Typen des conditional operators.

    Mfg Martin



  • Zusatz definiere Mist



  • unsure schrieb:

    Wenn count < size() dann Leerstring.
    Ansonsten Index im Vektor.
    Sicher?

    Das wirds sein, die anderen Kommentare sind irrelevant.


  • Mod

    ~~Vergleich zwischen signed und unsigned Typen (ich vermute mal, dass count einen size_t zurück gibt).
    ~~
    Unterschiedliche Rückgabetypen beim ?-Operator. Das sollte gar nicht compilieren. Welche Compiler übersetzt das? Vermutlich wird hier irgendwie ein char* aus einem char gemacht, was man dann ziemlich gut als "Mist" beschreiben könnte. Ansonsten sag genauer, was du mit "Mist" meinst und/oder frag im passenden Forum, wenn du Probleme mit einer bestimmten Klasse eines Frameworks hast.


  • Mod

    @mgaeckler: Googlen hast du probiert, oder?

    -Vergleich zwischen signed und unsigned Typen (ich vermute mal, dass count einen size_t zurück gibt).

    Auf Basis dieser Annahme habe ich bereits einen Post vor einigen Minuten verfasst, und in wieder gelöscht als ich rausfand dass count int zurückgibt.

    Das sollte gar nicht compilieren.

    ^ Das. operator[] gibt einen QCharRef zurück.



  • Das ist das Problem. In meinem Fall wurde someQString[someInt] in ein C-String konvertiert und dann wieder zurück in ein QString. Das geht manchmal gut, manchmal, bei Unicodes > 255 liefert das Mist.
    Und doch: Das ist C++ Standard. Genau diese Konvertierung ist so vorgesehen.

    If the types of the second and third operands are not identical, then complex type conversion rules, as specified in the C++ Standard, are invoked. These conversions may lead to unexpected behavior including construction and destruction of temporary objects. For this reason, we strongly advise you to either (1) avoid using user-defined types as operands with the conditional operator or (2) if you do use user-defined types, then explicitly cast each operand to a common type.

    https://msdn.microsoft.com/en-us/library/e4213hs1.aspx

    Das sind so Stellen, wo die Mächtigkeit von C++ nicht mehr schön ist und wo man alle möglichen Regeln kennen muss. Das ist ein Code-Ausschnitt einer Software, die ich warten musste und dieser Fehler hat mich mehrere Stunden aufgehalten, da der Konvertierungsfehler an allen möglichen Stellen hätte auftauchen könnte, nicht nur in meinem Code, sondern auch im ODBC-Treiber oder in der Datenbank.
    Wenn die Komplexität der Software irgendwann so groß ist, dann ist es nicht mehr schön, wenn einem eine Sprache in dem Weg steht. - Gar nicht schön!!!


  • Mod

    Arcoth schrieb:

    -Vergleich zwischen signed und unsigned Typen (ich vermute mal, dass count einen size_t zurück gibt).

    Auf Basis dieser Annahme habe ich bereits einen Post vor einigen Minuten verfasst, und in wieder gelöscht als ich rausfand dass count int zurückgibt.

    Habe ich inzwischen auch gemerkt, weil ich doch neugierig war und es schnell gegoogelt habe.

    Das sollte gar nicht compilieren.

    ^ Das. operator[] gibt einen QCharRef zurück.

    Dann ist natürlich die Frage, was der Threadersteller überhaupt getestet hat. Den gezeigten Code offenbar nicht. Oder gibt's wirklich Compiler, die das übersetzen? Solch ein "Feature" kann doch eigentlich niemals ein sinnvolles Ergebnis geben.edit :Oder eben doch. Wer kann denn ahnen, dass bei Qt eine Zeichenreferenz implizit in eine Zeichenkette konvertierbar ist?


  • Mod

    Quizfrage schrieb:

    Das ist das Problem. In meinem Fall wurde someQString[someInt] in ein C-String konvertiert und dann wieder zurück in ein QString. Das geht manchmal gut, manchmal, bei Unicodes > 255 liefert das Mist.
    Und doch: Das ist C++ Standard. Genau diese Konvertierung ist so vorgesehen.

    Das ist dann doch ein Fehler in Qt, wenn die eine automatische Konvertierung von QCharRef zu einem char* erlauben, diese aber in einigen Fällen Unsinn liefern kann.

    Wären die Rückgabetypen beispielsweise char* und char, wäre das niemals übersetzt worden.

    Wären sie hingegen int und unsigned int, würdest du ganz schön meckern, wenn das nicht automatisch konvertiert würde.



  • Arcoth schrieb:

    Das sollte gar nicht compilieren.

    ^ Das. operator[] gibt einen QCharRef zurück.

    Auch ein const QChar.
    Eigentlich gibt er einen QString zurück. someQString ist eigentlich eine Instanz von einem eigenem CSV-Reader womit man mit [] auf eine bestimmte Column zugreifen kann.



  • Arcoth schrieb:

    @mgaeckler: Googlen hast du probiert, oder?

    Warum sollte ich die Arbeit von Quizfrage erledigen?

    Mfg Martin


  • Mod

    Quizfrage schrieb:

    someQString ist eigentlich eine Instanz von einem eigenem CSV-Reader womit man mit [] auf eine bestimmte Column zugreifen kann.

    lol
    Vielleicht hättest du einen besseren metasyntaktischen Variablennamen wählen können.



  • Vereinfacht ausgedrückt:

    QString qStr = boolExpr ? "" : someQString;
    


  • Quizfrage schrieb:

    Das sind so Stellen, wo die Mächtigkeit von C++ nicht mehr schön ist und wo man alle möglichen Regeln kennen muss. Das ist ein Code-Ausschnitt einer Software, die ich warten musste und dieser Fehler hat mich mehrere Stunden aufgehalten, da der Konvertierungsfehler an allen möglichen Stellen hätte auftauchen könnte, nicht nur in meinem Code, sondern auch im ODBC-Treiber oder in der Datenbank.
    Wenn die Komplexität der Software irgendwann so groß ist, dann ist es nicht mehr schön, wenn einem eine Sprache in dem Weg steht. - Gar nicht schön!!!

    Das Problem sticht aber sofort ins Auge, auch wenn man Qt nicht kennt. Dafür kann C++ nix.

    Mfg Martin



  • mgaeckler schrieb:

    Das Problem sticht aber sofort ins Auge, auch wenn man Qt nicht kennt. Dafür kann C++ nix.

    Nein, tut's nicht.
    1. Weil es wie erwähnt mehrere Fehlerquellen geben kann. Ein Qt-Treiber
    2. Nicht jeder diese Randnotiz im Standard kennt. Du hast vorhin auch gesagt, dass das kein Standard sei. --> Das ist aber Standard! Von meinen Arbeitskollegen (5 Leute die mehrere Jahre C++ Erfahrung haben) wusste das nur einer und genau dieser konnte den Fehler nach langem Suchen lokalisieren, weil er schon mal so einen Bug hatte.



  • Quizfrage schrieb:

    1. Weil es wie erwähnt mehrere Fehlerquellen geben kann. Ein Qt-Treiber

    "Ein Qt-Treiber hat z. B. einen Bug", soll das heißen.



  • Quizfrage schrieb:

    mgaeckler schrieb:

    Das Problem sticht aber sofort ins Auge, auch wenn man Qt nicht kennt. Dafür kann C++ nix.

    Nein, tut's nicht.
    1. Weil es wie erwähnt mehrere Fehlerquellen geben kann. Ein Qt-Treiber
    2. Nicht jeder diese Randnotiz im Standard kennt. Du hast vorhin auch gesagt, dass das kein Standard sei. --> Das ist aber Standard! Von meinen Arbeitskollegen (5 Leute die mehrere Jahre C++ Erfahrung haben) wusste das nur einer und genau dieser konnte den Fehler nach langem Suchen lokalisieren, weil er schon mal so einen Bug hatte.

    QString ist kein Standard. Ohne zu wissen, welche typen die Ausdrücke haben, ist das ganze nur ein Ratespiel.
    Trotzdem wusste ich, wo das Problem ist, typisches Anfängerproblem. Natürlich kann ich ohne Kenntnisse von QString keine detaillierte Begründung liefern. Schon garnicht wenn ich nicht weiß, was Mist in Deinen Augen ist.

    Mfg Martin



  • Ich bin mal wieder zu blöd 😕 :

    Quizfrage schrieb:

    QString qStr = someQString.count() <= someInt ? "" : someQString[someInt];
    

    Heißt das nicht:
    Wenn someQString someInt oder weniger Zeichen hat, gib mir das Zeichen an Stelle someInt zurück?
    Aber someInt ist doch in dem Fall ein Index hinter dem String?!


Log in to reply