Pointer als Rückgabewert einer Funktion

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
hardcoding
Beiträge: 91
Registriert: Do Okt 04, 2012 9:24 pm

Pointer als Rückgabewert einer Funktion

Beitrag von hardcoding » Mo Dez 03, 2012 12:55 am

Hallo,


Es ist möglich, einen Zeiger als Rückgabewert einer Funktion zu deklarieren, so wie das bei vielen Funktionen der Standard-Bibliothek gemacht wird. Aber irgendwie verstehe ich diese Thematik irgendwie trotzdem nicht. Ich habe auch im Wiki nachgeschaut und dabei nicht gefunden. :?

Die Funktion selbst kann werte zurückgeben wie in diesem Beispiel:

Code: Alles auswählen

void rechne( int z1, int z2, int* erg1, int* erg2 );
int main( void )
{
    int zahl1 = 4;
    int zahl2 = 8;
    int ergebnis1;
    int ergebnis2;
    rechne( zahl1, zahl2, &ergebnis1, &ergebnis2 );
    return 0;
}
 
void rechne( int z1, int z2, int* erg1, int* erg2 )
{
    *erg1 = z1 + z2;
    *erg2 = z1 - z2;
}
 
 
 
Aber Name ein Funktion soll als Rückgabewert dienen? wie soll man das verstehen ?

Hier ein Beispiel:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 255

char *eingabe(char *str) {
   char input[MAX];

   printf("Bitte \"%s\" eingeben: ",str);
   fgets(input, MAX, stdin);
   return strtok(input, "\n");
}

int main(void) {
   char *ptr;

   ptr = eingabe("Vorname");
   printf("Hallo %s\n", ptr);
   ptr = eingabe("Nachname");
   printf("%s, interssanter Nachname\n", ptr);
   return EXIT_SUCCESS;
}


nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Pointer als Rückgabewert einer Funktion

Beitrag von nufan » Mo Dez 03, 2012 1:35 am

hardcoding hat geschrieben:Die Funktion selbst kann werte zurückgeben wie in diesem Beispiel:

Code: Alles auswählen

    void rechne( int z1, int z2, int* erg1, int* erg2 );
    int main( void )
    {
        int zahl1 = 4;
        int zahl2 = 8;
        int ergebnis1;
        int ergebnis2;
        rechne( zahl1, zahl2, &ergebnis1, &ergebnis2 );
        return 0;
    }

    void rechne( int z1, int z2, int* erg1, int* erg2 )
    {
        *erg1 = z1 + z2;
        *erg2 = z1 - z2;
    }
Schlechtes Beispiel ^^ Hier wird (von main abgesehen) nirgends etwas zurückgegeben, sondern nur zugewiesen.
hardcoding hat geschrieben:Aber Name ein Funktion soll als Rückgabewert dienen? wie soll man das verstehen ?

Hier ein Beispiel:

Code: Alles auswählen

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX 255

    char *eingabe(char *str) {
       char input[MAX];

       printf("Bitte \"%s\" eingeben: ",str);
       fgets(input, MAX, stdin);
       return strtok(input, "\n");
    }

    int main(void) {
       char *ptr;

       ptr = eingabe("Vorname");
       printf("Hallo %s\n", ptr);
       ptr = eingabe("Nachname");
       printf("%s, interssanter Nachname\n", ptr);
       return EXIT_SUCCESS;
    }
Du verwechselst hier was... In deinem Beispiel wird einfach strtok() aufgerufen. Diese Funktion liefert dir einen Zeiger auf eine Zeichenkette zurück. Diesen Zeiger gibst du dann mit return einfach an die aufrufende Funktion zurück. "der Name der Funktion" ist hier also nicht die richtige Formulierung.

Du kannst die Methode auch so schreiben:

Code: Alles auswählen

    char *eingabe(char *str) {
       char input[MAX];

       printf("Bitte \"%s\" eingeben: ",str);
       fgets(input, MAX, stdin);
       char *tmp;
       tmp = strtok(input, "\n");
       return tmp;
    }
Hilft dir das weiter?

Wo genau gibt es denn noch Verständnisprobleme?

hardcoding
Beiträge: 91
Registriert: Do Okt 04, 2012 9:24 pm

Re: Pointer als Rückgabewert einer Funktion

Beitrag von hardcoding » Mo Dez 03, 2012 1:48 am

Das Problem liegt hier :

Code: Alles auswählen

    char *eingabe(char *str)
Wie soll ich den Indirection Operator vor eingabe verstehen ?
Schlechtes Beispiel ^^ Hier wird (von main abgesehen) nirgends etwas zurückgegeben, sondern nur zugewiesen.
Doch.

Die beiden werte

Code: Alles auswählen

*erg1 = z1 + z2;
*erg2 = z1 - z2
werden an die Funktion zurückgegeben.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Pointer als Rückgabewert einer Funktion

Beitrag von nufan » Mo Dez 03, 2012 1:55 am

hardcoding hat geschrieben:Das Problem liegt hier :

Code: Alles auswählen

    char *eingabe(char *str)
Wie soll ich den Indirection Operator vor eingabe verstehen ?
"Indirection Operator" hab ich noch nie gehört, aber ok ^^
Das bedeutet, dass du einen Zeiger auf ein oder mehrere Elemente vom Typ char hast. Ein Zeiger ist eine Variable, die eine Adresse speichert.
hardcoding hat geschrieben:
dani93 hat geschrieben:Schlechtes Beispiel ^^ Hier wird (von main abgesehen) nirgends etwas zurückgegeben, sondern nur zugewiesen.
Doch.

Die beiden werte

Code: Alles auswählen

    *erg1 = z1 + z2;
    *erg2 = z1 - z2
werden an die Funktion zurückgegeben.
Ja, hier wird aber wie gesagt nur etwas zugewiesen. Du hast auf diesen Speicherbereich auch in der aufrufenden Funktion Zugriff. Aber das ist keine "Rückgabe" im klassischen Sinne (mit return).

hardcoding
Beiträge: 91
Registriert: Do Okt 04, 2012 9:24 pm

Re: Pointer als Rückgabewert einer Funktion

Beitrag von hardcoding » Mo Dez 03, 2012 2:04 am

"Indirection Operator" hab ich noch nie gehört, aber ok ^^
Naja ok.http://msdn.microsoft.com/en-us/library ... 80%29.aspx
Das bedeutet, dass du einen Zeiger auf ein oder mehrere Elemente vom Typ char hast.
In diesem Beispiel zeigt er also auf:

Code: Alles auswählen

input
oder wie

Code: Alles auswählen

char *eingabe(char *str) {
       char input[MAX];

       printf("Bitte \"%s\" eingeben: ",str);
       fgets(input, MAX, stdin);
       return strtok(input, "\n");
    }
Ein Zeiger ist eine Variable, die eine Adresse speichert.
Das ist mir schon klar. :)

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Pointer als Rückgabewert einer Funktion

Beitrag von cloidnerux » Mo Dez 03, 2012 7:14 am

Ein Funktionskopf hat den Aufbau:

Code: Alles auswählen

[Rückgabetyp] Name (#Parameter#)
Und bei deinen Beispielen:

Code: Alles auswählen

char *eingabe(char *str)
Ist

Code: Alles auswählen

char *
der Typ des Rückgabeparameters. Auch wenn das Sternchen vor dem Namen der Funktion steht, so gehört er doch zum char, weil eben der Funktionsname keine Variable ist.
Und wenn man sich das ganze Beispiel anschaut:

Code: Alles auswählen

char *eingabe(char *str) {
       char input[MAX];

       printf("Bitte \"%s\" eingeben: ",str);
       fgets(input, MAX, stdin);
       return strtok(input, "\n");
    }
So definierst du eine Funktion die "char *" zurückgibt und "char *" als Parameter str erwartet. Dann wird irgendwas gemacht und du gibst den "char *" den strtok zurückgibt auch wieder mit return zurück.
Redundanz macht wiederholen unnötig.
quod erat expectandum

hardcoding
Beiträge: 91
Registriert: Do Okt 04, 2012 9:24 pm

Re: Pointer als Rückgabewert einer Funktion

Beitrag von hardcoding » Mo Dez 03, 2012 7:41 am

cloidnerux hat geschrieben:Ein Funktionskopf hat den Aufbau:

Code: Alles auswählen

[Rückgabetyp] Name (#Parameter#)
Und bei deinen Beispielen:

Code: Alles auswählen

char *eingabe(char *str)
Ist

Code: Alles auswählen

char *
der Typ des Rückgabeparameters. Auch wenn das Sternchen vor dem Namen der Funktion steht, so gehört er doch zum char, weil eben der Funktionsname keine Variable ist.
Und wenn man sich das ganze Beispiel anschaut:

Code: Alles auswählen

char *eingabe(char *str) {
       char input[MAX];

       printf("Bitte \"%s\" eingeben: ",str);
       fgets(input, MAX, stdin);
       return strtok(input, "\n");
    }
So definierst du eine Funktion die "char *" zurückgibt und "char *" als Parameter str erwartet. Dann wird irgendwas gemacht und du gibst den "char *" den strtok zurückgibt auch wieder mit return zurück.

Alles klar. vielen Dank

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Pointer als Rückgabewert einer Funktion

Beitrag von Xin » Mo Dez 03, 2012 11:46 am

hardcoding hat geschrieben:
"Indirection Operator" hab ich noch nie gehört, aber ok ^^
Naja ok.http://msdn.microsoft.com/en-us/library ... 80%29.aspx
Ich kenne das im Deutschen als "Dereferenzierungs-Operator".

Der Rest scheint ja geklärt :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Pointer als Rückgabewert einer Funktion

Beitrag von mfro » Mi Jan 16, 2013 5:55 pm

Eure Beispiele sind nicht besonders gut:

Code: Alles auswählen

char *eingabe(char *str) {
       char input[MAX];

       printf("Bitte \"%s\" eingeben: ",str);
       fgets(input, MAX, stdin);
       return strtok(input, "\n");
}
"input" ist in der Funktion "eingabe()" eine automatische Variable. D.h. sie existiert nur innerhalb des Gültigkeitsbereichs von "eingabe()". Die Funktion strtok() durchsucht innerhalb der Funktion diesen String nach einem Zeilenende-Zeichen und ersetzt das durch ein Nullbyte. Anschließend wird ein Zeiger auf den String per return an die aufrufende Funktion zurückgegeben.

Wenn die jetzt etwas mit dem String anfangen will, ist das heftig dicht an der Klippe - nach dem Verlassen der Funktion ist die Variable nicht mehr definiert. Unmittelbar danach mag das sogar noch funktionieren, aber im weiteren Programmverlauf gibt es ziemlich sicher einen Absturz oder noch schlimmer: falsche Ergebnisse.

Ein typischer Fall von "dangling pointer" (also ein Zeiger, der auf etwas ungültiges zeigt). Ein meist sehr schwer zu findender Fehler - deshalb bitte gar nicht erst angewöhnen...
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Pointer als Rückgabewert einer Funktion

Beitrag von Xin » Mi Jan 16, 2013 8:56 pm

mfro hat geschrieben:Eure Beispiele sind nicht besonders gut:

Code: Alles auswählen

char *eingabe(char *str) {
       char input[MAX];

       printf("Bitte \"%s\" eingeben: ",str);
       fgets(input, MAX, stdin);
       return strtok(input, "\n");
}
"input" ist in der Funktion "eingabe()" eine automatische Variable.
Sehr aufmerksam ^^

input müsste entweder von außen reinkommen oder static sein.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten