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ückgabetypeninthaben.
-
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::arrayoderboost::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 einestd::out_of_rangewirft. 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