[C] Array als Rückgabewert einer Funktion

  • Servus MCore

    Als mir n bissl Langweilig war, hab ich meine Belegarbeit für Programmierung wieder gefunden, und mir ist wieder eingefallen, das es noch einen kleinen Fehler gibt.

    Die Aufgabe war, römische Zahlen zu addieren bzw. zu subtrahieren. Dazu gab es ein paar Regeln. Unter anderm, wie römische Zahlen gebildet werden, das die Zahlen beim Aufruf den Programms übergeben werden und das Funktionen verwendet werden sollen. Und da kommen wir zu meinem Fehler.

    Unser Dozent meinte, das eine Funktion immer genau eine Aufgabe ausführen sollte. Ich hab in der Funktion "deztorom" allerdings etwas berechnen lassen, und die Ausgabe des Wertes vorgenommen.

    Hmm, ist schon ein wenig her, seit ich das geschrieben habe, aber ich erinnere mich, dass es nicht so ohne weiteres möglich war, ein Array als Rückgabewert zu übergeben.
    Meine Idee war es, das Array als globale Variable anzulegen, und der Dozent meinte, "möglich wäre es, aber ihnen fällt bestimmt eine elegantere Lösung ein".

    Blöderweise ist das nicht der Fall ^_^'
    Aber hier gibt es bestimmt den ein oder anderen, welchem eine besser Möglichkeit einfällt.
    Der vollständigkeit halber nochmal der gesamte Code:
    [C] asdf - Pastebin.com

    Achja, nicht das ihr denkt, ich wollte mich vor der Arbeit drücken. Die Belegarbeit hab ich schon abgegeben, und bestanden. Mich interessiert nur, wie man diesen letzten Fehler ausbügeln könnte.

    Und wenn jemand Langeweile hat, und irgendwo bessere Möglichkeiten oder unschönheiten in meinem Code entdeckt, darf er die ruhig ansprechen :)

    mfg

  • Ein Array kann nicht ohne weiteres zurückgegeben werden, da der Name eines Arrays im Grunde nur ein Zeiger auf das erste Element des Arrays ist. Diese befinden sich bei einem normalen, lokalen Array auf dem Stack, welcher am Ende einer Funktion gelöscht wird. Es wird dann zwar ein Zeiger zurückgegeben, die Werte, auf die der Zeiger zeigt, existieren aber (oftmals) nicht mehr.
    Die eine Möglichkeit wäre daher, das Array in der Funktion anzulegen, in der die Rückgabe der Anderen benötigt wird. Dann muss nur der Zeiger des angelegten Arrays an die aufzurufende Funktion übergeben werden; diese kann dann die Daten in das Array schreiben. Diese Vorgehensweise sieht man oft in den "Standardfunktionen". (scanf, fgets, ...)
    Beispiel:

    Code
    void a() {
    char array[15];
    b(array);
    }
    char *b(char *tar) {
    strcpy(tar, "Hello World");
    }


    Die zweite Möglichkeit wäre, das Array auf dem Heap anzulegen (malloc). Der Speicher hier muss aber wieder manuell freigegeben werden (free), sonst kommt es zu Memory Leaks.
    Beispiel:

    Code
    void a() {
    char *array = b();
    // irgendwas mit array machen
    free(array); // speicher wieder freigeben
    }
    char *b() {
    char *array = malloc(15); // 15 bytes reservieren
    strcpy(array, "Hello World");
    return array; // Speicher liegt auf dem Heap, wird daher nicht berenigt
    }

    Hoffe ich hab dein Problem richtig verstanden ...

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!