Problem mit forschleife



  • Hallo,
    ich habe ein kleines problem : diese forschleife gibt nur das erste Element aus, wieso? Ich hätte gern das es alle elemente ausgibt...

    void ausgabe(float a[])
    {
    int la = (int) sizeof(a)/sizeof(a[0]);
    for(int i = 0; i < la; ++i )
    {
    cout << a[i] << endl;
    }

    }

    void main(void)
    {
    float a[5];
    a[0] = 1;
    a[1] = 2;
    a[2] = 3;
    a[3] = 4;
    a[4] = 5;

    ausgabe(a);
    }

    gruß

    exeC101



  • Verwende bitte [cpp]-Tags (erste weisse Schaltfläche unter den Smileys).

    Wenn du Arrays auf diese Weise an Funktionen weitergibst, kannst du intern nicht mehr auf die Grösse zugreifen. Der sizeof -Operator gibt dir dann die Grösse des Zeigers an. Gib die Anzahl Elemente als zusätzlichen Parameter mit, oder verwende Container anstelle von rohen Arrays (das rät sich sowieso).

    Im Weiteren ist void main() nicht gültiges Standard-C++, main() muss den Rückgabetypen int haben.



  • ah ok vielen dank ich versuchs mal.

    gruß
    Exec



  • Hier mal alle 3 Möglichkeiten:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    template <unsigned int N>
    void print(float (&a)[N])
    {
    	for (unsigned int i = 0; i < N; ++i)
    	{
    		cout << a[i] << endl;
    	}
    }
    
    void print2(float *a, unsigned int size)
    {
    	for (unsigned int i = 0; i < size; ++i)
    	{
    		cout << a[i] << endl;
    	}
    }
    
    void print3(const vector<float> &a)
    {
    	for (unsigned int i = 0; i < a.size(); ++i)
    	{
    		cout << a[i] << endl;
    	}
    }
    
    int main()
    {
    	float a[4] = {0, 0, 0, 0};
    
    	print(a);
    
    	print2(a, sizeof(a) / sizeof(a[0]));
    
    	//std::vector
    	vector<float> vec_a;
    	vec_a.push_back(0);
    	vec_a.push_back(0);
    	vec_a.push_back(0);
    	vec_a.push_back(0);
    	print3(vec_a);
    
    	cin.get();
    }
    

    Die erste ist unflexibel, die dritte ist ein wenig "teurer", weil der Speicher vom Heap kommt. Mit der zweiten Variante ist man oft gut beraten, jedoch muss man sehr gut aufpassen, was man als Größe übergibt. Das nimmt einem std::vector natürlich ab (und dessen Größe ist dynamisch).



  • Vierte Möglichkeit: std::tr1::array oder boost::array .

    Bietet alle Möglichkeiten eines Arrays, unterstützt darüber hinaus auch Kopiersemantik und das Iteratoren-Konzept und merkt sich die Grösse. Im Debug-Modus helfen Assertions, ungültige Indizes zu vermeiden. Im Releasemodus hat man dafür at() , das einem eine std::out_of_range wirft. Und das alles für keinen bis minimalen Overhead.

    Tönt verlockend, oder? 😉
    Hier mal ein Anwendungsbeispiel:

    typedef std::tr1::array<int, 4> Array;
    
    Array Arr = {1, 3, 4, 7};         // Aggregat-Initialisierungsliste
    Array Arr2 = Arr;                 // Array kopieren
    Arr[2] = 0;                       // Zugriff über operator[]
    
    for (Array::iterator i = Arr.begin(); i != Arr.end(); ++i)
        *i += 2;                      // Iterator-Layout
    
    Arr2 = Arr;                       // Zuweisung
    std::size_t Size = Arr.size();    // Grösse abfragen
    Arr.assign(37);                   // Alle Elemente auf 37 setzen
    Array::reference Ref = Arr.at(1); // Typedefs
    

Anmelden zum Antworten