[Hobby/Unerfahren] Suche Interessent für Bibliothek-Development
-
- Stellenangebot
-
-@Deleted -
21. September 2018 um 17:30
-
-
-
Auf welchem Niveau darf das ganze denn sein? Reicht schon folgendes?
C
Alles anzeigen#include <stdio.h> size_t strlenTest(const char *input) { size_t len = 0; while (input[len] != '\0') { len++; } return len; } int main(void) { char *testString = "Test123"; printf("%ld", strlenTest(testString)); getchar(); return 0; }
PS:
Externer Inhalt www.youtube.comInhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt. -
Auf welchem Niveau darf das ganze denn sein? Reicht schon folgendes?
C
Alles anzeigen#include <stdio.h> size_t strlenTest(const char *input) { size_t len = 0; while (input[len] != '\0') { len++; } return len; } int main(void) { char *testString = "Test123"; printf("%ld", strlenTest(testString)); getchar(); return 0; }
PS:
Externer Inhalt www.youtube.comInhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.Anfänger Niveau reicht! Das meiste kann man dann von mir erlernen falls die Erfahrung/das Wissen zu Tasks fehlen
Zum Code:
Erfüllt zwar sein Zweck, aber nicht zu vergessen dass beim Kernel Development die Compiler Code Optimierung ausschließlich fast deaktiviert ist oder auf Opt. Stufe #1.
Das bedeutet dass der Code den du hier oben geschrieben hast fast 1:1 übernommen wird, der ist aber recht langsam.
Auf richtigem Niveau würde man via words/longwords den string abgleichen/zählen. Da das aber kompliziert ist und ich ungern C&P verwende (Siehe GNU GCC strlen),
würde folgendes ausreichen:
C
Alles anzeigen/*- * BSD 3-Clause License * * Copyright (c) 2018, Reallocated * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. Neither the name of the copyright holder nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <sys/types.h> #include <string/strlen.h> size_t strlen(const char *str) { register const char *s; for(s = str; *s; ++s); return (s - str); }
Das ist ein originaler Ausschnitt meiner strlen(...) Funktion im Kernel (So haben die meisten die Funktion implementiert). Kurz erklärt; Wir übergeben die Variable str
an Variable s, welche mit dem Keyword "register" deklariert ist - So, falls möglich, ist der String nicht mehr im RAM sondern in einem CPU-Register. Die CPU-Register sind viel schneller als der Direktzugriffsspeicher (RAM), somit können Datenverarbeitungsoperationen schneller verarbeitet werden. Die terminating zero ('\0'/0) gibt immer 0/false zurück, deswegen reicht es im for-loop an zweiter Stelle einfach *s anzugeben da all die anderen Zeichen true zurückgeben, bzw. eine Zahl größer als 0. Falls größer als 0, inkrementieren wir um eine Position @variable s, prüfen den Wert der Position und nachdem auf 0 getroffen wurde return'en wir die Differenz der beiden subtrahierten Variablen. Schon haben wir die string-länge der Variable str
-
Anfänger Niveau reicht! Das meiste kann man dann von mir erlernen falls die Erfahrung/das Wissen zu Tasks fehlen
Zum Code:
Erfüllt zwar sein Zweck, aber nicht zu vergessen dass beim Kernel Development die Compiler Code Optimierung ausschließlich fast deaktiviert ist oder auf Opt. Stufe #1.
Das bedeutet dass der Code den du hier oben geschrieben hast fast 1:1 übernommen wird, der ist aber recht langsam.
Auf richtigem Niveau würde man via words/longwords den string abgleichen/zählen. Da das aber kompliziert ist und ich ungern C&P verwende (Siehe GNU GCC strlen),
würde folgendes ausreichen:
C
Alles anzeigen/*- * BSD 3-Clause License * * Copyright (c) 2018, Reallocated * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. Neither the name of the copyright holder nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <sys/types.h> #include <string/strlen.h> size_t strlen(const char *str) { register const char *s; for(s = str; *s; ++s); return (s - str); }
Das ist ein originaler Ausschnitt meiner strlen(...) Funktion im Kernel (So haben die meisten die Funktion implementiert). Kurz erklärt; Wir übergeben die Variable str
an Variable s, welche mit dem Keyword "register" deklariert ist - So, falls möglich, ist der String nicht mehr im RAM sondern in einem CPU-Register. Die CPU-Register sind viel schneller als der Direktzugriffsspeicher (RAM), somit können Datenverarbeitungsoperationen schneller verarbeitet werden. Die terminating zero ('\0'/0) gibt immer 0/false zurück, deswegen reicht es im for-loop an zweiter Stelle einfach *s anzugeben da all die anderen Zeichen true zurückgeben, bzw. eine Zahl größer als 0. Falls größer als 0, inkrementieren wir um eine Position @variable s, prüfen den Wert der Position und nachdem auf 0 getroffen wurde return'en wir die Differenz der beiden subtrahierten Variablen. Schon haben wir die string-länge der Variable str
sikerim hab interesse kik
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!