Archiv für Funktions-Definitionen



  • @ SeppJ:
    http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/string/Lint_strcpy.c

    Wenn ich da auf download klicke kommt nicht wie gewünscht der Quellcode, hm..

    @Supertux:
    http://www.cplusplus.com/reference/clibrary/cstring/strcpy/

    Wo finde ich hier den quellcode?


  • Mod

    jizzer schrieb:

    @ SeppJ:
    http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/string/Lint_strcpy.c

    Wenn ich da auf download klicke kommt nicht wie gewünscht der Quellcode, hm..

    Bei mir schon:

    /* $NetBSD: Lint_strcpy.c,v 1.1.10.1 2000/06/23 16:59:16 minoura Exp $ */
    
    /*
     * This file placed in the public domain.
     * Chris Demetriou, November 5, 1997.
     */
    
    #include <string.h>
    
    /*ARGSUSED*/
    char *
    strcpy(dst, src)
    	char *dst;
    	const char *src;
    {
    	return (0);
    }
    

    Muss ein Problem auf deiner Seite sein. Alternativ kannst du ja auch CVS benutzen um das Archiv anzugucken.

    edit: Und wenn du dich jetzt wunderst über diesen komischen Code für stcmp, lies nochmal die Anmerkungen weiter unten:

    lint stubs for functions which ports use assembly versions. When using
    an assembly version of a function, add the right lint stub to the Makefile.inc
    which specifies the source to build the function (see the
    arch/i386/*/Makefile.inc). Can't just lint the normal C versions of these
    functions, because some of them don't _have_ normal C versions and if
    that were done dependencies would get messed up.

    edit2: Hier ist die (vermutlich richtige, ich bin nicht so gut in Assembler) Funktion für i386:

    /*
     * Written by J.T. Conklin <jtc@NetBSD.org>.
     * Public domain.
     */
    
    #include <machine/asm.h>
    
    #if defined(LIBC_SCCS)
    	RCSID("$NetBSD: bcmp.S,v 1.8.22.1 2008/01/09 01:33:56 matt Exp $")
    #endif
    
    ENTRY(bcmp)
    	pushl	%edi
    	pushl	%esi
    	movl	12(%esp),%edi
    	movl	16(%esp),%esi
    	xorl	%eax,%eax		/* clear return value */
    
    	movl	20(%esp),%ecx		/* compare by words */
    	shrl	$2,%ecx
    	repe
    	cmpsl
    	jne	L1
    
    	movl	20(%esp),%ecx		/* compare remainder by bytes */
    	andl	$3,%ecx
    	repe
    	cmpsb
    	je	L2
    
    L1:	incl	%eax
    L2:	popl	%esi
    	popl	%edi
    	ret
    


  • Äh, ich glaube da liegt ein Missverständnis vor.

    Das:

    #include <string.h>
    
    /*ARGSUSED*/
    char *
    strcpy(dst, src)
        char *dst;
        const char *src;
    {
        return (0);
    }
    

    finde ich in jeder Referenz, so wie supertux erwähnte.

    Ich suche aber den Quellcode, die Definition der Funktion

    char* strcpy(char *dst, const char* src)
    {
       int i=0;
    
    for(;i<=strlen(src);i++)dst[i] = src[i];
    return(dst);
    }
    

  • Mod

    Ich habe oben noch ein paar Erläuterungen reineditiert, welche das aufklären dürften. wie gesagt: Stell dich auf reichlich Assembler ein. Viele funktionen sind handoptimiert, weil bei der Standardbibliothek Geschwindigkeit tatsächlich wichtig ist.





  • Ich finds nicht in reinem C code..



  • Andersrum:

    Könnt ihr mir sagen, warum folgender Code nicht funktioniert?
    edit:

    #include <stdio.h>
    
    void strcpy_new(char* t, const char* s)
    
    void main(void)
    {
    	char text[] = "Hallo Welt", string[] = "ollaH";
    	strcpy_new(text, string);
    	puts(text);
    	system("pause");
    }
    
    /*strcpy_new*/
    void strcpy_new(char* t, const char* s)
    {	
    	int i = 0;
    	for (; s[i] != '\0'; i++)
    	t[i] = s[i];
    }
    

  • Mod

    Danke, dass du uns auf eine wilde Websuche schickst, anstatt einfach gleich die richtige Frage zu stellen 😡 .

    Was ist das Problem? Es wird Hallo durch ollaH ersetzt. Soll zusätzlich noch abgeschnitten werden? Dann setz eine Nullterminierung!



  • SeppJ schrieb:

    Danke, dass du uns auf eine wilde Websuche schickst, anstatt einfach gleich die richtige Frage zu stellen 😡 .

    Was ist das Problem? Es wird Hallo durch ollaH ersetzt. Soll zusätzlich noch abgeschnitten werden? Dann setz eine Nullterminierung!

    Entschuldige bitte, aber meine anfängliche Frage ist damit nicht hinfällig.
    Im Sinne einer spezifischen Lösung habe ich dann halt mein momentanes Problem gepostet; hinsichtlich noch kommender Fragen wäre eben jenes Archiv sehr sinnvoll, aus meiner Sicht.

    Da für die die Funktion banal erscheint, funktioniert sie so, wie sie eine Seite vorher steht bei dir? Ja?
    Bei mir kommen nämlich Fehlermeldungen und ich weiss nich was ich ändern soll..

    Danke für dein Verständnis.

    PS:

    1>------ Build started: Project: Test, Configuration: Debug Win32 ------
    1>Compiling...
    1>Testsource.c
    1>d:\daten\z002nweb\inout\inout\testsource.c(7) : error C2085: 'main' : not in formal parameter list
    1>d:\daten\z002nweb\inout\inout\testsource.c(7) : error C2143: syntax error : missing ';' before '{'
    1>d:\daten\z002nweb\inout\inout\testsource.c(11) : warning C4013: 'system' undefined; assuming extern returning int
    1>d:\daten\z002nweb\inout\inout\testsource.c(16) : error C2084: function 'void strcpy_new(char *,const char *)' already has a body
    1>        d:\daten\z002nweb\inout\inout\testsource.c(3) : see previous definition of 'strcpy_new'
    1>Build log was saved at "file://d:\Daten\z002nweb\inout\inout\Debug\BuildLog.htm"
    1>Test - 3 error(s), 1 warning(s)
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
    

  • Mod

    Ach so, die vielen Syntax- und Sprachfehler habe ich weggemacht, da ich annahm, dass du die Funktion per Hand abgeschrieben hast und einen sehr toleranten Compiler benutzt.

    Die Fehler sind:
    Zeile 3, Semikolon fehlt
    Zeile 6, Rückgabetyp von main ist int.
    Zeile 11, benötigt stdlib.h

    Es wäre sehr nützlich, wenn du in Zukunft genaue Fragen stellst, denn "funktioniert nicht" hilft nicht weiter.



  • Außerdem wird der entstandene String nicht terminiert.
    Vor Funktionsende noch ein

    t[i] = 0;
    

    sollte das nachholen.



  • Danke

    SeppJ schrieb:

    Es wäre sehr nützlich, wenn du in Zukunft genaue Fragen stellst, denn "funktioniert nicht" hilft nicht weiter.

    Woher soll ich vorher wissen wo der Fehler liegt, wenn das genau meine Frage wäre?



  • Gast0815 schrieb:

    Außerdem wird der entstandene String nicht terminiert.
    Vor Funktionsende noch ein

    t[i] = 0;
    

    sollte das nachholen.

    Hm, warum aufeinmal nicht mehr '\0'?

    edit: Ok, habs grad getestet, geht beides 🙂



  • '\0' als Escape-Sequenz entspricht dem ASCII-Wert 0.
    Genauso wie 'A' intern als Char-Wert 65 gespeichert wird.

    ('\0' == 0)
    

  • Mod

    jizzer schrieb:

    Danke

    SeppJ schrieb:

    Es wäre sehr nützlich, wenn du in Zukunft genaue Fragen stellst, denn "funktioniert nicht" hilft nicht weiter.

    Woher soll ich vorher wissen wo der Fehler liegt, wenn das genau meine Frage wäre?

    Du sollst Fragen:
    Folgender Code produziert bei mir Fehler xyz.

    Nicht:
    Folgender Code funktioniert nicht.



  • jizzer schrieb:

    Ich finds nicht in reinem C code..

    Ich bitte dich, gleich der zweite Eintrag führt zu C-Code aus OpenBSD 😮 😕


Anmelden zum Antworten