Forum: PC-Programmierung Strings, Chars und "...


von Thomas (Gast)


Lesenswert?

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...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von Thomas (Gast)


Lesenswert?

Die Idee hatte ich eben auch und habe einen separaten index dafür 
eingesetzt. Das Problem ist geblieben.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Mal untersucht, ob das Problem rechts oder links vom Zuweisungsoperator 
liegt?

Funktioniert

  Convert::ToString(centry[i])

an der betreffenden Stelle?

von Thomas (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von Thomas (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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!

von Thomas (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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
  }

  

von Karl H. (kbuchegg)


Lesenswert?

Da frag ich mich, was denn an std::vector und push_back()
so Abstossendes ist, dass man diesen managed Quatsch braucht.

Duck und wech

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Daß ich diesen Kram nicht gutheiße, müsste an meiner Formulierung 
"mangled C++" zu erkennen sein ...

von Arc N. (arc)


Lesenswert?

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
Noch kein Account? Hier anmelden.