Deferenzieren oder so...
-
Jetzt kann ichs nicht einfach umgehen
Ich möchte Objekte von außen durch meine Klasse steuern
Dafür möchte ich im Construktor der Klasse Handles übergeben
Nur sind das nur wieder Referenzen
Ich hab da was von Dereferenzieren gehört (mit Dereferenzierungsoperator '%')
Nur hab ich leider keine Ahnung davon, also wärs nett wenns mir jemand mal erklären könnte, vllt n kleines CodebeispielIch hoffe ihr versteht was ich brauch
PS.:
Und kommt mir ja nicht wieder mit "Wenn dus net kannst, solltest du vielleicht eine einfachere Sprache wählen wie C++ oder VisualBasic"
Ich steig gerade erst von C++ auf C++/CLI um und brauch jetzt erstmal die Hilfe
-
Naja, was Du aber immer noch nicht gelernt hast:
Zeig mal Code!
Zeiger kannst Du mit * dereferenzieren, Referenzen müssen nicht dereferenziert werden. (Das ist das gleiche wie im reinen C++ mit * und &.
^ entspricht dabei * und % entspricht dabei &)
-
^ und % sind dann im GC-Heap
Und wenn ich dann eine ref class mit ^ im GC-Speicher erstelle, dann ist das sozusagen das selbe wie wenn ich eine "normale" class mit * im "normalen" Speicher erstelleAber was heißt jetzt Null-Referenz
Trotz allem, ich hab immer wieder NullReferenceExeptions und versteh nicht so ganz warumpublic:sreader32(String^ infile){ file = gcnew String(L"..."); file = infile; LastError = after_initialize; ErrorLine = -1; }
-
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 setzenDas 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 duGroß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; }