Rückgabewert einer Funktion in ein Array bringen

  • Hallo,

    ich habe folgendes Problem und zwar habe ich eine Funktion, die eine Array übergeben bekommt.
    Bei dem Array handelt es sich um ein Char, der Inhalt lautet z.B. 123AbC.
    Innerhalb der Funktion wird alles zu Int d.h. über ein if oder switch case wird (char)1 zu (int)1 und a zu 10 usw.
    Da ich allerdings kein Array als Rückgabe verwenden kann, habe ich meine Funktion mittlerweile soweit umgebaut, dass über eine for-Schleife mit Zähler jeweils ein Wert aus dem EingabeArray in die Funktion übertragen wird und die Funktion auch nur einen Wert ausgibt.

    for (int i=0; i<32;i++)
    {
    zwischenwert2=Eingabezahl[i];
    zwischenwert=char2intvalue(zwischenwert2);
    Eingabezahlint[i]=zwischenwert;
    }

    doch selbst dies will nicht funktionieren obwohl ich mittlerweile zumindest keine Fehlermeldungen mehr bekommen.
    Anscheinend geht er nicht mal mehr in die Schleife; ich sitze jetzt schon 5 Tage an dem Programm (zum Glück nicht nur an dem o.g. Problem ;) ), mittlerweile glaube ich sehe ich den Wald vor lauter Bäumen nicht mehr.
    Ich hoffe ihr könnt mir da helfen und habt ein paar gute Vorschläge.
    Schonmal vielen Dank im Vorraus!

    MfG
    LJ

  • Man kann es ja erstmal etwas einfacher fassen:

    Code
    for(int i = 0; i < 32; ++i)
      Eingabezahlint[i] = char2intvalue(Eingabezahl[i]);


    Schau nach, dass es Eingabezahlint und Eingabezahl in der richtigen Größe gibt und wenns immer noch nicht klappt, poste mal die Stellen, wo diese Variablen angelegt werden und die Definition von char3intvalue. ;)

    Viele liebe Grüße
    The User

  • So sieht das Programm bis jetzt aus:


  • Er geht immernoch nicht in die for-Schleife.

    Das Ganze soll ein Programm sein zum Umwandeln von beliebigen polyadischen Zahlensystemen in andere.

  • "char Eingabezahl[32]={0}; //stellt sicher, dass Ar"
    dadurch wird ein Zeichenarray erzeugt, das gilt jedoch nur als String, den man einfach mit cin einlesen kann, wenn das letzte Zeichen ein Nullzeichen ist.
    Es lauern sehr viele Fehler, die du noch nicht einschätzen kannst, daher empfehle ich dir die Datentypen string und vector zu verwenden, z. B.:


    Das ist viel weniger fehleranfällig und für die meisten Einsätze der bessere Weg.

    Viele liebe Grüße
    The User

  • ok, dann will ich das "nachher" mal ausprobieren.

    Danke für die schnelle Hilfe, ich melde mich dann später wieder.

  • So, nun bin ich hier auch angemeldet:)

    irgendwie komme ich mit dem Vector nicht zurecht:-(

    könntest du meinen Code vlt so anpassen, dass es läuft?


  • Ein Hinweis:
    Strings haben eine dynamische Länge, also müssen es nicht immer 32 sein.
    Wenn du die Zeile

    Code
    Eingabezahl = string(32 - Eingabezahl.size(), '0') + Eingabezahl;


    wegnimmst und in der Folge statt 32 Eingabezahl.size() verwendest, klappt es auch mit 14 oder 35 Stellen. (Zumindest bei 64-Bit Integers)

    Viele liebe Grüße
    The User

  • Danke!
    Das hat mich schon einiges weiter gebracht.
    Dennoch befürchte ich, dass ich noch ein paar Mal deine Hilfe in anspruch nehmen muss.
    das mit Vektoren, size usw ist noch absolut neu für mich.

    Ich habe mein Programm jetzt noch etwas erweitert, in einer weiteren Funktion ( es müssen leider so viele einzelne Funktionen sein:-()
    wird die Eingabezahlint in eine Dezimalzahl umgewandelt.
    Es lässt sich zwar problemlos compilieren, aber das Ergebnis entspricht nicht meinen Erwartungen...
    Ich hoffe du kannst so erkennen, was der Code machen soll, ansonsten erkläre ich dir genau, was ich vorhabe.

  • Du bist häufiger mit Eingabezahl und Eingabezahlint durcheinander gekommen, die Namen waren etwas suboptimal. ;) Du hast nicht daran gedacht, dass beim Exponenten die Länge der Eingabe und nicht die des Vektors berücksichtigt werden sollte, deshalb habe ich den Vektor nun ganz entfernt und voilà, es klappt ohne jedes Array. Außerdem hattest du Summe mehrfach deklariert.

    Viele liebe Grüße
    The User

  • Vielen, vielen Dank für deine Hilfe!!!:-D

    Ich finde es echt super von dir, dass du mir hilfst.
    Auf das mit size(), vector und cmath wäre ich nie gekommen.

    Ich will dann mal versuchen, ob ich die Umwandlung zurück in eine Zahl mit anderer Basis hinbekommen. Die Tage (oder auch schon morgen:roll:) werde ich mich wieder hier melden und berichten was ich zustande gebracht habe;)

    Dann noch einen schönen Abend!

    MfG
    LJ

  • ich befürchte, ich benötige noch ein weiteres Mal deine Hilfe.

    ich bekomme meine neue polyadische Zahl nicht ausgegeben.
    Gibt es eigentlich einen Unterscheide zwischen return wert und return (wert) bzw ();
    Ich dachte vorher Funktionen können nur einen Rückgabewert haben, wieso kann man dann mit return noch mehr ausgeben.

    Könntest du mir bitte noch etwas zum Umgang mit den Vektoren sagen; was bedeuten die Argumente in den Klammern?

    Hier ist mal wieder das aktuelle Programm;
    ich hoffe das mit der Umwandlung von Zahl zu Buchstabe ist einigermaßen richtig.
    Bei den Variablentypen bei back2poly und intvalue2char bin ich mir auch nicht so sicher, ob das gut geht.

  • Also das mit dem i ist schonmal ziemlicher Schwachsinn, geht viel einfacher:


    Der macht dann einfach erst das, wo du mit dem i abgefragt hast, und dann das normale. Also bei so einfachen Dingen, wo nur ein einziges Mal die eine Bedingung ausgeführt werden soll, macht es keinen Sinn über eine Variable zu bestimmen, welche alternative Block ausgeführt werden soll.
    Zweite Sache: Brauchst du überhaupt ein Array oder einen Vektor? Eigentlich nicht, du kannst auch direkt das Ergebnis in einen String schreiben.

    Code
    string int2poly(int Summe, int base_neu)
    {
      string poly;
      ...
      return poly;
    }


    Wenn du Poly berechnest, musst du einfach den Wert in den String hineinpacken, anhängen geht sowohl bei strings als auch bei vector mit push_back, da der Euklidische Algorithmus jedoch die Stellen umgekehrt liefert, musst du push_front verwenden, also:

    Code
    poly.push_front(int2charvalue(wert % base_neu));


    Versuch selbst herauszufinden, wie du das einbaust. ;)
    Die Sache mit dem return:
    Wenn du return aufrufst, wird die Funktion sofort verlassen und der Ausdruck hinter return als Rückgabe behandelt. Code, der hinter return folgt, wird nicht mehr ausgeführt (es sei denn das return ist in einem nicht zutreffenden if-Block o. ä.), das heißt, dass dein "return 0;" keinen Sinn mehr macht. Du bist das wahrscheinlich aus main gewohnt, damit gibt man ans System den Wert 0 zurück, um eine erfolgreiche Programmausführung anzuzeigen. (Wenn z. B. abort aufgerufen wird, ist die Rückgabe wahrscheinlich nicht 0). return ist keine Funktion, deshalb braucht man die Klammern auch nicht, andererseits können sie nicht schaden. ;)

    Theme vector: Du kannst einen vector oft genauso behandeln wie ein array:

    Code
    vector<int> feld; // In < > der Typ, der gespeichert wird, feld ist leer
    vector<string> feld2(32, "hi"); // feld2 hat die Länge 32 und enthält 32 mal den string "hi"
    int x;
    cin >> x;
    feld.push_back(x); // Anhängen, auf Arrays nicht möglich
    cout << feld[0] << endl; // geht genauso wie beim Array
    cout << feld2[2] << feld[3] << feld[4] << endl; // Ausgabe hihihi


    Mit strings kannst du auch die Operationen machen und außerdem genauso wie bei C-Strings.

    Viele liebe Grüße
    The User

    PS: Das int2charvalue stimmt nicht ganz ;)

  • Danke für deine Antwort.

    Meintest du das so ungefähr?

    dabei erhalten ich jedoch die Meldung
    error: ‘struct std::string’ has no member named ‘push_front’


    EDIT2 '''''''''''''''''''''''''''''''''''''''''''''''###############'''''''''''''''''''''''''''''''''''#''''''''''''''

    ich bin jetzt auf den Typ deque gestoßen, damit bin ich ein Stück weiter, aber die Typen char und int vertragen sich noch nicht, wie kann ich das denn umwandeln?

    3 Mal editiert, zuletzt von Mr LJ (10. Februar 2009 um 13:48)

  • Tut mir Leid, habe vorhin vergessen zu antworten und musste weg. ;)
    Also string hat tatsächlich kein push_front, nimm statt dessen push_back. Nach der while-Schleife musst du dann allerdings "reverse(polyint.begin(), polyint.end());" ausführen, damit das ganze umgedreht wird. Außerdem musst du dafür <algorithm> includen. Überdenke noch einmal die Zeile "string polyint(32, 0)", du legst einen String mit 32 Elementen an, um ihm dann mit push noch zusätzlich welche hinzuzufügen. Lass das (32, 0) einfach weg, und der String hat eben 32 Nullen weniger. ;) Außerdem ist ein String kein integer, also musst du auch die erste "Summe % base_neu" per push_back einfügen. Dann sollte es gehen.

    Viele liebe Grüße
    The User

  • so?

    nur beim return kommt so nichts zurück

    Darf ich dich mal im icq adden?

    Einmal editiert, zuletzt von Mr LJ (10. Februar 2009 um 19:41)

  • hier ist nun das lauffähige Programm:

    Nochmals vielen Dank an The User für die Hilfe!

    Einmal editiert, zuletzt von Mr LJ (10. Februar 2009 um 22:29)

  • Eine kleine Frage habe ich noch:
    Eingabezahl ist doch ein (string)Vektor oder?

    Es wird deklariert als
    string Eingabezahl(32,'0');

    Das heißt ja, es hat 32 Felder, in denen überall eine '0' steht.

    Wenn ich jetzt über cin>> Eingabezahl z.B. 123 einlese und über Eingabezahl.size() die Größe abfrage, kommt dabei 3 raus (sollte oder?).

    Was ich mich jetzt frage, was ist mit den ganzen '0' en? die sind doch auch noch mit in dem Verktor mit 32 Feldern(=size?).

    Könntest du mir das bitte nochmal kurz erklären?

    Vielen Dank im vorraus

    MfG

  • Ne Eingabezahl ist ein normaler string, also quasi ein Array aus char.
    Das "string Eingabezahl(32, '0')" ist eigentlich unnötig, weil die 32 '0'en sowieso durch die Eingabe "cin >> Eingabezahl" überschrieben werden, "string Eingabezahl" würde also reichen. Beim Einlesen wird der String eben komplett neu gemacht, sodass wirklich das Eingegebene drinsteht und nicht irgendwelche Altlasten, die eventuell vorher hineingeschrieben worden sind.

    Viele liebe Grüße
    The User