string array als reference übergeben?



  • Hallo ich möchte einen String-Array mit 2 Dimensionen als reference übergeben.

    #include <iostream>
    #include <string.h>
    
    using namespace std;
    
    void SetName(string& name[5][2])
    {
    	name[0][0] = "Nachname 1";
    	name[0][1] = "Vorname 1";
    
    	name[1][0] = "Nachname 2";
    	name[1][1] = "Vorname 2";
    
    	name[2][0] = "Nachname 3";
    	name[2][1] = "Vorname 3";
    
    	name[3][0] = "Nachname 4";
    	name[3][1] = "Vorname 4";
    
    	name[4][0] = "Nachname 5";
    	name[4][1] = "Vorname 5";
    }
    
    int main()
    {
    	string name[5][2];
    
    	SetName(name);
    
    	for(int x = 0; x < 5; x++)
    	{
    		cout << name[x][0] << endl;
    		cout << name[x][1] << endl;
    	}
    }
    

    Wenn ich das compilieren möchte bekomme ich einen haufen Fehler

    Fehler	1	error C2234: 'name': Arrays aus Verweisen sind unzulässig	d:\dokumente\visual studio 2008\projects\c++\test\testname\testname\testname.cpp	6	testName
    Fehler	2	error C2440: '=': 'const char [11]' kann nicht in 'std::string *' konvertiert werden	d:\dokumente\visual studio 2008\projects\c++\test\testname\testname\testname.cpp	8	testName
    Fehler	3	error C2440: '=': 'const char [10]' kann nicht in 'std::string *' konvertiert werden	d:\dokumente\visual studio 2008\projects\c++\test\testname\testname\testname.cpp	9	testName
    Fehler	4	error C2440: '=': 'const char [11]' kann nicht in 'std::string *' konvertiert werden	d:\dokumente\visual studio 2008\projects\c++\test\testname\testname\testname.cpp	11	testName
    Fehler	5	error C2440: '=': 'const char [10]' kann nicht in 'std::string *' konvertiert werden	d:\dokumente\visual studio 2008\projects\c++\test\testname\testname\testname.cpp	12	testName
    Fehler	6	error C2440: '=': 'const char [11]' kann nicht in 'std::string *' konvertiert werden	d:\dokumente\visual studio 2008\projects\c++\test\testname\testname\testname.cpp	14	testName
    Fehler	7	error C2440: '=': 'const char [10]' kann nicht in 'std::string *' konvertiert werden	d:\dokumente\visual studio 2008\projects\c++\test\testname\testname\testname.cpp	15	testName
    Fehler	8	error C2440: '=': 'const char [11]' kann nicht in 'std::string *' konvertiert werden	d:\dokumente\visual studio 2008\projects\c++\test\testname\testname\testname.cpp	17	testName
    Fehler	9	error C2440: '=': 'const char [10]' kann nicht in 'std::string *' konvertiert werden	d:\dokumente\visual studio 2008\projects\c++\test\testname\testname\testname.cpp	18	testName
    Fehler	10	error C2440: '=': 'const char [11]' kann nicht in 'std::string *' konvertiert werden	d:\dokumente\visual studio 2008\projects\c++\test\testname\testname\testname.cpp	20	testName
    Fehler	11	error C2440: '=': 'const char [10]' kann nicht in 'std::string *' konvertiert werden	d:\dokumente\visual studio 2008\projects\c++\test\testname\testname\testname.cpp	21	testName
    Fehler	12	error C2664: 'SetName': Konvertierung des Parameters 1 von 'std::string [5][2]' in 'std::string *[][2]' nicht möglich	d:\dokumente\visual studio 2008\projects\c++\test\testname\testname\testname.cpp	28	testName
    Fehler	13	error C2679: Binärer Operator '<<': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'std::string' akzeptiert (oder keine geeignete Konvertierung möglich)	d:\dokumente\visual studio 2008\projects\c++\test\testname\testname\testname.cpp	32	testName
    Fehler	14	error C2679: Binärer Operator '<<': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'std::string' akzeptiert (oder keine geeignete Konvertierung möglich)	d:\dokumente\visual studio 2008\projects\c++\test\testname\testname\testname.cpp	33	testName
    

    warum const char?? da ist doch kein char...



  • Lass einfach mal das & hinter string weg, d.h. du übergibst nur das Array direkt, also so:

    #include <iostream>
    #include <string> //string.h gibt es nicht
    
    using namespace std;
    
    void SetName(string name[5][2])
    {
        name[0][0] = "Nachname 1";
        name[0][1] = "Vorname 1";
    
        name[1][0] = "Nachname 2";
        name[1][1] = "Vorname 2";
    
        name[2][0] = "Nachname 3";
        name[2][1] = "Vorname 3";
    
        name[3][0] = "Nachname 4";
        name[3][1] = "Vorname 4";
    
        name[4][0] = "Nachname 5";
        name[4][1] = "Vorname 5";
    }
    
    int main()
    {
        string name[5][2];
    
        SetName(name);
    
        for(int x = 0; x < 5; x++)
        {
            cout << name[x][0] << endl;
            cout << name[x][1] << endl;
        }
    }
    

    Was dein Code nämlich machen würde, wenn er funktionieren würde, wäre, dass du ein Array von Referenzen auf strings übergibst. Und wie der Compiler dir schon richtig sagt, gibt es keine Arrays von Referenzen.

    Du musst allerdings auch gar keine Referenz verwenden, da Arrays bei Übergabe an Funktionen immer implizit in Zeiger umgewandelt werden (d.h. einen Zeiger auf das erste Element, das heißt, du übergibst quasi einen Zeiger auf ein 2-elementiges Array von String), das nennt sich Decay. Du könntest also statt

    void SetName(string name[5][2])
    

    auch

    void SetName(string (*name)[2])
    

    schreiben.

    Hoffe, das hilft etwas

    Felix

    EDIT: Was mit const char[] gemeint ist: String-Literale, das heißt Ausdrücke der Form "text" sind intern vom Typ const char[], bzw. (wie oben schon angedeutet, Arrays und Zeiger sind in vielen Fällen "ähnlich") const char*. Und der Compiler beschwert sich, dass er die const char[]-Literale nicht in Zeiger auf strings umwandeln kann, weil er anscheinend deinen an sich falschen Typ von string &name[5][2] falsch interpretiert und dann an Zeiger auf strings denkt...


  • Mod

    oder alternativ eine Referenz auf ein Array benutzen:

    void SetName(string (&name)[5][2]);
    


  • Stimmt, campers Lösung ist wahrscheinlich näher an dem, was du dir vorgestellt hast, wenn du eine Referenz benutzen möchtest... Schade, dass mir das nicht eingefallen ist :D, ist wohl doch schon etwas zu spät geworden.

    Felix



  • Danke es geht.


Anmelden zum Antworten