Rückgabewert



  • Zumindest für den ersten Teil, warum du bei m nicht alle Strings angezeigt bekommst, ist die Lösung ganz einfach.
    Sieh dir den case 'm' an!

    result_7 = selectw_1((void*)&selectw_1_arg, clnt);
    (...)
    printf("Content of database: %s\n", *result_7);
    

    selectw_1 liefert dir einen char** - du gibst aber immer nur das erste Element davon aus - unabhängig davon, wie viele es überhaupt gibt (auch wenn es 0 (keine) Elemente gibt, gibst du das erste von keinen trotzdem aus)



  • @Wutz sagte in Rückgabewert:

    @john-0
    Und?

    Wenn Du an werdas_34 Kritik üben willst, dann wäre es angebracht sich darüber zu beklagen, dass die Sourcen (üblicherweise mit .x Dateiendung versehen) für rpcgen nicht dabei sind. Denn wer will sich schon Code aus dem Codegenerator anschauen, wenn er den Source dafür sehen kann? Oder man kann sich darüber beklagen, dass er kein minimales übersetzbares Beispiel angeführt hat. Das wäre sogar noch viel sinnvoller.



  • @wob sagte in Rückgabewert:

    selectw_1 liefert dir einen char** - du gibst aber immer nur das erste Element davon aus - unabhängig davon, wie viele es überhaupt gibt (auch wenn es 0 (keine) Elemente gibt, gibst du das erste von keinen trotzdem aus)

    Iche merke grad, ich habe zuvor vergessen zu schreiben, dass die Lösung ein Array zurückliefert. Aber eigentlich sollte ein zusammenhängender String zurückgeliefert werden:
    Bsp:
    Inhalt in der DB: eins, zwei, drei
    Funktion soll Zeiger auf STring zurückliefern, der so aussieht "eins zwei drei".

    @john-0 sagte in Rückgabewert:

    Wenn Du an werdas_34 Kritik üben willst, dann wäre es angebracht sich darüber zu beklagen, dass die Sourcen (üblicherweise mit .x Dateiendung versehen) für rpcgen nicht dabei sind. Denn wer will sich schon Code aus dem Codegenerator anschauen, wenn er den Source dafür sehen kann?
    Im ersten Beitrag verlinke ich auf einen anderen Beitrag, in dem findest du ich glaube im vierten oder fünften Post die rdbase.x Datei.

    @john-0 sagte in Rückgabewert:

    Oder man kann sich darüber beklagen, dass er kein minimales übersetzbares Beispiel angeführt hat. Das wäre sogar noch viel sinnvoller.

    Nur noch Client und Server in minimal da der Rest eh nicht verändert werden darf.
    Client; (minimal so das die Test eingabe von oben dennoch funktioniert.

    #include <stdio.h>
    
    #include "rdbase.h"
    
    #define MAXLINE 80
    
    int nextin (char*, char*, char*);
    
    void
    rdbaseprog_1(char *host, char cmd, char *word1, char *word2)
    {
    	CLIENT *clnt;
    	int  *result_1;
    	char *initw_1_arg;
    	int  *result_2;
    	char * insertw_1_arg;
    	char * *result_7;
    	char *selectw_1_arg;
    	manywords  *result_8;
    	twoargs  selectbetweenw_1_arg;
    	
    	clnt = clnt_create (host, RDBASEPROG, RDBASEVERS, "udp");
    	if (clnt == NULL) {
    		clnt_pcreateerror (host);
    		exit (1);
    	}
    	
    	switch (cmd) {
    		case 'I':
    			result_1 = initw_1((void*)&initw_1_arg, clnt);
    			if (result_1 == (int *) NULL) {
    				clnt_perror (clnt, "call failed");
    			}else{
    				printf ("Database initialized to empty.\n");
    			}
    			break;
    		case 'i':
    			insertw_1_arg = word1;
    			result_2 = insertw_1(&insertw_1_arg, clnt);
    			if (result_2 == (int *) NULL) {
    				clnt_perror (clnt, "call failed");
    			}else if(*result_2 > 0){
    				printf ("Word inserted: %s\n", word1);
    			}else{
    				printf ("Word could not be inserted: %s\n", word1);
    			}
    			break;
    		case 'm':
    			result_7 = selectw_1((void*)&selectw_1_arg, clnt);
    			if (result_7 == (char **) NULL) {
    				clnt_perror (clnt, "call failed");
    			}else{
    				printf("Content of database: %s\n", *result_7);
    			}
    			break;
    		case 'b':
    			selectbetweenw_1_arg.firstarg = word1;
    			selectbetweenw_1_arg.secondarg = word2;
    			result_8 = selectbetweenw_1(&selectbetweenw_1_arg, clnt);
    			if (result_8 == (manywords *) NULL) {
    				clnt_perror (clnt, "call failed");
    			} else{
    				for(u_int i = 0; i < result_8->words.words_len; i++){
    					printf("%s\n", result_8->words.words_val[i]);
    				}
    			}
    		
    	}
    	clnt_destroy (clnt);
    }
    
    
    int
    main (int argc, char *argv[])
    {
    	char *host; 
    	char word1 [MAXWORD + 1];
        char word2 [MAXWORD + 1];
        char cmd;
        int wrdlen;
    	
    	while(1){
    		printf ("\nEnter Command out of    I i d l u c m b  \n");
    		wrdlen = nextin (&cmd, word1, word2);
    		host = "localhost";
    		rdbaseprog_1 (host, cmd, word1, word2);
    	}
    exit (0);
    }
    
    int nextin (cmd, word1, word2)
    char *cmd, *word1, *word2;
    {
       char command[MAXLINE];
       char tmp;
       fgets (command, MAXLINE, stdin);
       sscanf (command, "%c %s %s", cmd, word1, word2); 
       return 0;
    }
    
    

    minimaler Server:

    #include <stdio.h>
    #include <string.h>
    
    #include "rdbase.h"
    
    char dict[DBASESIZE] [MAXWORD+1];
    int  nwords = 0;
    
    int *
    initw_1_svc(void *argp, struct svc_req *rqstp)
    {
    	static int  result;
        nwords = 0;	
    	result = 1;
    	printf("Called initw.\n");
    	return &result;
    }
    
    int *
    insertw_1_svc(char **argp, struct svc_req *rqstp)
    {
    	static int  result;
    	printf("Insert %s.\n", *argp);
    
    	int i;
    	for (i=0; i<nwords; i++)
    		if (strcmp (*argp, dict[i]) == 0)
    			return 0;
    	strcpy(dict[nwords], *argp);
    	nwords++;
    	result = nwords;
    	
    	return &result;
    }
    
    char **
    selectw_1_svc(void *argp, struct svc_req *rqstp)
    {
       char** result = NULL;
       printf("Called selectw.\n");
       size_t num_results = nwords;
    
       result = malloc((num_results + 1) * sizeof(char*));
       result[num_results] = NULL;
    
       for (size_t i = 0; i != num_results; ++i) {
           size_t string_length = strlen(dict[i]);
           result[i] = malloc(string_length+1);
           strcpy (result[i], dict[i]); // Woher kommen die Infos bei Dir?
           char* const p = result[i];
           p[string_length] = 0;
       }
    
       return result;
    }
    
    
    manywords *
    selectbetweenw_1_svc(twoargs *argp, struct svc_req *rqstp)
    {
    	static manywords  result;
    	printf("Between: %s and %s\n", argp->firstarg, argp->secondarg);
    	int number = 0;
    	for(int k = 0; k < nwords; k++){
    		if((strcmp(argp->firstarg, dict[k]) <= 0) && (strcmp(argp->secondarg, dict[k]) >= 0)){
    			number++;
    		}
    	}
    
    	result.words.words_len = number;
    	result.words.words_val = malloc(number * sizeof(oneword));
    	for (size_t i = 0; i < nwords; ++i) {
    		if((strcmp(argp->firstarg, dict[i]) <= 0) && (strcmp(argp->secondarg, dict[i]) >= 0)){
    			result.words.words_val[i].word = malloc(strlen(dict[i]) + 1);
    			strcpy(result.words.words_val[i].word, dict[i]);
    		}
    	}
    
    	return &result;
    }
    
    


  • Naja, dann weise ich dich mal auf einen weiteren Fehler hin:

    	result.words.words_len = number;
    	result.words.words_val = malloc(number * sizeof(oneword));
    	for (size_t i = 0; i < nwords; ++i) {
    		if((strcmp(argp->firstarg, dict[i]) <= 0) && (strcmp(argp->secondarg, dict[i]) >= 0)){
    			result.words.words_val[i].word = malloc(strlen(dict[i]) + 1);
    			strcpy(result.words.words_val[i].word, dict[i]);
    		}
    	}
    

    Du hast einen Zähler i für die Gesamtliste der Wörter. Für die zurückzugebenden Wörter geht dein Index aber nur von 0 bis number (exklusive), nicht bis nwords (exklusive). Du brauchst eine andere Variable als i dafür, die du nur im true-Fall inkrementieren darfst. Nenne sie z.B. result_index.



  • @wob sagte in Rückgabewert:

    Du hast einen Zähler i für die Gesamtliste der Wörter. Für die zurückzugebenden Wörter geht dein Index aber nur von 0 bis number (exklusive), nicht bis nwords (exklusive). Du brauchst eine andere Variable als i dafür, die du nur im true-Fall inkrementieren darfst. Nenne sie z.B. result_index.

    Vielen Dank. Man sollte nicht alles gleich benennen.
    Jetzt funktioniert die letzte Funktion.
    Die vorletzte mit dem gesamten Inhalt der DB ausgeben habe ich auch gelöst.
    So sind nun alle Aufgaben durch.

    Vielen Dank an alle.


Anmelden zum Antworten