Hi,
ich schaue mir gerade C++ ein wenig an, sehr mächtig + sehr komplex (das erste bedingt wohl das zweite), gefällt mir aber ausgesprochen gut ☺
Habe ein kleines Problemchen mit Arrays als Wertparameter. In einer Funktion f, die ein Array feld als Wertparameter bekommt, möchte ich die Anzahl der Elemente des übergebenen Arrays ermitteln. Das berechne ich so: sizeof(feld) / sizeof(*feld). Das Problem ist aber, dass in der Funktion sizeof(feld) IMMER 4 zurückliefert. Im Hauptprogramm, wo das Array deklariert ist, liefert sizeof die richtige Grösse. Um das verständlicher zu machen, hier ist das Program (sonstiger Code rundherum ist gelöscht) :
#include <iostream> using namespace std; void f (int feld[]) { cout << "function f: " << "sizeof(feld) / sizeof(*feld) = " << sizeof(feld) << " / " << sizeof(*feld) << endl; } int main() { int arr[] = {4711, 69, 0}; cout << "main: " << "sizeof(arr) / sizeof(*arr) = " << sizeof(arr) << " / " << sizeof(*arr) << endl; f(arr); return 0; } /* Output des Programms: main: sizeof(arr) / sizeof(*arr) = 12 / 4 function f: sizeof(feld) / sizeof(*feld) = 4 / 4 Press Enter to continue! */
Ein Array-Name ist die Adresse des 1. Elements. Bei der Wert-Übergabe des Arrays an die Funktion würde ich mir erwarten, dass eine Kopie des GESAMTEN Arrays übergeben wird. Es wird aber in Wirklichkeit nur eine Kopie des POINTERS auf das Array übergeben! Der Aufruf sizeof liefert folglich nur die Grösse eines Pointers, nicht die Grösse des Array selbst. Offensichtlich haben die C++ Autoren das Klassenkonzept bis in allerletzte Konsequenz durchgehalten: Nachdem ein Array ein Pointer auf das 1. Element ist, und ein Pointer ein Built-in-Datentyp ist, gibts folglich kein Konstruktor, der das Objekt (= das Array) bei der Wertübergabe kopieren/initialisieren würde... ☹
Frage 1: Gibt es eine Möglichkeit, die Grösse des Arrays in der Funktion festzustellen ? Vom Aufrufer der Funktion zu verlangen, dass er die Grösse als Parameter mitgibt, möchte ich -wenn möglich- vermeiden.
Frage 2: Wie würde man eine Referenz an ein Array als Parameter übergeben? Wenn ich im o.g. Beispiel die Funktion so definiere
void f (int& feld[]) { // code}
beschwert sich der Compiler:
/home/pavel/IT/project/accelerated_cpp/kap10/problem/src/problem.cpp:5: Fehler: Deklaration von »feld« als array of references
Der ganze Sinn von call-by.-value und call-by-reference ist damit bei Arrays ausgehebelt: Ich bekomme IMMER nur eine REFERENZ auf das Original. Oder ist mir da etwas Wesentliches an C++ entgangen ????