Funktion mit mehreren Rückgabewerten?



  • BasicMan01 schrieb:

    void callByReference(int &a)

    Ist kein ANSI C.



  • und warum nicht einfach ein struct zurück geben 😕
    das wär zu schwer oder 😕
    hey! da braucht man nicht mal malloc() 🤡



  • Tim schrieb:

    Ansonsten kann man "mehrere Rückgabewerte" auch in ein Strukt packen und das zurückgeben, das entpsricht aber nicht der Aufgabenstellung und ist auch eher unüblich.

    uups überlesen sry 🙄



  • Wutz schrieb:

    BasicMan01 schrieb:

    void callByReference(int &a)

    Ist kein ANSI C.

    😃 ups ... gut zu wissen. Wieder ein Grund mehr für mich, C sein zu lassen



  • BasicMan01 schrieb:

    Wutz schrieb:

    BasicMan01 schrieb:

    void callByReference(int &a)

    Ist kein ANSI C.

    😃 ups ... gut zu wissen. Wieder ein Grund mehr für mich, C sein zu lassen

    husch weg mit dir :p du weißt ja nicht was gut ist 😋



  • imho ist callbyreference = callbypointer. das andere wäre callbyvalue...



  • Huhu,

    vielen Dank für die vielen Inspirationen 🙂

    Ich habe es zunächst einmal über die Variante versucht, der Funktion die Adressen von anzahl_zahlen und anzahl_buchstaben zu übergeben und nur anzahl_converted über return zurückzugeben...

    Das Programm hat aber noch irgendwo einen Fehler... in der Ausgabedatei steht der String mit kleinen Buchstaben, das funktioniert.
    Anzahl_converted wird auch richtig ausgegeben.

    Aber ich scheine etwas bei den anderen beiden als Funktionsparametern falsch gemacht zu haben... das Ergebnis ist immer 0, der Wert, mit dem ich die Variablen in Main initialisiert habe... wo hängt es da... gedanklich dachte ich jetzt, da in der Funktion der Wert direkt in der Adresse von main geändert wird, es würde funktionieren...

    hier mal der Code:

    //kl_ss_04_a2
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int copy_File(FILE *fein, FILE *faus, int *anz_chars, int *anz_numbers)
    {
        char c;
        int anz_converted = 0;
    
        while ( (c = fgetc(fein)) != EOF)
        {
            //Großbuchstabe?
            if ( (c >= 'A') && (c <= 'Z') )
            {
                c = c + 'a' - 'A';
                fputc(c, faus);
                anz_converted++;
                *anz_chars++;
            }
    
            //Kleinbuchstabe?
            else if ( (c >= 'a') && (c <= 'z') )
            {
                fputc(c, faus);
                *anz_chars++;
            }
    
            //Zahl?
            else if ( (c >= 0) && (c <= 9) )
            {
                fputc(c, faus);
                *anz_numbers++;
            }
    
            //Alle anderen Zeichen
            else
                fputc(c, faus);
        }
        //Anzahl umgewandelter Buchstaben zurückgeben
        return anz_converted;
    }
    
    int main (void)
    {
        int anz_converted = 0;
        int anz_chars = 0;
        int anz_numbers = 0;
    
        //Dateien öffnen + auf Fehler prüfen
        FILE *fin;
        FILE *fout;
    
        fin = fopen("ein.txt", "r");
        if (NULL == fin)
            exit(-1);
    
        fout = fopen("aus.txt", "w");   
        if (NULL == fout)
            exit(-1);
    
        anz_converted = copy_File(fin, fout, &anz_chars, &anz_numbers);
    
        //Ergebnis ausgeben
        printf("Anzahl umgewandelter Buchstaben:\t%d\n", anz_converted);
        printf("Anzahl der Buchstaben gesamt:\t%d\n", anz_chars);
        printf("Anzahl der Zahlen:\t%d\n", anz_numbers);
    
        //Dateien schließen
        fclose(fin);
        fclose(fout);
    
        getchar();
        return 0;    
    }
    

    Als nächstes probiere ich dann noch die Version, ein struct zurückzugeben... das ist nämlich auch schön gelöst 🙂

    Greez

    Haimi



  • Haimi schrieb:

    *anz_chars++;

    Und, hast du getestet?
    Die Vorrangregeln der C-Operatoren hast du nicht beachtet, es sollte heissen:

    (*anz_chars)++;
    


  • ahh... vielen Dank 🙂

    Jetzt funktioniert alles... ein kleiner Fehler war noch zusätzlich drin, bei der Abfrage ob es Zahlen sind, müssen die Zahlen in Anführungszeichen gesetzt werden...



  • http://www.cplusplus.com/reference/clibrary/cctype/
    versuchs doch mal damit dann klappts auch mit dem nachbar :p



  • das ist ja ein Ding... ich wusste gar nicht das es schon so tolle Funktionen in C gibt 😃 hat auch noch nie jemand von was erwähnt wo ich es lerne ^^

    Ich habe gerade angefangen das Programm auf eine Rückgabe einer Struktur umzuwandeln... kanns sein, dass die Aufgabenstellung damit auch verfälscht getroffen wäre?

    Ich habe mir diese Struktur angelegt:
    typedef struct
    {
    int anz_chars = 0;
    int anz_numbers = 0;
    int anz_converted = 0;
    } counter_t;

    die Funktion copyFile ist aber vom Typ int... und wenn ich eine Struktur zurückgebe, müsste ich sie ja auf den Typ counter_t umschreiben... oder?



  • Ja.

    Und wo definierst du die struct-Variable, welche du direkt oder als Zeiger zurückgibst? Du musst sicherstellen, dass der Speicherbereich deines Rückgabewertes im aufrufenden Kontext gültig ist.



  • jein also du sollst scheinbar beides können rückgabe via parameter und via return

    De Anzahl der umgewandelten Buchstaben wird über einen Parameter
    anz_converted zurückgegeben.

    rückgabe via parameter

    Zusätzlich zählt die Funktion die Buchstaben und die Ziffern in der Eingabedatei und gibt
    deren Anzahl als Rückgabewert zurück.

    rückgabe via return

    int copy_File(

    und zum finale bin ich voll planlos 😕



  • Wutz schrieb:

    Ja.

    Und wo definierst du die struct-Variable, welche du direkt oder als Zeiger zurückgibst? Du musst sicherstellen, dass der Speicherbereich deines Rückgabewertes im aufrufenden Kontext gültig ist.

    einfach in der function als lokale variable anlegen und dann durchs return raus 😃


Anmelden zum Antworten