C++ Quizfrage


  • 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?!


  • Mod

    Belli schrieb:

    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?!

    Das ist eben echter Code von echten Profiprogrammierern, die über diese Stelle stunden- und tagelang nachgedacht haben 🙂

    Quizfrage schrieb:

    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.


  • Mod

    Belli schrieb:

    Heißt das nicht:
    Wenn someQString someInt oder weniger Zeichen hat, gib mir das Zeichen an Stelle someInt zurück?

    Nein.


Anmelden zum Antworten