Hilfe bei Array und Pointer



  • Hallo Zusammen,

    ich bin ein C++ newbie und habe ein Problem mit Array und Pointer

    Ich habe folgenden Code:

    main.cpp

    #include <iostream>
    #include "TestArray.h"
    using namespace std;
    
    int main() {
    	::ttt::TestArray testArray;
    	char data[]="Beliebiger Array aus Datei";
    	int i=sizeof(data)/sizeof(char);
    	cout <<  i << endl;
    	testArray.test(data);
    	return 0;
    }
    

    TestArray.cpp

    #include "TestArray.h"
    #include <iostream>
    
    namespace ttt {
    
    TestArray::TestArray() {
    	// TODO Auto-generated constructor stub
    
    }
    
    TestArray::~TestArray() {
    	// TODO Auto-generated destructor stub
    }
    
    void TestArray::test(char* test){
    	int i=sizeof(test)/sizeof(char);
    	::std::cout<<i<<::std::endl;
    }
    
    } /* namespace ttt */
    

    TestArray.h

    #ifndef TESTARRAY_H_
    #define TESTARRAY_H_
    
    namespace ttt {
    
    class TestArray {
    public:
    	TestArray();
    	virtual ~TestArray();
    	void test(char* test);
    };
    
    } /* namespace ttt */
    #endif /* TESTARRAY_H_ */
    

    In der main wird mir noch die richtige Länge des Array's ausgegeben. In der Class TestArray methode test bekomme ich immer nur 8. Wenn ich das Richtig verstanden habe ist der Wert 8 die Länge des Zeigers. Wie kann ich so etwas zum Funktionieren bringen, dass ich in der Methode test auch die Funktionen des Array nutzen kann?

    Es ist sicher einfach aber für ein Neuling schwer.



  • mrno schrieb:

    Wie kann ich so etwas zum Funktionieren bringen, dass ich in der Methode test auch die Funktionen des Array nutzen kann?

    Das Array hat keine Funktionen. Wie du richtig erkannt hast, zerfällt ein übergebenes Array in einen Pointer. In der Funktion test() hast du also keine Informationen mehr über die Größe des Arrays. Der übliche Weg wäre, die Größe des Arrays manuell zu übergeben:

    void test(const char *s, std::size_t size)
    

    Es gibt aber noch eine Möglichkeit:

    template<std::size_t size>
    void foo(const char (&a)[size])
    {
      std::cout << "Size: " << size;
    }
    


  • Hallo Cooky451,

    danke für dein schnelle Lösung.

    Da die Information verloren geht habe ich noch eine Frage. Wie mache ich das wenn ich ein Array zurück geben will. Dass ist ja auch nur ein Pointer. Gibt es da auch eine Elegante Lösung ohne eine zweiter Methode mit der Länge abzufragen?



  • Arrays kann man nicht zurückgeben. Nimm std::array oder std::vector, je nach Fall.



  • mrno schrieb:

    Da die Information verloren geht habe ich noch eine Frage. Wie mache ich das wenn ich ein Array zurück geben will. Dass ist ja auch nur ein Pointer. Gibt es da auch eine Elegante Lösung ohne eine zweiter Methode mit der Länge abzufragen?

    Richtig erkannt, ein Array kannst du nicht zurückgeben. Schlechte Versuche wie

    char *foo()
    {
      char a[100];
      return a;
    }
    

    enden in undefiniertem Verhalten, da das Array a _nur_ innerhalb von foo() gültig ist. C++ bietet also keine direkte Möglichkeit, Arrays "per Value" zu übergeben bzw. zurückzugeben. PI hat die Lösung schon angemerkt, man packt das Array halt in eine Struktur. Dann geht's. std::vector/std::array wären solche Strukturen.


Log in to reply