Pointer..



  • Deine Ausgabe ist fehlerhaft:

    for(int k = 0; i<nwords; k++){
    	for(int l = 0; i<MAXWORD; l++){
    		printf("%s\n", dict[k][l]);
    	}
    }
    

    Du gibst einzelne Zeichen als String aus (denn dictist wohl als char-Array deklariert und nicht als char*-Array, denn sonst würde der Code darüber [strcmp, strcpy] keinen Sinn machen).
    Ändere es also zu

    for(int k = 0; i<nwords; k++){
    	printf("%s\n", dict[k]);
    }
    


  • @Th69 sagte in Pointer..:

    Deine Ausgabe ist fehlerhaft:

    Vielen Dank. Das ist nur ein Versuch gewesen die Datenbank auszulesen, ob die Werte richtig verwendet werden.

    Ich habe vergessen das auszukommentieren. Vielen Dank für die Korrektur.

    Dennoch löst es das Problem leider nicht.



  • @werdas_34
    Hi ich gehe immer noch davon aus, dass dein strcpy dein Problem ist.
    Ich denke an dieser Stelle wird dein Speicher korrumpiert.

    Warum ich danke, habe da so ein Gefühl!



  • @pmqtt sagte in Pointer..:

    Warum ich danke, habe da so ein Gefühl!

    bitte.



  • Gern geschehen danke denke alles das gleiche



  • @pmqtt sagte in Pointer..:

    Hi ich gehe immer noch davon aus, dass dein strcpy dein Problem ist.
    Ich denke an dieser Stelle wird dein Speicher korrumpiert.

    Ich wollte wissen ob der Fehler danach kommt, oder vor dem strcpy. Also printf vor und nach der Funktion reingesetzt.
    Gemerkt er gibt beides aus. Dann wieder die offensichtlich unsinnigen Pointer beim Rückgabewert hinzugefügt und es funktioniert. Ich verstehe zwar nicht ganz was ich jetzt groß anders hatte am Anfang. Aber ok.

    Hier mal die funktionierende Funktion(Aufruf usw ist alles gleich geblieben):

    int *
    insertw_1_svc(char **argp, struct svc_req *rqstp)
    {
    	static int  result;
    	printf("%s\n", *argp);
    
    	int i;
    	for (i=0; i<nwords; i++)
    		if (strcmp (*argp, dict[i]) == 0)
    			return 0;
    	printf("Test 1\n");
    	strcpy(dict[nwords], *argp);
    	printf("Test 2\n");
    	printf("%s\n", dict[nwords]);
    	nwords++;
    	result = nwords;
    	
    	return &result;
    }
    
    


  • @Wutz sagte in Pointer..:

    Da du den Aufrufkontext verheimlichst, kann dir keiner helfen - was soll die Funktion überhaupt machen?



  • @werdas_34 sagte in Pointer..:

    Und wieder merke ich das ich Pointer noch nicht ganz verinnerlicht habe.

    Ich verstehe zwar nicht ganz was ich jetzt groß anders hatte am Anfang. Aber ok.

    Und was hat das Gefrickel dir nun gebracht? Nichts.
    Du hast immer noch keine Ahnung von Pointern und weißt nicht, warum dein Programm abstürzt.
    Da bist du auch nicht besser als die Leute, die nach Lektüre der Pfuscher-JW Online-Sinnfreiartikeln hier aufschlagen und behaupten, sie hätten Pointer verstanden und nur noch eine kleine Frage hätten.



  • Allen frohe Ostern und bleibt gesund.

    @werdas_34 sagte in Pointer..:

    Hier mal die funktionierende Funktion(Aufruf usw ist alles gleich geblieben):

    int *
    insertw_1_svc(char **argp, struct svc_req *rqstp)
    {
    	static int  result;
    	printf("%s\n", *argp);
    
    	int i;
    	for (i=0; i<nwords; i++)
    		if (strcmp (*argp, dict[i]) == 0)
    			return 0;
    	printf("Test 1\n");
    	strcpy(dict[nwords], *argp);
    	printf("Test 2\n");
    	printf("%s\n", dict[nwords]);
    	nwords++;
    	result = nwords;
    	
    	return &result;
    }
    

    Ein paar Fragen an Dich, da dieser Code so nicht kompiliert.

    • Was sind nwords und dict? Es müssen globale Variable sein. Weshalb sind sie global definiert?
    • Der Klassiker in C, weshalb wird int als Typ für eine Zählvariable gewählt für etwas, was dynamisch alloziert wurde? ints können insbesondere auf 64Bit Plattformen nicht den kompletten Wertebereich von dynamisch allozierten Feldern abdecken. Es gibt dafür size_tund ssize_t.
    • Was für einen Grund hat es den Rückgabewert als lokale statische Variable zu deklarieren und dann per Zeiger zurückzugeben?
    • Weshalb wird argp als ** übergeben? Was für einen Zweck erfüllt das?


  • @werdas_34
    Füge mal bitte folgendes ein:

    int *
    insertw_1_svc(char **argp, struct svc_req *rqstp)
    {
    	static int  result;
    	printf("%s\n", *argp);
    
    	int i;
    	for (i=0; i<nwords; i++)
    		if (strcmp (*argp, dict[i]) == 0)
    			return 0;
    	printf("Length of argp:%d \n",strlen(*argp));
            printf("Space in dict on position nwords:%d",sizeof(dict[nwords]));
    	strcpy(dict[nwords], *argp);
    	printf("Test 2\n");
    	printf("%s\n", dict[nwords]);
    	nwords++;
    	result = nwords;
    	
    	return &result;
    }
    

    und verrate uns mal bitte die zwei Zahlen die herraus kommen


Anmelden zum Antworten