Forum: PC-Programmierung C#: char array size im Laufzeit setzen


von Sven (Gast)


Lesenswert?

Guten Tag,
Ich schreibe ein C# Tool welches gespeicherte Messdaten in txt-Format 
einließt und diese weiter verarbeitet und oder Graphisch darstellt.
Eine Zeile enthält verschiedene  Daten  mit unterschiedlicher 
Digit-Länge
ZB:   00001;  032145,0232;  23456;  05,014;  23,0312154;  2351458654; 
...
         00002;  033155,0232;  22356;  05,564;  23,0892154;  9074348654; 
...

Hier meine Logik:
1.) Ich hole mir eine vollständige Zeile,
2.) Packe die "Zeichen" in einem Char array bis ich ";" treffe = 1.Werte
     ...  Ich wiederhole 2.) und bilde so einzelnen Werte bis diese 
Zeile zu end ist.
3.) Nun komvertiere ich die Werte (Char array) zu einen String
4.) Dann konvertiere ich den String zo double oder Long je nachdem 
welche Werte in der Zeile

Hier mein Problem:
Um die Zeichen im Char array zu schieben habe ich vorher eine char[]=new 
char[11] definiert.
 Ich habe also zum Begin ['0','0','0','0','0','0','0','0','0','0'].
Wenn die Zeichen eingeschoben sind ZB die erste (00001) dann sehe ich 
['0','0','0','0','1','0','0','0','0','0'].
Wird diese im String konvertiert dann bekomme ich "0000100000"
Wird diese zu long oder int konvertiert bekomme ich (100000)
und ich erwarte eine (1) als wert.

nun möchte ich die char array size erst in der Loop setzen sodass keine 
leere Stellen mit "0" mehr entstehen, da bekomme ich die Fehlermeldung: 
"Use of unassigned local variable 'chartVariable'" und zwar erst  genau 
an der Stelle wo ich die char array zu string konvertieren möchte

Wie kann ich die char array size  on the fly  bilden

Hier einen Auszug:


char[] onedoublechar;

for (filelineidx = 0; filelineidx < filelinesize-1; filelineidx++)
  {
    // Get one line and remove any whitespace out of string
    lines[filelineidx] = Regex.Replace(lines[filelineidx], @"\s", "");

    // convert and distribute the new line into char array
    onelinechar = lines[filelineidx].ToCharArray();

    for (lineidx = 0; lineidx < 9; lineidx++)
      {
         onedoublecharidx = 0;
         while (onelinechar[onelinecharidx] != ';')
           {
             onedoublechar = new char[a+1];

        // build a single value char array
             onedoublechar[onedoublecharidx] = 
onelinechar[onelinecharidx];

             // Index showing the character in the line character read
             onelinecharidx++;



          // Index showing the character in the single value char
            onedoublecharidx++; 
.           }

         // Increase the index once to jump over (;) in the line
            onelinecharidx++;

          // Convert the single value of char into one single string
            onedoublestring = new string(onedoublechar);


         // Put the single string into data buffer of one dimmension 
array that contain            .         the singles values of one line
            doublearraystring[lineidx] = onedoublestring; 
}

         // reset the index showing the character in the line character 
read
          onelinecharidx = 0;

von Peter II (Gast)


Lesenswert?

ich habe mir dein quelltext nicht weiter durchgelesen, weil es irgendwie 
viel einfacher geht.

string s = "00001;  032145,0232;  23456; 05,014; 23,0312154; 
2351458654;";

list<float> zahlen = new list<float>();
s = s.replace(" ", "" );
foreach( string ss in s.Split(";" ) {
   float f = float.Parse( ss );
   list.add( f );
}

jetzt hast du alles in der liste "zahlen"  drin.

von Sven (Gast)


Lesenswert?

Danke für die Schnelle Antwort.
Ich habe Ihre Beispiel probiert und bekomme folgende Meldung

Error  1  The type or namespace name 'list' could not be found (are you 
missing a using directive or an assembly reference?)
Error  3  The name 'list' does not exist in the current context

können SIe mir bitte sagen welche Using benötigt wird für diese Struktur
Hier sind meine Using:

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

von nocheinGast (Gast)


Lesenswert?

> using System.Collections.Generic;
ist richtig. Die Klasse heißt aber "List", also mit großem L.

von Peter II (Gast)


Lesenswert?

schreib mal List gross - hatte es nicht getestet.

sollte hier eigentlich drin sein:

using System.Collections.Generic;

von nocheinGast (Gast)


Lesenswert?

-.-
>    list.add( f );
Das ist ich auch falsch und muss "zahlen.Add(f);" heißen.

von Sven (Gast)


Angehängte Dateien:

Lesenswert?

Danke viel mals.
ich kann mir so eine Menge sparen.

nun aber eine Anfängerfrage:

Erstens: Der Float ist gibt mir nur ein single pracision statt die 
gesamte Nachkommerstelle.
zweitens: (,) wird nicht als Kommerstelle erkannt, ich nehme an (.)

Meine Original Messdaten sind aber mit (,) als Nachkommerstelle

wie kann ich ihm das beibringen

hier ein Debug Screenshot

von Peter II (Gast)


Lesenswert?

Sven schrieb:
> Meine Original Messdaten sind aber mit (,) als Nachkommerstelle
> wie kann ich ihm das beibringen

s = s.Replace(",", ".");


> hier ein Debug Screenshot
hier mal wieder ein hinweis auf Bildformate. Screenshots solte man als 
PNG speichern, dann sind sie kleiner und besser lesbar.

von Sven (Gast)


Lesenswert?

Entschuldige für das Bild-Format.

Es hat wundaber geklappt.
Noch mal danke viel mals und Euch allen einen schönen
amüsanten Weekend Abend

gruss
sven

von Karl H. (kbuchegg)


Lesenswert?

Sven schrieb:
> Danke viel mals.
> ich kann mir so eine Menge sparen.

Du könntest dir noch viel mehr sparen, wenn du in Erwägung ziehen 
würdest, dir in der nächsten Buchhandlung ein C# Buch zu kaufen.

von Paul H. (powl)


Lesenswert?


von Sven (Gast)


Lesenswert?

Guten Tag
For 1Woche hatte ich hier Hifle gesucht und gefunden.
Meine Applikation hatte ich auch zur End geschrieben und sie lieft wie 
ich mir sie vorgestellt habe.
Nun sollten die Kollegen aus China und Brasil die gleiche App für 
unseren Auswertungen verwenden und wir stellen fest dass die float 
Werten bei ihnen mit (,) dargestellt werden müssen.
Ausserden habe ich festgestellt, dass auch manchen Stationen bei uns die 
float Werten mit (,) und andren mit (.) dargestellen.
     englisch: 123.456
     deutsch:  123,456
Ich habe für die betroffenen Stationen und die Kollegen eigenen exe 
erstellt und die [string.Replace(".", ",");] benutzt um Zeit zu sparen.
Nun suche ich eine Universalle Lösung.
Die Erfassung der Raw-Werten via LabView ist bei allen gleich: mit (,).

Wie kann ich Windows erzwingen nur eine der beiden erwähnten 
Darstellungen zu verwnden ohne die Replace-Func zu verwenden.

PS. Habe bereits ein Anfängerbuch von Helmut Erlenkötter zugelegt, die 
Zeit ist jedoch zimlich knappt bei mir.

Für eine Hilfestellung bin ich Euch sehr dankbar
gruss
sven

von Arc N. (arc)


Lesenswert?

Sven schrieb:
> Wie kann ich Windows erzwingen nur eine der beiden erwähnten
> Darstellungen zu verwnden

Wenn's unbedingt sein muss:
Regions- und Sprachoptionen -> Formate -> Anpassen -> 
Dezimaltrennzeichen
und Zifferngruppierung

> ohne die Replace-Func zu verwenden.

Sinnvoller ist es das Parsen universell zu machen.
D.h. alles beachten/filtern was z.B. hier
http://en.wikipedia.org/wiki/Decimal_mark
aufgeführt ist und dann umwandeln (bzw. mit CultureInfo.InvariantCulture 
umwandeln lassen).

> PS. Habe bereits ein Anfängerbuch von Helmut Erlenkötter zugelegt, die
> Zeit ist jedoch zimlich knappt bei mir.
>
> Für eine Hilfestellung bin ich Euch sehr dankbar
> gruss
> sven

von Sven (Gast)


Lesenswert?

...Und schon habe ich wieder was dazugelern.
Danke viel mals
gruss
sven

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.