c++ abkürzung - MFC-Ressourcen / Links




tutorial visual (7)

Ich bin im Begriff, die MFC-Welt nach Jahren für einen neuen Job wieder zu betreten. Welche Ressourcen empfehlen die Leute, um den Speicher zu aktualisieren? Ich habe in letzter Zeit hauptsächlich C # gemacht.

Auch irgendwelche MFC centric Websites oder Blogs, die Leute empfehlen?


Answers

Das lebenswichtige "Wie kann ich?" Buch ist http://www.amazon.com/gp/reader/0201185377/ref=sib_dp_pt#reader-link

Codeproject ist ebenfalls von unschätzbarem Wert, obwohl viele der Steuerelemente von Drittanbietern jetzt Gegenstücke in dem neuen MFC-Feature-Pack enthalten.




Es ist eine lange Zeit seit ich MFC gemacht habe, aber damals war es einmal

"MFC internals" + debuggen in den MFC-Code und finden heraus, was passiert, was die besten Ressourcen auf MFC waren

Früher waren die Samples in Code Project verfügbar, um Sie schnell zum Laufen zu bringen.




Führt std::stoi einen Fehler am Eingang "abcxyz" ?

Ja.

Ich denke, Ihre Verwirrung kann von der Tatsache strtol , dass strtol nie einen Fehler meldet , außer beim Überlauf. Es kann gemeldet werden, dass keine Konvertierung durchgeführt wurde, aber dies wird im C-Standard niemals als Fehlerbedingung bezeichnet.

strtol ist in ähnlicher Weise durch alle drei C-Standards definiert, und ich erspare Ihnen die langweiligen Details, aber es definiert im Grunde eine "Subjekt-Sequenz", die eine Teilzeichenfolge der Eingabezeichenfolge ist, die der tatsächlichen Zahl entspricht. Die folgenden vier Bedingungen sind gleichwertig:

  • die Subjektsequenz hat die erwartete Form (in einfachem Englisch: es ist eine Zahl)
  • Die Betreffsequenz ist nicht leer
  • Eine Konvertierung ist aufgetreten
  • *endptr != nptr (das ist nur sinnvoll, wenn endptr nicht null ist)

Wenn es einen Überlauf gibt, wird immer noch gesagt, dass die Konvertierung stattgefunden hat.

Nun ist es ziemlich klar, dass, weil "abcxyz" keine Zahl enthält, die Subjektsequenz der Zeichenkette "abcxyz" leer sein muss, so dass keine Konvertierung durchgeführt werden kann. Das folgende Programm C90 / C99 / C11 wird es experimentell bestätigen:

#include <stdio.h>
#include <stdlib.h>

int main() {
    char *nptr = "abcxyz", *endptr[1];
    strtol(nptr, endptr, 0);
    if (*endptr == nptr)
        printf("No conversion could be performed.\n");
    return 0;
}

Dies bedeutet, dass jede konforme Implementierung von std::stoi invalid_argument std::stoi muss , wenn sie die Eingabe "abcxyz" ohne ein optionales invalid_argument erhält.

Bedeutet dies, dass std::stoi eine zufriedenstellende Fehlerüberprüfung hat?

Nein. Die Person, mit der Sie gesprochen haben, ist korrekt, wenn sie sagt, dass std::stoi nachsichtiger ist als die vollständige Überprüfung. errno == 0 && end != start && *end=='\0' nach std::strtol , Weil std::stoi alle Zeichen, die mit dem ersten nicht-numerischen Zeichen in der Zeichenfolge beginnen, stillschweigend entfernt.

Tatsächlich ist in meinem Kopf die einzige Sprache, deren native Konvertierung etwas wie std::stoi ist, Javascript, und selbst dann musst du die Basis 10 mit parseInt(n, 10) erzwingen, um den Spezialfall der hexadezimalen Zahlen zu vermeiden:

input      |  std::atoi       std::stoi      Javascript      full check 
===========+=============================================================
hello      |  0               error          error(NaN)      error      
0xygen     |  0               0              error(NaN)      error      
0x42       |  0               0              66              error      
42x0       |  42              42             42              error      
42         |  42              42             42              42         
-----------+-------------------------------------------------------------
languages  |  Perl, Ruby,     Javascript     Javascript      C#, Java,  
           |  PHP, C...       (base 10)                      Python...  

Hinweis: Es gibt auch Unterschiede zwischen den Sprachen bei der Verarbeitung von Leerzeichen und redundanten + -Zeichen.

Ok, also ich möchte volle Fehlerprüfung, was soll ich verwenden?

Ich kenne keine eingebaute Funktion, die dies tut, aber boost::lexical_cast<int> wird tun, was Sie wollen. Es ist besonders streng, da es im Gegensatz zu Pythons int() Funktion sogar umgebende Leerzeichen zurückweist. Beachten Sie, dass ungültige Zeichen und Überläufe zu derselben Ausnahme, boost::bad_lexical_cast .

#include <boost/lexical_cast.hpp>

int main() {
    std::string s = "42";
    try {
        int n = boost::lexical_cast<int>(s);
        std::cout << "n = " << n << std::endl;
    } catch (boost::bad_lexical_cast) {
        std::cout << "conversion failed" << std::endl;
    }
}




c++ c mfc