MMORPG Core - Deutsche Community für Online Rollenspiele - Powered by vBulletin

  • AAA
  • Aggressive
  • Alienated
  • Amazed
  • Amused
  • Angelic
  • Angry
  • Apelike
  • Artistic
  • Asleep
  • Balanced
  • Banhappy
  • Bashful
  • Bitchy
  • Blah
  • Bookworm
  • Bored
  • Breezy
  • Brooding
  • Busy
  • Buzzed
  • Chatty
  • Cheeky
  • Cheerful
  • Cloud 9
  • Cold
  • Coldturkey
  • Confused
  • Cool
  • Crappy
  • Creative
  • Curious
  • Cynical
  • Daring
  • Dead
  • Depressed
  • Devilish
  • Disagree
  • Doh
  • Doubtful
  • Dramaqueen
  • Dreaming
  • Drunk
  • Elated
  • Energetic
  • Fiendish
  • Fine
  • Flirty
  • Gloomy
  • Goofy
  • Grumpy
  • Happy
  • Horny
  • Hot
  • Hungover
  • In Love
  • Innocent
  • Inpain
  • Insomnious
  • Inspired
  • Lonely
  • Lucky
  • Lurking
  • Mellow
  • Mischievious
  • Mondayblues
  • Musical
  • Nerdy
  • Notamused
  • Notworthy
  • Paranoid
  • Pensive
  • Predatory
  • Procrastinating
  • Psychedelic
  • Question
  • Relaxed
  • Roflmao
  • Sad
  • Scared
  • Scurvy
  • Shocked
  • Sick
  • Sleepy
  • Sluggish
  • Sneaky
  • Snobbish
  • Spaced
  • Spooky
  • Sporty
  • Starving
  • Stressed
  • Sunshine
  • Sweettooth
  • Thinking
  • Tired
  • Torn
  • Twisted
  • Veggedout
  • Volatile
  • Woot
  • Worried
  • Yeehaw
  • DDos
  • DDos
  • DDos
  • DDos
  • DDos
  • DDos
  • DDos
  • DDos
  • DDos
  • DDos
  • DDos
  • Tweet   
    Ergebnis 1 bis 3 von 3
    1. #1
      Top Poster
       

      Registriert seit
      Jan 2010
      Ort
      209.85.135.103
      Beiträge
      792
      Danke
      84
      Danke erhalten: 195

      Standard [C] Array als Rückgabewert einer Funktion

      Die Werbung stört? Registriere dich hier!
      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.

      Code:
      void deztorom(int dezzahl) /** Funktion um eine Dezimalzahl in eine Römische umzuwandeln. Erwartet einen integer Wert. */
      {
          char ziffern[13][3] = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X",
                             "IX", "V", "IV", "I"};
          int zahlen[13] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
          int i=0, zahl;
      
          zahl = dezzahl;
          while (zahl > 0) /** Schleife läuft solange, bis "zahl" 0 erreicht */
          {
              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. */
              {
                  printf(ziffern[i]); /** Ausgabe der römischen Ziffer. */
                  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. */
              }
              else /** Ansonsten wird der "i" um 1 erhöht, um im nächsten Durchlauf mit der nächsten Zahl zu arbeiten. */
              {
                  i++;
              }
          }
          printf("\n");
      }
      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:
      [Um Links zu sehen registriere dich bitte. Klicke hier.]

      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

    2. #2
      Core
      AAA
       

      Registriert seit
      Aug 2009
      Beiträge
      556
      Danke
      31
      Danke erhalten: 185

      Standard

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

    3. Das folgende Mitglied bedankt sich bei Well für diesen Beitrag:

      Icii (15.10.11)

    4. #3
      Top Poster
       

      Registriert seit
      Jan 2010
      Ort
      209.85.135.103
      Beiträge
      792
      Danke
      84
      Danke erhalten: 195

      Standard

      Jo, Danke, das ist genau das, was ich gesucht habe.

    Lesezeichen

    Berechtigungen

    • Neue Themen erstellen: Nein
    • Themen beantworten: Nein
    • Anhänge hochladen: Nein
    • Beiträge bearbeiten: Nein
    •