arrays...
-
Ich habe folgendes Problem:
public ref class Datei : System::Windows::Forms::TabPage { Datei(GRAFIKTYP Typ) {} //... }; public ref class DateiHandler : System::Windows::Forms::TabControl { public: array<Datei^>^ Dateien; void NewDatei(GRAFIKTYP Typ) { Dateien->Resize(Dateien, Dateien->Length+1); //Hier kommt der Runtime-Error Dateien[Dateien->Length-1] = gcnew Datei(Typ); this->TabPages->Add(Dateien[Dateien->Length-1]); } };
Es kommt eine NullReferenceException an der o.g. Stelle. Das Array muss natürlich erstmal instanziiert werden, da man es ja leider nur als *zensiert* Referenz nutzen darf.
folgendes geht nicht (im Konstruktor):
Dateien = {};
Es gibt dann folgende Compilerfehler:
error C2059: Syntaxfehler: '{'
error C2143: Syntaxfehler: Es fehlt ';' vor '{'Wie kann ich entweder die Referenz auf das Array loswerden (Das wäre am besten...) oder das Array als leeres Array instanziieren?
-
Führe dir mal die Syntax von arrays unter C++/CLI zu Gemüte, hier mal ein Anfang:
http://msdn.microsoft.com/en-us/magazine/cc163681.aspx
-
Danke, da stehts drin... ICh hatte mich einfach an die Beispiele dieses MSDN-Artikels gehalten: http://msdn.microsoft.com/de-de/library/system.array.aspx
-
Ich habe nun ein neues Problem mit Arrays und der Funktion Find.
Ich erhalte folgenden Fehler:
error C2784: "System::Array::Find(cli::array<Type,dimension> ^,System::Predicate<T> ^)": generic-Argument für "System::Predicate<T> ^" konnte nicht von "MLText" hergeleitet werden
Das ist der gekürzte Code:
public ref struct MLText { System::String^ String; System::String^ Name; MLText(System::String^ name, System::String^ string) { Name = name; String = string; } bool operator==(MLText^ Text) { return(Name == Text->Name); } }; public value struct Foo { array<MLText^>^ Texts; void Func() { System::String^ Str1, Str2; //... Texts->Find(Texts, MLText(Str1, ""))->String = Str2; //In dieser Zeile kommt der o.g. Fehler } };
Was fehlt/ist falsch?
Danke schon im Voraus!
-
Du erhälst ein Fehler, weil das zweite Argument von Array::Find(..) ein Objekt vom Typ System::Prediacte<T> sein soll. Du übergibts aber ein Objekt vom Type MLText. Das ist einfach nicht kompatibel.
Guck hier was Prediacte<T> für ein Typ ist (Hinweis, es ist ein Delegate):
http://msdn.microsoft.com/en-us/library/bfcke1bz.aspxSimon
-
Die MSDN hatte ich bereits zu diesem Typ befragt. Leider kann ich keinen relevanten Unterschied zwischen dem unten angegebenen Beispiel und meines Codes finden...
Das ist einfach nicht kompatibel
Wie kriege ich es denn kompatibel?
-
Der relevant Unterschied ist simpel: Ein Prediacte<T> IST KEIN MLText
Du MUSST ein Predicate<T> übergeben!
Simon
-
Aber wie erzeuge ich das benötigte Predicate?
Das...
System::Predicate<MLText>(MLText(y, ""))
...geht jedenfalls nicht.
-
Hier ein kleines Bsp:
using namespace System; ref class MyPredicate { public: MyPredicate(String^ text) : _text(text) { } bool match(String^ otherText) { return otherText == _text; } private: String^ _text; }; int main(array<System::String ^> ^args) { array<String^>^ texts = gcnew array<String^>(3); texts[0] = L"test"; texts[1] = L"hallo"; texts[2] = L"world"; MyPredicate^ myPredicate = gcnew MyPredicate(L"hallo"); String^ str = Array::Find(texts, gcnew Predicate<String^>(myPredicate, &MyPredicate::match)); return 0; }
-
Danke, das war sehr hilfreich... Jetzt kompiliert es