"Lambda" Expression C++



  • Happy new year 🙂

    Zum neuen Jahr bin auf eine neue Fragestellung gestoßen!

    Struct isch so:
    struct Circle
    {
    double dX;
    double dY;
    double dRadius;
    };

    Soll eben n Circle darstellen und mit std::vector initialisiert.
    Und mein Bugs-life Code..... :

    void TestContainerLambda(void)
    {
    std::vector<Circle> vC1 = { { 0, 0, 0 }, { 10, 10, 10 }, { -10, -10, -10 }, { 0, 10, 20 } };
    auto it = std::find_if(vC1.begin(), vC1.end(), [](const auto& rc){ return rc.dRadius() > 10; });
    }

    Da möchte ich sehr gerne den Lambdaausdruck in auto iterator so packen dass der dRadius größer wie 10 gefunden wird.

    Ich versteh nicht warum......... der Complier meckert dass die Rück-übergabeparametern nicht stimmt TestContainerLambda soll ja nur so n RUmpf der Funktion sein wo man Codes übersichtlicher packt. In der Zeile auto it = std::finf_if(........................) gibt es zwar ein return! Aber der ist in der stl gepackt und gleichzeitig, im Lambdaausdruck. Dass Lambdaausdruck den Übergabeparameter hat in diesem Code, bin ich mir bewusst, jedoch hat es nicht mit TestCointainer Funktion zu tun? Das möchte ich ganz klar void halten.

    Was sagt Euer Ehren ? 🙂



  • Moin,

    das hat nichts mit lambda zu tun.
    Schau dir mal genau an wie deine Datenstruktur aufgebaut ist und wie der code versucht auf ein Datenelement zu zugreifen.
    Und die Fehlermeldung des compilers sollte hier auch eine hilfreiche Meldung liefern.
    Bitte keine Interpretation der Fehlermeldung liefern sondern den genauen wortlaut 😉



  • @AmigaC sagte in "Lambda" Expression C++:

    auto it = std::find_if(vC1.begin(), vC1.end(), [](const auto& rc){ return rc.dRadius() > 10; });
    }

    Schau dir doch mal die return Anweisung genau an. Da steht ein rc.dRadius() > 10.

    Da sollte aber rc.dRadius > 10 stehen.

    Vergleiche das aber unbedingt mit der Fehlermeldung des Compiliers.



  • Hey @Quiche-Lorraine , das war der Bug..............! Fehlermeldung sagte zwar: Ein bedingter Ausdruck vom Typ "void" ist ungültig, aber das ist weil ich eben diesen Klammer-Bug hatte....erfolgreich entfernt 🙂

    Danke für deinen Beitrag echt schon am 01.01, dir au @firefly. Nice work!🎇 🎆



  • @AmigaC Dann solltest du eventuell mal den compiler aktualisieren wenn das möglich ist.
    z.b. gcc 10.4.0/11.3.0 liefert folgende Fehlermeldung:

    error: expression cannot be used as a function
       18 | auto it = std::find_if(vC1.begin(), vC1.end(), [](const auto& rc){ return rc.dRadius() > 10; });
          |                                                                           ~~~~~~~~~~^~
    

    Oder clang 14.0.6/15.0.5 :

    error: called object type 'double' is not a function or function pointer
    auto it = std::find_if(vC1.begin(), vC1.end(), [](const auto& rc){ return rc.dRadius() > 10; });
                                                                              ^~~~~~~~~~
    

    Selbst MSVC 2015/2017 liefert eine passendere Meldung

    error C2064: term does not evaluate to a function taking 0 arguments
    


  • @firefly I see, auf jeden Fall... ist der Projekt mit MSVC v143 compliliert, auf jeden Fall hab ich letztens VS auf die neueste Version 17.4.3 aktualisiert............ Müsste ich wahrscheinlich zusätzliche MSVC Package wenn sowas gibt instalieren? Oder clang verwenden........? Ich mag wechsel der Compilertyp net so auch nicht Umgebungen.... One way mainly 😃 Aber für diese Zwecke ist ja vielleicht hilfreich, das war nämlich nicht das erste Mal wo mein Compliler danebenliegende Fehlermeldungen lieferten



  • Das Toolset v143 ist aber von VS 2022, also das neueste, s.a. Binärkompatibilität von C++ zwischen Visual Studio-Versionen:

    (Die Toolsetversion ist v140 für Visual Studio 2015, v141 für 2017, v142 für 2019 und v143 für 2022)

    Verwendest du denn direkt ein VS 2022-Projekt oder wie kompilierst du?



  • Dieser Beitrag wurde gelöscht!


  • Hi @Th69 Genau ich verwende direkt in VS 2022 Projekt dies,

    dann bin ich zumindest happy dass mein VS noch up2date isch...😅



  • Dann sollte es die gleiche Meldung liefern wie die älteren versionen...
    Also bitte liefer mal die komplette Fehlermeldung (copy und paste) ohne eigene Interpretation.

    Zugegeben die Fehlermeldungen von C++ Compilern können verwirrend sein, besonders wenn templates mit im spiel sind (was hier der fall ist für std::find_if).



  • @firefly danke

    Fehler C2064 Ausdruck ergibt keine Funktion, die 0 Argumente übernimmt

    Fehler C2451 Ein bedingter Ausdruck vom Typ "void" ist ungültig.

    Ich sage hier vorab dass ich Warninglevel auf 4 gestellt habe und alle Warnungen wie errors behandeln ^^;;



  • @AmigaC sagte in "Lambda" Expression C++:

    @firefly danke

    Fehler C2064 Ausdruck ergibt keine Funktion, die 0 Argumente übernimmt

    Fehler (aktiv) E0109 Der Ausdruck vor den Klammern des sichtbaren Aufrufs muss einen Funktionstyp (pointer-to-) aufweisen

    Ich sage hier vorab dass ich Warninglevel auf 4 gestellt habe und alle Warnungen wie errors behandeln ^^;;

    Da hat sich die Fehlermeldung sogar verbessert gegenüber den älteren versionen.
    Da steht dass der Ausdruck (in deinem falle rc.dRadius) kein Funktionstyp ist.
    Der Compiler hat dir also alle Informationen geliefert um den Fehler zu finden.

    Und eine internetsuche nach dem Fehlercode (C2064) hätte es sehr deutlich gemacht:
    Stichwörter: Microsoft Visual Studio C2064
    https://learn.microsoft.com/en-us/cpp/error-messages/compiler-errors-1/compiler-error-C2064?view=msvc-170



  • @firefly Hey entschuldige mich und bitte um Gnade 😃 Ich habe aus versehen falsche Fehler erzeugt da ich mit Code heute morgen weitergearbeitet habe. Ich habe in vorheriger Antwort eben die richtige Fehlermeldungen gerade korrigiert eingefügt. Sorry.
    Also jetzt sind sie wie vorher.



  • @firefly Sorry.............und danke echt. Das mir verbesserte Fehlermeldung kam weil ich aus versehen falsche zeile zum error drängte......!



  • @AmigaC sagte in "Lambda" Expression C++:

    @firefly Sorry.............und danke echt. Das mir verbesserte Fehlermeldung kam weil ich aus versehen falsche zeile zum error drängte......!

    Ändert nichts an meiner Aussage 😉 denn Der Fehlercode (C2064) ist der gleiche.
    Daher solltest du lernen die Fehlermeldungen des compilers zu verstehen bzw. damit umzugehen.
    Meist reicht eine suche im internet aus, um eine Beschreibung zu finden, bzw. eine beantwortete Frage von jemand anderes bezüglich der gleichen Fehlermeldung.

    Falls die Suche kein Ergebnis liefert oder du die gefundenen Antworten nicht verstehst, dann kannst du gerne hier nachfragen.
    Und vergiss dabei nicht die komplette Fehlermeldung des compilers anzugeben.



  • @firefly Danke dir, ha der C2064 bleibt klar..... ich tu mal dann in der Zukunft in https://learn.microsoft.com zu schauen, bis auf Linkerfehler scheint die Seite gut die Bugs identifizieren....!

    Tausend Danke


Anmelden zum Antworten