Array-Übergabe an eine Funktion - Wie?



  • Moin, moin.
    Bin momentan total vernagelt!
    Grundsatzfrage: Wie übergebe ich einer Funktion einen Array und bzw. wie überrede ich diese Funktion, mir einen Array zurück zu liefern?

    #include <fstream.h>   //wg. der Ausgabe in eine Datei
    #include "anagramm.h"  //Funktionsdeklaration	
    
    char Puffer[255];
    char arrDateiname[12];
    char arrWort[13];
    int Laenge;
    int Anzahl;
    int Zeichenzahl;
    
    int main()
    	{
    	//cout << "Dateiname nach DOS-Regeln? \n";
    	//cin.get(arrDateiname,11);
    	//cout << "Angegebener Dateiname: " << arrDateiname << "\n\n";
    

    Das funktioniert irgendwie nicht (deshalb als Kommentar): Springt nach der Ausgabe des Dateinamens sofort zu return 0; ohne eine Eingabe des Wortes zu Ermöglichen.

    cout << "Geben Sie ein Wort ein (max. 12 Stellen!):\n";
    	cin.get(arrWort,13);
    	cout << arrWort << "\n";
    	Laenge = sizeof(arrWort);
    	Zeichenzahl= 0;
    	for (Anzahl = 0; Anzahl < Laenge; Anzahl++)
    		if (arrWort[Anzahl] > 0)
    		cout << arrWort[Anzahl];
    		else
    		break;
    		Zeichenzahl = Anzahl;
    		cout << "\n" << "Anzahl der Zeichen: " << Zeichenzahl <<"\n";
    		cout << arrWort << "\n";
    		// An dieser Stelle werden die ermittelten Werte an die Funktion
    		// "Anagrammermittlung" übergeben (theoretisch!).
    		Anagrammermittlung(arrWort, Zeichenzahl);
    	return 0;
    	}
    

    Die momentane Funktionsdeklaration heißt:
    char Anagrammermittlung(char arrWort, int Zeichenzahl);

    Ziel: Ich will die Ausgabe von diesem Programm hier:

    #pragma warning(disable: 4786)
    
    #include <iostream>
    #include <vector>
    #include <string>
    #include <algorithm>
    #include <functional>
    
    using namespace std ;
    
    void main()
    {
        typedef vector<string> StrVector ;
        typedef StrVector::iterator StrVectorIt ;
        typedef ostream_iterator<string> StrOstreamIt;
    
    	int VECTOR_SIZE = 3 ;
    
        StrVector arrWort(VECTOR_SIZE) ;
        StrVectorIt Start, Ende, Zeichen ;
        StrOstreamIt Ausgabe(cout, " ") ;
    
        Start = arrWort.begin() ;
        Ende = arrWort.end() ;
    
        arrWort[0] = "1" ;
        arrWort[1] = "2" ;
        arrWort[2] = "3" ;
        //arrWort[3] = "4" ;
        //arrWort[4] = "5" ;
        //arrWort[5] = "6" ;
        //arrWort[6] = "7" ;
        //arrWort[7] = "8" ;
    	//arrWort[8] = "9" ;
    
        cout << "Zeichenkette vor der Errechnung der Permutationen: \n" << "Die Eingabe lautete: " ;
    	for(Zeichen = Start; Zeichen != Ende; Zeichen++)
            cout << *Zeichen << " ";
    		cout << "\n\n" ;
    
    	cout << "Ausgabe aller moeglichen Permutationen: " << "\n" ;
    	while ( next_permutation(Start, Ende) )
    		{
    		copy(Start, Ende, Ausgabe) ;
    		cout << "\n";
    		}
    }
    

    von der Eingabe her verändern und die Ausgabe in eine Datei umleiten um sie Drucken zu können.

    Danke schon mal!

    P.S.: Es mag sein, daß es anders/einfacher etc. geht. Aber ich möchte als Gelegenheits-CPP'ler gerne eigene Wege ausprobieren.

    mfg

    AranankA



  • Arrays übergibst du nicht als 'char', sondern als 'char[]' (oder 'char*'). (zurückliefern kannst du sie nur als 'char*', wobei du aufpassen mußt, daß der entsprechende Speicherbereich nach Funktionsende noch gültig ist).

    (PS: Und die Länge eines eingegebenen Wortes bestimmst du besser mit strlen)



  • Probiere ich sofort ...
    strlen (#include <string.h>) mag er nicht. Was spricht gegen sizeof?

    mfg

    AranankA



  • AranankA schrieb:

    Probiere ich sofort ...
    strlen (#include <string.h>) mag er nicht.

    Wie äußerst sich "mag er nicht"?

    Was spricht gegen sizeof?

    Das wird zur Compilezeit ausgewertet - also zählt es auch Leerfelder mit, wenn deine Eingabe kürzer als 13 Zeichen war.



  • Hatte einen Syntaxfehler drin, jetz klappt "strlen". Darum nun so:

    #include <fstream.h>	//wg. der Ausgabe in eine datei
    #include "anagramm.h"	//Funktionsdeklaration	
    #include <string.h>
    
    char Puffer[255];
    char arrDateiname[12];
    char arrWort[13];
    int Laenge;
    int Anzahl;
    
    int main()
    	{
    	       //cout << "Dateiname nach DOS-Regeln? \n";
    	       //cin.get(arrDateiname,11);
    	       //cout << "Angegebener Dateiname: " << arrDateiname << "\n\n";
    //Springt sofort zu return 0; und beendet das Programm
    
    	cout << "Geben Sie ein Wort ein (max. 12 Stellen!):\n";
    	cin.get(arrWort,13);
    	cout << arrWort << "\n";
    	Laenge = strlen(arrWort);
    		// An dieser Stelle werden die ermittelten Werte an die Funktion
    		// "Anagrammermittlung" übergeben. (theoretisch!)
    		Anagrammermittlung(arrWort[], Zeichenzahl);
    	return 0;
    	}
    

    Dafür nun: Keine Eingabe mehr möglich, wenn erste Eingabe ausgewertet &
    Keine Übergabe von Werten, nur Fehlermeldungen von wegen "error C2059: Syntaxfehler : ']'
    Irgendwie klappt das nicht. Momentane Deklaration:
    int Anagrammermittlung(char arrWort[], int Zeichenzahl);
    Zurückgeben soll die Funktion nix; die Ausgabe erfolgt von ihr aus.

    mfg

    AranankA



  • AranankA schrieb:

    Grundsatzfrage: Wie übergebe ich einer Funktion einen Array und bzw. wie überrede ich diese Funktion, mir einen Array zurück zu liefern?

    Grundsatzantwort: am besten gar nicht. Das ist ernst gemeint. Du erleichterst Dir Dein Programmiererleben ungemein, wenn Du z.B. statt der Arrays

    char arrDateiname[12];
    char arrWort[13];
    

    std::string's benutzt. Übergeben werden diese dann mit

    void Anagrammermittlung( const std::string& wort );
    

    Um die ganzen Längen-Informationen wie z.B. 'Anzahl', 'Zeichenanzahl' usw. brauchst Du Dich nicht mehr kümmern. Die fallen einfach weg.

    Gruß
    Werner



  • Das klingt gut und wird sofort angewendet. Langsam war ich nämlich am Verzweifeln.

    Bleibt noch die Frage: Warum kann ich nach der Eingabe des Dateinamens das eigentliche Wort nicht mehr eingeben (sieh die auskommentierte Stelle).
    Das Programm beendet sich nach der Eingabe selber.

    int main()
        {
    //cout << "Dateiname nach DOS-Regeln? \n";
    //cin.get(arrDateiname,11);
    //cout << "Angegebener Dateiname: " << arrDateiname << "\n\n";
    
    //Springt sofort zu return 0; und beendet das Programm
    //Somit wird:
    
        cout << "Geben Sie ein Wort ein (max. 12 Stellen!):\n"; //nie erreicht.
        cin.get(arrWort,13);
        cout << arrWort << "\n";
    .
    .
    .
    

    Frage nur, warum?

    mfg

    AranankA



  • AranankA schrieb:

    Bleibt noch die Frage: Warum kann ich nach der Eingabe des Dateinamens das eigentliche Wort nicht mehr eingeben (sieh die auskommentierte Stelle).
    Das Programm beendet sich nach der Eingabe selber.

    nicht ganz! Dein Programm läuft 'nur' über das nächste 'get' einfach drüber weg, liest keine Daten ein und das war's dann. Das liegt daran, dass

    basic_istream<charT,traits>& get(char_type* s, streamsize n)
    

    zu den sogenannten 'unformatted input functions' gehört. Ich benutze die Dinger nicht, daher mußte ich auch erst nachschauen.
    Diese Methode beendet das Lesen u.a. dann, wenn sie auf ein LF (ASCII-Code: 0xa; Zeilenende) trifft. Und zwar - und das ist entscheidend - ohne (!) das LF zu lesen. D.h. jeder weiter Aufruf von get hört sofort wieder mit dem Lesen auf, weil er auf das LF Deiner ersten Eingabe stößt und kommt mit 0 Bytes zurück.

    Gruß
    Werner



  • Du könntest ja statt get() getline() verwenden, das schluckt afaik das \n am Ende der Eingabe.



  • THX. Dann mache ich es mit Visual.

    mfg

    AranankA


Anmelden zum Antworten