Deferenzieren oder so...



  • Weil Du nullptr an eine Stelle übergibst, wo ein gültiges Objekt erwartet wird.

    Kurz im alten C++ (^^)

    void t(T *t)
    {
     t->test();
    }
    
    T * tx = NULL;
    t(tx);
    

    Du bekommst z.B. bei safe und dynamic cast nullptr wenn das Ergebnis nicht passt. Trotz managed musst Du da aufpassen.



  • Ich bekomm die NullReferenceExeption wenn ich file mit einem "string" initialisiere
    Ich hab nirgendwo irgendwelche casts oder nullptrs -.-



  • public:sreader32(String^    infile){ 
    file = gcnew String(L"..."); 
    file = infile; 
    
    LastError = after_initialize; 
    ErrorLine = -1; 
    }
    

    An welcher Stelle gibt es denn nun hier die Exception ?
    Abgesehen davon das file = gcnew String(L"..."); unsinn ist,
    zeigt der Quellcode keine Stelle an der es eine Exception geben könnte.



  • Ich hab gemerkt, das da die exception nicht auftaucht,
    Die exception kommt erst, wenn ich versuche, file zu setzen

    Das das mit "..." Unsinn ist weiß ich auch aber was soll ich tun ich hab erst einmal alles probiert 😉



  • Helfen kann man nur den Menschen, die hilfe haben wollen.

    Bei Dir gehe ich davon aus, das Du keine Hilfe suchst sondern nur ein registrierter Troll bist.

    Wenn Du heraus gefunden hast was Quellcode bedeutet (Der Link könnte Dir helfen, das noch in diesem Leben heraus zu finden:
    http://de.wikipedia.org/wiki/Quellcode )

    dann poste mal den Quellcode der die Probleme verursacht.

    ich tun ich hab erst einmal alles probiert

    Naja, versuch doch mal mit nem Hammer auf die Tastatur zu schlagen, vllt. sind Deine Quellcodezeilen einfach nicht fest genug. Gegen abstürze hilft manchmal auf ein Strick. Du könntest natürlich auch versuchen Deinen DVD Player als Opfer darzulegen, das Dein Compiler nicht mehr so launisch ist und einfach Exceptions wirft wo keine sein können.



  • Is nicht mehr nötig ich habs jetzt selbs herausgefunden
    Kuddelbaer, bleib lieber mal auf dem Teppich es gibt halt auch Leute dies net so toll können wie du 😉

    Großes Lob!!!



  • Ich weiß nicht wo das Problem ist sinvoll Quellcode zu posten, vorallem wenn man angibt, das man von C++ auf C++/CLI umsteigt.

    public:sreader32(String^    infile){ 
    file = gcnew String(L"..."); 
    file = infile; 
    
    LastError = after_initialize; 
    ErrorLine = -1; 
    }
    

    Mal als Beispiel von schlechten Quellcodeauszügen. Denn das beschriebene Problem:

    Ich bekomm die NullReferenceExeption wenn ich file mit einem "string" initialisiere

    Wird im Quellcode nicht gezeigt.

    Ich denke das es für einen Umsteiger von C++/CLI nicht zu komplex sein sollte, die beschriebene Quellcodezeile zu Posten.

    Vllt möchtest Du das Problem (mit Sinvollem Quellcodeauszug) noch für andere User, die eine Lösung für ein ähnliches Problem suchen, Posten.



  • SheetReader::sreader32^	sreader;sreader =gcnew SheetReader::sreader32();
    

    Dürfte euch ja wohl kein Problem sein, ich hab erst nur auf den Code vom WinForms Designer gekuckt und da macht der das nicht (direkt)

    War aber auch logisch, ich greif ja auf eine Adresse im GCSpeicher zu und die ist ja ohne gcnew nicht gefüllt ist, anscheinend macht das der Designer bei den WinForms wo anders -.-

    Aber egal jetzt is gutm, es funktioniert



  • Im Header der Form findest Du eine Methode InitializeComponent - da werden die Objekte angelegt, initalisiert und ggf. gefüllt.



  • Der Vollständigkeit sei erwähnt:

    Der Operator % wird für managed Referenzen verwendet.
    Soweit alles klar:

    void foo(bar & param);
    

    wird somit zu:

    System::Void foo(bar % param);
    

    Während man nun im reinen C++ mit & die Adresse generiert um zu T* zu kommen, benötigt es in C++/CLI den Operator % :

    ref struct test
    {
    	System::Int32 x;
    };
    
    void foo(test ^ xy)
    { xy->x = 2; }
    
    int main(array<System::String ^> ^args)
    {
    	test h ;         // Instanz von test anlegen
    	test ^ b = %h;   // Adresse von h organisieren
    	foo(b);          // foo mit der Adresse von h aufrufen
    }
    

    Man sieht nun, das mittels % die Referenz verwendet wird.
    Es wurde also konsequent & mit % ersetzt.

    Bei den Zeigern sieht dies leider ein wenig anderst aus.
    Zur dereferenzierung hätte ich nun ^ erwartet:

    test ^ t = gcnew test;
             (^t).x = 2;
    

    Das ^ wurde ja eingeführt um gegenüber der Vorversion deutlich zu
    machen, das es ein Manged Zeiger ist.

    Zur dereferenzierung wird jedoch der operator* benötigt:

    test ^ t = gcnew test;
             (*t).x = 2;
    

    (delete macht ja auch keinen Unterschied mehr zwischen ^ und * Zeigern).

    Um kopien zu erzeugen, muss der Konstruktor und Kopierkonstruktor manuell angelegt werden (dieser wird entgegen unmanaged Klassen den Fehlermeldungen nach nicht selbst angelegt).

    ref struct test
    {
    	System::Int32  x;
    	test() : x(0)
    	{}
    
    	test(const test % t)
    	{
    		x = t.x;
    	}
    };
    
    void foobar(test  xy)
    {
    	xy.x = 2;
    }
    
    int main(array<System::String ^> ^args)
    {
    	test ^ t = gcnew test;
    	test % a = test();
    
    	test h ;
    	test ^ b = %h;
    
    	// bar(test )
    	foobar(*t);  // t = test ^
    	foobar( a);  // a = test %
    	foobar( h);  // h = test
    	foobar(*b);  // b = test ^
    
    	return 0;
    }
    

    Mal ein komplettes Beispiel zum spielen und nörgeln🤡

    ref struct test
    {
    	System::Int32  x;
    	test() : x(0)
    	{}
    
    	test(const test % t)
    	{
    		x = t.x;
    	}
    };
    
    void foo(test ^ xy)
    {
    	xy->x = 2;
    }
    
    void bar(test % xy)
    {
    	xy.x = 2;
    }
    
    void foobar(test  xy)
    {
    	xy.x = 2;
    }
    
    int main(array<System::String ^> ^args)
    {
    	test ^ t = gcnew test;
    	test % a = test();
    
    	test h ;
    	test ^ b = %h;
    
    	// foo(test ^)
    	foo( t);  // t = test ^
    	foo(%a);  // a = test %
    	foo(%h);  // h = test
    	foo( b);  // b = test ^
    
    	// bar(test %)
    	bar(*t);  // t = test ^
    	bar( a);  // a = test %
    	bar( h);  // h = test
    	bar(*b);  // b = test ^
    
    	// bar(test )
    	foobar(*t);  // t = test ^
    	foobar( a);  // a = test %
    	foobar( h);  // h = test
    	foobar(*b);  // b = test ^
    
    	return 0;
    }
    

Anmelden zum Antworten