[C] Array als Rückgabewert einer Funktion

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • [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.

      Quellcode

      1. void deztorom(int dezzahl) /** Funktion um eine Dezimalzahl in eine Römische umzuwandeln. Erwartet einen integer Wert. */
      2. {
      3. char ziffern[13][3] = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X",
      4. "IX", "V", "IV", "I"};
      5. int zahlen[13] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
      6. int i=0, zahl;
      7. zahl = dezzahl;
      8. while (zahl > 0) /** Schleife läuft solange, bis "zahl" 0 erreicht */
      9. {
      10. if (zahl/zahlen[i] >= 1) /** Wenn sich "zahl" durch den entsprechenden Wert aus dem Array "zahlen" teilen lässt, wird die äquivalente römische Ziffer ausgegeben. */
      11. {
      12. [COLOR=red]printf(ziffern[i]); /** Ausgabe der römischen Ziffer. */[/COLOR]
      13. zahl -= zahlen[i]; /** Der Wert aus dem array "zahlen" wird von Zahl abgezogen, damit im nächsten Durchlauf mit der neuen Zahl gerechnet werden kann. */
      14. }
      15. else /** Ansonsten wird der "i" um 1 erhöht, um im nächsten Durchlauf mit der nächsten Zahl zu arbeiten. */
      16. {
      17. i++;
      18. }
      19. }
      20. printf("\n");
      21. }
      Alles anzeigen
      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
    • Werbung zur Unterstützung des Forums ( Bitte AddBlocker deaktivieren )

    • 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:

      Quellcode

      1. void a() {
      2. char array[15];
      3. b(array);
      4. }
      5. char *b(char *tar) {
      6. strcpy(tar, "Hello World");
      7. }

      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:

      Quellcode

      1. void a() {
      2. char *array = b();
      3. // irgendwas mit array machen
      4. free(array); // speicher wieder freigeben
      5. }
      6. char *b() {
      7. char *array = malloc(15); // 15 bytes reservieren
      8. strcpy(array, "Hello World");
      9. return array; // Speicher liegt auf dem Heap, wird daher nicht berenigt
      10. }


      Hoffe ich hab dein Problem richtig verstanden ...