Array



  • Hallo,

    ich möchte ein Array aus 3D-Punkten anlegen

    C3Point():x(0.0F), y(0.0F), z(0.0F){}
    C3Point(const float _x, const float _y, const float _z): x(_x), y(_y), z(_z) {}
    
    void C3Point::drehX(float winkel){
    ...
    
    void C3Point::setX(float _x){x=_x;}
    ...
    

    Einen einzelnen Punkt kann ich ja mit

    C3Point P(1.0F,1.0F,1.0F);
    

    anlegen.
    Ein Array lässt sich mit

    array<C3Point^>^ par = gcnew array<C3Point^>(10);
    

    erstellen.
    Wie kann ich jetzt in diesem Array Werte zuweisen?
    Ich habe schon verschiedene Varianten probiert

    par->SetValue((1.0F,1.0F,1.0F),0);
    par[0]->setX(1.0F);
    

    Zur Laufzeit erhalte ich dann den Fehler:
    "Eine nicht behandelte Ausnahme des Typs "System.InvalidCastException" ist in mscorlib.dll aufgetreten.
    Zusätzliche Informationen: Das Objekt kann nicht in diesem Arraytyp gespeichert werden."

    Wo liegt mein Denkfehler?

    Andreas



  • Die Fehlermeldung passt nicht so recht zum gezeigten Code.
    Dennoch als Hinweis: mit gcnew array<C3Point^>(10); hast Du das Array erzeugt, jedoch noch keine Elemente! Erzeuge diese auch!

    Edit:
    1. Nimm die Variante zwei - dann kommt beim aktuellen Code eine NullRef. Exception. Diese wird behoben, indem Du eben die Objekte im Array erzeugst (ursprüngliche Antwort).
    2. Die Fehlermeldung die du zitiert hast wird höchstwahrscheinlich von Variante 1 stammen, weil Du ein C3Point übergibst, aber ein C3Point^ (d.h. mit gcnew erzeugt) erwartetet wird.



  • Die Fehlermeldung ist bei beiden Varianten identisch. Wie rufe ich den Konstruktor in diesem Fall für ein einzelnes Array-Element auf?



  • Hier mal ein kleines Bsp.

    ref class Point3D
    {
    public:
        Point3D()
            : x_(0)
            , y_(0)
            , z_(0)
        {
        }
    
        Point3D(int x, int y, int z)
            : x_(x)
            , y_(y)
            , z_(z)
        {
        }
    
        property int X
        {
            int get() { return x_; }
            void set(int value) { x_ = value; }
        }
    
        property int Y
        {
            int get() { return y_; }
            void set(int value) { y_ = value; }
        }
    
        property int Z
        {
            int get() { return z_; }
            void set(int value) { z_ = value; }
        }
    
        void setCoordinates(int x, int y, int z)
        {
            x_ = x;
            y_ = y;
            z_ = z;
        }
    
    private:
        int x_;
        int y_;
        int z_;
    };
    
    int main(array<System::String ^> ^args)
    {
        array<Point3D^>^ myPoints = gcnew array<Point3D^>(3);
    
        for (int index = 0; index < myPoints->Length; ++index)
        {
            myPoints[index] = gcnew Point3D(index, 0, 0);
        }
    
        for each (Point3D^ point in myPoints)
        {
            Console::WriteLine(String::Format("Point: x = {0}, y = {1}, z = {2}", point->X, point->Y, point->Z));
        }
    
        return 0;
    }
    


  • ...vielen Dank, klappt.
    Wenn man es liest, ist es dann immer ganz logisch. 🙂


Anmelden zum Antworten