String^ signtmp = "\""; array<String^>^ fbnum; array<String^>^ fbname; array<String^>^ fbtemp; char divide; StreamReader^ temp = File::OpenText("F:\\Schule\\Mobile Kommunikationssysteme\\Wipro\\#Praktiumsthema\\Telefonbuch2.txt"); String^ entry; entry = temp->ReadToEnd(); int write = 0; array<Char>^ centry = entry->ToCharArray(0,entry->Length); for(int i=0;i<entry->Length;i++) { char entrtmp = centry[i]; if(Convert::ToString(centry[i])->Contains(signtmp)) { if(write == 4) write = 1; else write++; if(write == 1) # fbnum[i] = Convert::ToString(centry[i]); else if(write == 3) fbname[i] = Convert::ToString(entrtmp); } else if(write == 1) fbnum[i] = Convert::ToString(entrtmp); else if(write == 3) fbname[i] = Convert::ToString(entrtmp); } Aaaalso... Dieser Code hat die Aufgabe, aus dem Char-Array centry die " herauszufinden. Beim Ersten gefundenen werden alle folgenden Zeichen in fbnum aufgezeichnet und beim Zweiten gefundenen wird die Aufzeichnung beendet. Beim Dritten gefundenen werden alle folgenden Zeichen in fbname aufgezeichnet und beim Vierten gefundenen wird die Aufzeichnung beendet. Wird nun das erste " gefunden, steht an der Stelle in centry[i] "". Wird nun an der Stelle # versucht den Inhalt von centry[i] in fbnum[i] zu schreiben, tritt dieser Fehler auf: Object reference not set to an instance of an object. Verwende ich einen einfachen String^, dann wird das entsprechende Zeichen auch richtig gespeichert. Ich vermute das Problem irgendwie in den Array-Typen...
Du hättest in der Betreffzeile noch darauf hinweisen können, daß das weder C noch C++, sondern "Managed C++" (eigentlich "mangled c++"), die Dot.Net-MS-verquarkung von C++ ist. Übrigens bietet dieses Forum Syntaxhighlighting an, dazu muss der betreffende Abschnitt nur in [ c ] und [ / c ] eingeschlossen werden (ohne Leerzeichen).
1 | String^ signtmp = "\""; |
2 | array<String^>^ fbnum; |
3 | array<String^>^ fbname; |
4 | array<String^>^ fbtemp; |
5 | char divide; |
6 | StreamReader^ temp = File::OpenText(pfadname); // zeile wäre sonst zu lang |
7 | String^ entry; |
8 | |
9 | entry = temp->ReadToEnd(); |
10 | |
11 | int write = 0; |
12 | |
13 | array<Char>^ centry = entry->ToCharArray(0, entry->Length); |
14 | |
15 | for (int i = 0; i < entry->Length; i++) |
16 | {
|
17 | char entrtmp = centry[i]; |
18 | |
19 | if (Convert::ToString(centry[i])->Contains(signtmp)) |
20 | {
|
21 | if (write == 4) |
22 | write = 1; |
23 | else
|
24 | write++; |
25 | |
26 | if (write == 1) |
27 | fbnum[i] = Convert::ToString(centry[i]); // <-- # |
28 | else if(write == 3) |
29 | fbname[i] = Convert::ToString(entrtmp); |
30 | }
|
31 | else
|
32 | if (write == 1) |
33 | fbnum[i] = Convert::ToString(entrtmp); |
34 | else if (write == 3) |
35 | fbname[i] = Convert::ToString(entrtmp); |
36 | }
|
Könnte das von Dir geschilderte Problem daran liegen, daß Du fbnum "lückig" beschreibst? Du schreibst ja nur nach fbnum, wenn "write" eins ist, verwendest aber dennoch denselben Index. Also könnte es sein, daß Du fbnum[1] beschreibst und danach versuchst, fbnum[4] zu beschreiben (indices sind rein willkürlich). Unterstützt denn "mangled c++" so etwas wie Arrays mit Lücken?
Die Idee hatte ich eben auch und habe einen separaten index dafür eingesetzt. Das Problem ist geblieben.
Mal untersucht, ob das Problem rechts oder links vom Zuweisungsoperator liegt? Funktioniert Convert::ToString(centry[i]) an der betreffenden Stelle?
ja das funktioniert. Verwende ich statt fbnum[i] einen gewöhnlichen String, wird der Inhalt richtig zugewiesen. centry = "1001,"0151... Beim ersten (also hier dem zweiten) " tritt das Problem auf, eben dann wenn geschrieben werden soll. Gebe ich statt fbnum[i] fbnum[i++] an (also auf die 0 verweisend), dann übergeht er die 0 und nimmt die 1, aber auch dann bleibt das Problem bestehen.
Tja, da muss ich Dich hilflos zurücklassen, denn mit "mangled c++" kenne ich mich nicht weiter aus. Mir erscheint es nicht sinnvoll, in einer for-Schleife mit Index i den Index an anderer Stelle zu ändern ... aber das wird nicht Dein Problem sein. Du könntest ja mal versuchen, die nicht funktionierende Zuweisung zu isolieren, also den ganzen restlichen Krempel drumherum wegzulassen.
1 | array<String^>^ fbnum; |
2 | |
3 | fbnum[1] = ConvertToString('a'); |
4 | |
5 | fbnum[10] = ConvertToString('b'); |
Das funktioniert?
Nein, funktioniert nicht. Ich glaube ich bereite die Daten für das array<String^>^ noch nicht richtig auf. Aber vielen Dank für die Mühe.
Also, nochmal langsam: Bereits mein "dreizeiler" funktioniert nicht? Dann sind, wie ich vermutet habe, "lückige" Arrays in "mangled c++" wohl wirklich nicht vorgesehen. Naja, wie dem auch sei, viel Erfolg!
Ich hab ja versucht das Array von Anfang an zu füllen. Es liegt wohl an der Art und Weise wie ich dort Daten speichern will. Denn fbnum[i] = "jkhg"; funktioniert auch nicht.
Nun, Du musst für jeden Zugriff auf das Array fbnum einen eigenen Index verwenden und den entsprechend hochzählen:
1 | String^ signtmp = "\""; |
2 | array<String^>^ fbnum; |
3 | array<String^>^ fbname; |
4 | array<String^>^ fbtemp; |
5 | char divide; |
6 | StreamReader^ temp = File::OpenText(pfadname); // zeile wäre sonst zu lang |
7 | String^ entry; |
8 | |
9 | entry = temp->ReadToEnd(); |
10 | |
11 | int write = 0; |
12 | int index = 0; |
13 | |
14 | array<Char>^ centry = entry->ToCharArray(0, entry->Length); |
15 | |
16 | for (int i = 0; i < entry->Length; i++) |
17 | {
|
18 | char entrtmp = centry[i]; |
19 | |
20 | if (Convert::ToString(centry[i])->Contains(signtmp)) |
21 | {
|
22 | if (write == 4) |
23 | write = 1; |
24 | else
|
25 | write++; |
26 | |
27 | if (write == 1) |
28 | fbnum[index++] = Convert::ToString(centry[i]); |
29 | else if(write == 3) |
30 | fbname[i] = Convert::ToString(entrtmp); |
31 | }
|
32 | else
|
33 | if (write == 1) |
34 | fbnum[index++] = Convert::ToString(entrtmp); |
35 | else if (write == 3) |
36 | fbname[i] = Convert::ToString(entrtmp); |
37 | }
|
Da frag ich mich, was denn an std::vector und push_back() so Abstossendes ist, dass man diesen managed Quatsch braucht. Duck und wech
Daß ich diesen Kram nicht gutheiße, müsste an meiner Formulierung "mangled C++" zu erkennen sein ...
Wenn's bei Managed C++ bleiben soll (mein Rat: falls NetFramework entweder C#, F# oder was auch immer, aber niemals C++):
1 | // erzeugt noch kein Array, sondern nur eine Null-Referenz
|
2 | array<String^>^ fbnum; |
3 | |
4 | // erzeugt das Array (ohne die Strings zu erzeugen)
|
5 | array<String^>^ fbnum = gcnew array<String^>(20); |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.