Zahlen in Strings=>Vergleich aber ohne atoi



  • .. .. ich glaube, du hast meinen Beitrag nicht ganz verstanden, das war nur eine Anmerkung zu strlen().



  • Muss ich auch nicht verstehen, wenn ich die gestellte Frage verstanden habe.
    Unnütze Querdiskussionen sind sinnlos! 😞 daddeldu!!!


  • Mod

    Na dann würde ich doch

    while (*num1 == '0') ++num1;
    while (*num2 == '0') ++num2;
    

    machen und dann direkt ein strcmp. Vorher noch die strlen zu vergleiche ist doch ineffizient.



  • Das fliegt auseinander, wenn der String nur Nullen beinhaltet. Ich schlage

    num1 += strspn(num1, "0");
    

    vor.


  • Mod

    seldon schrieb:

    Das fliegt auseinander, wenn der String nur Nullen beinhaltet.

    Ups 🙂 .

    Ich schlage

    num1 += strspn(num1, "0");
    

    vor.

    Hervorragend. Manche Funktionen in string.h benutze ich so selten, ihre Existenz ist mir gar nicht bewusst.



  • Danke nochmal für das rege Interesse.
    Ich habs nun so implementiert dass die Strings in einen String mit fixer Länge rechtsbündig reinkopiert werden, und die Stellen die links noch frei sind werden mit '0' befüllt.
    Danach strcmp und fertig.

    Mag sein dass es performanter geht, aber ich bin froh wenn es auf dieser mobilen Steinzeit-Plattform läuft und ich da ja nichts mehr nachbessern muss.


  • Mod

    C Fragender schrieb:

    Mag sein dass es performanter geht, aber ich bin froh wenn es auf dieser mobilen Steinzeit-Plattform läuft und ich da ja nichts mehr nachbessern muss.

    Zum nicht mehr Nachbessern müssen ist deine Lösung aber denkbar untauglich. Es geht zum Beispiel schon schief, wenn die Zahlen zu lang sind.



  • SeppJ schrieb:

    C Fragender schrieb:

    Mag sein dass es performanter geht, aber ich bin froh wenn es auf dieser mobilen Steinzeit-Plattform läuft und ich da ja nichts mehr nachbessern muss.

    Zum nicht mehr Nachbessern müssen ist deine Lösung aber denkbar untauglich. Es geht zum Beispiel schon schief, wenn die Zahlen zu lang sind.

    Nein, es ist eine maximale Länge von 18 definiert. Mehr kopier ich nicht rein in meinen String, zum Absturz kann es nicht kommen.
    Wenn wer glaubt er muss längere Strings als 18 über die Schnittstelle übertragen hat er halt Pech gehabt, aber soweits kommts erst gar nicht weil das bereits PC seitig abgefangen wird.
    Vertrau mir, das passt schon so 🙂



  • Es ist übrigens nicht mal die ganze string.h vorhanden, sondern nur eine abgespeckte Version mit den wichtigsten Funktionen wie strlen und strcmp.
    strspn oder strtok gibts zum Beispiel mal garnicht.


  • Mod

    Naja, das sagst du jetzt. In ein paar Monaten brauchst du soch mal Zahlen mit mehr Stellen und dann kracht's. Bei den anderen Varianten kann da nichts schiefgehen. Funktionen wie strspn sind trivial nach zu programmieren. Im Prinzip hast du es schon, wenn du meinen Vorschlag um die fehlende '\0'-Prüfung erweiterst.



  • SeppJ schrieb:

    seldon schrieb:

    Das fliegt auseinander, wenn der String nur Nullen beinhaltet.

    Ups 🙂 .

    Ich schlage

    num1 += strspn(num1, "0");
    

    vor.

    Hervorragend. Manche Funktionen in string.h benutze ich so selten, ihre Existenz ist mir gar nicht bewusst.

    Seid ihr beiden euch tatsächlich sicher , dass jede Bibliotheksfunktion , schneller ist als ne kleine while-Schlaufe :D. Und die meisten Menschen (wie ich) werden beim lesen wahrscheinlich erstmal nachschlagen müssen was strspn() genau macht.
    Herzliche Grüße
    nt0r
    PS:Wenn ihr einen Beweis dafür habt , dass strspn performanter ist , könnte ich den bitte erfahren ?



  • nt0r schrieb:

    PS:Wenn ihr einen Beweis dafür habt , dass strspn performanter ist , könnte ich den bitte erfahren ?

    Wer hat gesagt, dass es performanter sei? Es ist nur weniger Code und besser zu lesen. Wenn du nicht weißt was Standardfunktionen machen, musst du halt nachgucken.



  • Hmm. Naja es ist Ansichtsache , ob man für sowas eine Funktion aufruft. Ich bin zum Beispiel auch kein wahrer Fan der iostream Bib. Bei der Menge an Speicher die , die frisst 😉
    Aber das gehört aber eigentlich nicht zum Thema.


  • Mod

    Ich sag's mal so: Es gibt Ansichten und es gibt weniger nützliche Ansichten.



  • Ich würde ja einen Benchmark dafür zusammenstricken, aber ich weiß nicht, um welche mobile Steinzeitplattform es sich handelt, und anscheinend ist strspn da eh nicht vorhanden.

    Generell aber sage ich Folgendes: String-Funktionen aus der Standardbibliothek sind ab einer gewissen Stringlänge in aller Regel schneller als handgestrickte Schleifen. Das liegt daran, dass sie auf die betreffende Plattform handoptimiert sind (SSE ist da sehr beliebt) und teilweise Tricks benutzen, auf die man nicht so leicht kommt oder die einem in Standard-C nicht zur Verfügung stehen (oder beides). GNUs strlen beispielsweise benutzt eine Heuristik, die ausnutzt, dass Zeichen in Strings, die strlen übergeben werden, meistens < 128 sind in Verbindung mit speziellem Wissen über das Speichermodell des Betriebssystems, um jeweils 4 bzw. 8 Byte auf einmal zu erschlagen. memcpy verarbeitet, wo möglich, ganze Speicherseiten auf einmal.

    Meine Herangehensweise ist dementsprechend, mit Standard-Funktionen anzufangen und erst, wenn mir der Profiler sagt, dass ich da ein Problem habe, mit Handoptimierungen anzufangen. Diese laufen dann aber auch nicht auf einfache while-Schleifen hinaus.


Anmelden zum Antworten