mikrocontroller.net

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


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).
String^ signtmp = "\"";
array<String^>^ fbnum;
array<String^>^ fbname;
array<String^>^ fbtemp;
char divide;
StreamReader^ temp = File::OpenText(pfadname); // zeile wäre sonst zu lang
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);
  }


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?

Autor: Thomas (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal untersucht, ob das Problem rechts oder links vom Zuweisungsoperator 
liegt?

Funktioniert

  Convert::ToString(centry[i])

an der betreffenden Stelle?

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

array<String^>^ fbnum;

fbnum[1] = ConvertToString('a');

fbnum[10] = ConvertToString('b');

Das funktioniert?

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun, Du musst für jeden Zugriff auf das Array fbnum einen eigenen 
Index verwenden und den entsprechend hochzählen:


String^ signtmp = "\"";
array<String^>^ fbnum;
array<String^>^ fbname;
array<String^>^ fbtemp;
char divide;
StreamReader^ temp = File::OpenText(pfadname); // zeile wäre sonst zu lang
String^ entry;

entry = temp->ReadToEnd();

int write = 0;
int index = 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[index++] = Convert::ToString(centry[i]); 
        else if(write == 3)
          fbname[i] = Convert::ToString(entrtmp);
      }
    else
      if (write == 1)
        fbnum[index++] = Convert::ToString(entrtmp);
      else if (write == 3)
        fbname[i] = Convert::ToString(entrtmp);
  }

  

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn's bei Managed C++ bleiben soll (mein Rat: falls NetFramework 
entweder C#, F# oder was auch immer, aber niemals C++):
// erzeugt noch kein Array, sondern nur eine Null-Referenz
array<String^>^ fbnum; 

// erzeugt das Array (ohne die Strings zu erzeugen)
array<String^>^ fbnum = gcnew array<String^>(20);

  

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.